2010-07-29 78 views
0

嘿大家即時新的這裏以及PHP只有在它約2個月有點學習,因爲我去。我現在需要完成的工作是從數據庫中的大約16個不同的表中獲取數據並複製這些表。該表適用於申請人,並且具有共同的應用程序標識或通用程序中的家庭標識,該標識只是生成的散列。我現在正在做的是單獨對每個表進行清理,然後使用這些數據進行插入,然後只更改應用程序標識和/或系列標識。有些表格非常大,我試圖找出一個更簡單快捷的方法來完成這個任務,這是一個例子,我寫了一張表格。大型MySQL查詢和插入

<? 
     //get family info based on application id 
$queryC="SELECT Fam_Type, Fam_Title, Fam_SSNI20, Fam_SSNI20_Select, Fam_Name_First, Fam_Name_Middle, Fam_Name_Last, Fam_Name_Suffix, Fam_Gender, Fam_DOB, Fam_Disabled, Fam_Addy1, Fam_Addy2, Fam_City, Fam_State_Prov, Fam_Zip, Fam_Country, Fam_Home_Phone, Fam_Work_Phone, Fam_Work_Phone_Ext, Fam_Cell_Phone, Fam_Occupation, Fam_Employer, Fam_Primary_Res, Fam_Custody, Fam_Guard_Excuse, Fam_ChiDep_Ans, Fam_ReaVeh_Ans, InstructDone, SetDone, AppDone, HouDone, DepDone, AssDone, ReaDone, IncDone, ExpDone, QueDone, ApplicationDone, StatusDone, Fam_Init, Fam_Start_Date, Fam_End_Date, Fam_Agree, username, password, email, Fam_Letter, Exp_Educational, Fam_Tax, Scan_FileNames, Scan_Descriptions, Fam_Complete, referral, Fam_Holds, appealed, Appeal_Letter, Appeal_Viewed, taxDocuments   
    FROM familY 
    WHERE familyID='$famid' AND applicationID='$appid'"; 
    $resultC = mysql_db_query($aidDB, $queryC, $connection); echo $queryC; 
    while($rC=mysql_fetch_array($resultC)){ 
     $Fam_Type="$rC['0']"; 
     $Fam_Title="$rC['1']"; 
     $Fam_SSNI20="$rC['2']"; 
     $Fam_SSNI20_Select="$rC['3']"; 
     $Fam_Name_First="$rC['4']"; 
     $Fam_Name_Middle="$rC['5']"; 
     $Fam_Name_Last="$rC['6']"; 
     $Fam_Name_Suffix ="$rC['7']"; 
     $Fam_Gender="$rC['8']"; 
     $Fam_DOB="$rC['9']"; 
     $Fam_Disabled="$rC['10']"; 
     $Fam_Addy1 ="$rC['11']"; 
     $Fam_Addy2 ="$rC['12']"; 
     $Fam_City="$rC['13']"; 
     $Fam_State_Prov="$rC['14']"; 
     $Fam_Zip="$rC['15']"; 
     $Fam_Country="$rC['16']"; 
     $Fam_Home_Phone ="$rC['17']"; 
     $Fam_Work_Phone ="$rC['18']"; 
     $Fam_Work_Phone_Ext="$rC['19']"; 
     $Fam_Cell_Phone ="$rC['20']"; 
     $Fam_Occupation ="$rC['21']"; 
     $Fam_Employer="$rC['22']"; 
     $Fam_Primary_Res ="$rC['23']"; 
     $Fam_Custody="$rC['24']"; 
     $Fam_Guard_Excuse ="$rC['25']"; 
     $Fam_ChiDep_Ans ="$rC['26']"; 
     $Fam_ReaVeh_Ans="$rC['27']"; 
     $InstructDone ="$rC['28']"; 
     $SetDone ="$rC['29']"; 
     $AppDone ="$rC['30']"; 
     $HouDone ="$rC['31']"; 
     $DepDone ="$rC['32']"; 
     $AssDone="$rC['33']"; 
     $ReaDone ="$rC['34']"; 
     $IncDone ="$rC['35']"; 
     $ExpDone ="$rC['36']"; 
     $QueDone="$rC['37']"; 
     $ApplicationDone ="$rC['38']"; 
     $StatusDone ="$rC['39']"; 
     $Fam_Init="$rC['40']"; 
     $Fam_Start_Date ="$rC['41']"; 
     $Fam_End_Date ="$rC['42']"; 
     $Fam_Agree ="$rC['43']"; 
     $username ="$rC['44']"; 
     $password ="$rC['45']"; 
     $email ="$rC['46']"; 
     $Fam_Letter="$rC['47']"; 
     $Exp_Educational ="$rC['48']"; 
     $Fam_Tax ="$rC['49']"; 
     $Scan_FileNames="$rC['50']"; 
     $Scan_Descriptions ="$rC['51']"; 
     $Fam_Complete ="$rC['52']"; 
     $referral="$rC[''53]"; 
     $Fam_Holds="$rC['54']"; 
     $appealed="$rC['55']"; 
     $Appeal_Letter="$rC['56']"; 
     $Appeal_Viewed="$rC['57']"; 
     $taxDocuments="$rC['58']"; 
//insert into family with new applicationid 
$queryC2="INSERT INTO family (familyID, applicationID, Fam_Type, Fam_Title, Fam_SSNI20, Fam_SSNI20_Select, Fam_Name_First, Fam_Name_Middle, Fam_Name_Last, Fam_Name_Suffix, Fam_Gender, Fam_DOB, Fam_Disabled, Fam_Addy1, Fam_Addy2, Fam_City, Fam_State_Prov, Fam_Zip, Fam_Country, Fam_Home_Phone, Fam_Work_Phone, Fam_Work_Phone_Ext, Fam_Cell_Phone, Fam_Occupation, Fam_Employer, Fam_Primary_Res, Fam_Custody, Fam_Guard_Excuse, Fam_ChiDep_Ans, Fam_ReaVeh_Ans, InstructDone, SetDone, AppDone, HouDone, DepDone, AssDone, ReaDone, IncDone, ExpDone, QueDone, ApplicationDone, StatusDone, Fam_Init, Fam_Start_Date, Fam_End_Date, Fam_Agree, username, password, email, Fam_Letter, Exp_Educational, Fam_Tax, Scan_FileNames, Scan_Descriptions, Fam_Complete, referral, Fam_Holds, appealed, Appeal_Letter, Appeal_Viewed, taxDocuments ) 
    VALUES 
    (
    '$newfam1id,'   
    '$newappid,' 
    '$Fam_Type,' 
    '$Fam_Title,' 
    '$Fam_SSNI20,' 
    '$Fam_SSNI20_Select,' 
    '$Fam_Name_First,' 
    '$Fam_Name_Middle, ' 
    '$Fam_Name_Last,' 
    '$Fam_Name_Suffix,' 
    '$Fam_Gender,' 
    '$Fam_DOB,' 
    '$Fam_Disabled,' 
    '$am_Addy1,' 
    '$Fam_Addy2,' 
    '$Fam_City,' 
    '$Fam_State_Prov,' 
    '$Fam_Zip,' 
    '$Fam_Country,' 
    '$Fam_Home_Phone,' 
    '$Fam_Work_Phone, ' 
    '$Fam_Work_Phone_Ext,' 
    '$Fam_Cell_Phone,' 
    '$Fam_Occupation,' 
    '$Fam_Employer,' 
    '$Primary_Res,' 
    '$Fam_Custody,' 
    '$Fam_Guard_Excuse,' 
    '$Fam_ChiDep_Ans,' 
    '$Fam_ReaVeh_Ans,' 
    '$InstructDone,' 
    '$SetDone,' 
    '$AppDone,' 
    '$HouDone,' 
    '$DepDone,' 
    '$AssDone,' 
    '$ReaDone,' 
    '$IncDone,' 
    '$ExpDone,' 
    '$QueDone,' 
    '$ApplicationDone,' 
    '$StatusDone,' 
    '$Fam_Init,' 
    '$Fam_Start_Date,' 
    '$Fam_End_Date,' 
    '$Fam_Agree,' 
    '$username,' 
    '$password,' 
    '$email,' 
    '$Fam_Letter,' 
    '$Exp_Educational,' 
    '$Fam_Tax,' 
    '$Scan_FileNames,' 
    '$Scan_Descriptions,' 
    '$Fam_Complete,' 
    '$referral,' 
    '$Fam_Holds,' 
    '$appealed,' 
    '$Appeal_Letter,' 
    '$Appeal_Viewed,' 
    '$taxDocuments' 
    )"; echo $queryC2; 

    } 



