2012-07-16 74 views
0

希望有人可以指出我在這個正確的方向,因爲我無法得到這個工作。 這是發生了什麼: 我的客戶端上傳一個(Rightmove).blm文件到服務器,腳本解壓zip文件並使用解析器獲取屬性到一個數組..從這裏我能夠INSERT到數據庫中沒有問題然而,我需要這個更新數據庫中的信息,如果存在,否則插入blm文件可能包含新屬性或現有的編輯。 blm文件只包含屬性信息,沒有id等,所以一旦插入數據庫我給它一個id(propid)通過自動incriment手段。插入到其他更新從陣列

請查看下面的代碼,希望你可以有,我可以用它來得到這個做什麼,我需要做的:)

foreach ($rmdata as $key => $properties) {  

$fields = array(); 
$values = array(); 

foreach ($rmdata[$key] as $field=>$value) { 
if (!isset($value)) {  

} 

if (isset($value)) { 

$sql_props = mysql_query("SELECT propid FROM epsales"); 
while($row = mysql_fetch_array($sql_props)){ 
    $propid = $row["propid"]; 
} 

$fields[] = $field; 
$values[] = "'".$value."'"; 

$array1 = array($field); 
$array2 = array($value); 

$sqlupdate = array_combine($array1, $array2); 

foreach ($sqlupdate as $field=>$value) { 
     $sql_update = "$field='$value', "; 
} 
} 
} 

$sql_fields = implode(', ', $fields); 
$sql_values = implode(', ', $values); 


$sqlPropInsert = mysql_query('INSERT INTO epsales ('. $sql_fields .') VALUES ('. $sql_values .') ON DUPLICATE KEY UPDATE SET '. $sql_update .''); 

謝謝您的時間它大大appriciated的建議!

回答

1

幾個注意事項:

  1. foreach ($rmdata[$key] as $field=>$value)在這方面同foreach ($properties as $field=>$value)
  2. 可以通過帶if(!$value) continue;
  3. 當您選擇了PROPID,你是一個循環來避免整個if(isset($value))事在表格中選擇每行,當然這不是你打算做的事情,因爲你循環遍歷它們,只有每一行都使用最後一個。
  4. 構建更新部分的部分在幾個方面存在缺陷。最簡單的解決方法是通過在循環之後重新組合$ fields和$ values數組來實現正確的結果(如後所示)
  5. 我不知道哪裏會出現鍵衝突,除非$ rmdata將包含一個propid,如果它是一個更新,而不是一個插入,否則如果還有其他一些關鍵,並且只是在代碼中沒有明確地看到它的情況下處理,那很好。

下面是我直接從你的複製,只是修改,以解決這些問題代碼:

foreach ($rmdata as $properties) {  
    $fields = array(); 
    $values = array(); 
    $updates = array(); 
    foreach ($properties as $field=>$value) { 
    if (!$value) continue; 
    $fields[] = $field; 
    $values[] = "'".$value."'"; 
    $updates[] = $field . '="'.$value.'"'; 
    }  
    $sql_fields = implode(', ', $fields); 
    $sql_values = implode(', ', $values); 
    $sql_updates = implode(', ', $updates); 
    $sqlPropInsert = mysql_query('INSERT INTO epsales ('. $sql_fields .') VALUES ('. $sql_values .') ON DUPLICATE KEY UPDATE SET '. $sql_updates .''); 
} 

,這種技術需要東西數據有以衝突的關鍵讓ON DUPLICATE KEY觸發。如果數據數組中有一些值可以唯一標識這些行,則該字段應該是數據庫中的唯一鍵,這將導致此衝突發生得相當好。

+0

嗨,謝謝你的回覆..有一個小遊戲,它不工作,但我會更深入地研究它升技,讓你知道,非常感謝您的時間謝謝!孩子們整理,然後我會回來:) – Steve 2012-07-16 06:49:49

+0

插入你的代碼,我已經玩了一切,仍然沒有喜悅:(不知道如果theres我錯過了,我不知道爲什麼這個贏't work .. – Steve 2012-07-16 09:06:00

+0

如果不知道更多關於'$ rmdata'和你的數據庫模式的性質,很難說,你是否迴應了這些查詢,看看它們是否是你期望的?它以什麼方式不是工作(甚至不編譯/插入和從不更新/等)? – 2012-07-16 13:24:19