?> 
+0

我假設你正在使用MySQL,如果不是,只是恢復我的更改。 – 2010-07-29 13:29:56

回答

0

您可以通過使用mysql_fetch_assoc()代替陣列減少的PHP代碼對事物的選擇端的數量,特別是因爲你然後就重新分配返回的數組塊獨立的變量:

$query = "SELECT Fam_Type, Fam_Title, Fam_SSNI20, Fam_SSNI20_Select etc... etc..."; 
$resultC = mysql_db_query($aidDB, $queryC, $connection); echo $queryC; 
while($rC = mysql_fetch_assoc($resultC)) { 
    ... 
} 

在這點你結束了相關的陣列,你可以在個人價值得到如下:

echo "Fam_Type is " . $rc['Fam_Type']; 
echo "Fam_Title is " . $rc['Fam_Title']; 

從而節省您的巨型變量賦值的斑點。當然,如果你的查詢中的任何一個字段在內部映射到同一個名字(比如你​​正在做一個連接並從兩個不同的表中檢索兩個不同的'id'字段),那麼你需要將它們別名以不同的名稱,使他們清楚地走出陣中,但是這是一個簡單的MOD到查詢:

SELECT table1.id AS table1_id, table2.id AS table2_id ... 

這將留給:

$result['table1_id'] = ... 

作爲一個邊節點,您應經常檢查,看看查詢是否成功。你盲目地認爲它工作並嘗試檢索數據。但是,如果查詢失敗,mysql函數將返回FALSE,這不會是有效的結果語句,並會中斷您的讀取嘗試。在最低限度,添加一些基本的錯誤檢查

$resultC = mysql_db_query(...) or die("MySQL error: " . mysql_error()); 

將吐出的錯誤消息,並解釋質詢失敗的原因,而不是再用「......是不是一個有效的語句句柄」後來失敗。另外,從PHP 5.3開始,mysql_db_query()已棄用,並且在未來的PHP版本中將會消失。可能需要改用常規的mysql_query()

+0

這是一個真棒郵政人感謝。 mysql_fetch基本上只是將我的變量賦給字段的名稱。有沒有一種方法可以在插入查詢中使用它? – 2010-07-29 13:56:16

+0

不幸的是,並不是真的。有數據庫抽象庫可以爲你做到這一點,以及動態構建查詢字符串的一些技巧,但沒有像這樣的自動化。 – 2010-07-31 02:35:22

2

你不需要循環中的所有行。
使用這樣的:

Insert into new_table select * from old_table where {your criteria here}

2

MySQL有INSERT into table (fields,list) SELECT fields,list FROM another_table語法

0

,你可以簡單地做:

INSERT INTO family (appliction_id, all_the_other_fields) 
SELECT 'your_new_app_id', all_the_other_fields 
FROM familY 
WHERE familyID='$famid' AND applicationID='$appid' 

讓我們期待您的$ famid和$的appid變量都逃了出來,好嗎?

+0

這基本上就是我在做什麼,只是讓它成爲一個正確的聲明?編號必須仍然爲每個表都做到這一點,是的,他們是逃脫 – 2010-07-29 13:45:38

+0

是的,你必須爲每個表做,但你節省自己很多的PHP代碼(沒有循環等)。此版本可能會更快,因爲沒有(表)數據發送之間的MySQL服務器和PHP服務器(只有查詢發送) – knittl 2010-07-29 14:12:41