2014-04-12 71 views
0

我遇到了讓我完全難倒的這個問題。這是我的執行模式。 PDO調用嵌套在foreach循環中。Foreach循環中的PDO和MySQL更新

foreach(){ 
    foreach(){ 

    } 
} 

我使用PDO與MySQL,當我執行UPDATE查詢背靠背,他們互相干擾循環內。我知道他們從評論一套和執行另一套來單獨工作。下面是我處理的代碼模板:

$set_data1 = "UPDATE data_table 
       SET data_status = 'PROCESSED' 
       WHERE data_id = :data_id1"; 

$stmt = $db->prepare($set_data1); 

$stmt->bindParam(':data_id1', $data_array1['data_id'], PDO::PARAM_INT); 

$stmt->execute(); 

$set_data2 = "UPDATE data_table 
       SET data_status = 'PENDING' 
       WHERE data_id = :data_id2"; 

$stmt = $db->prepare($set_data2); 

$stmt->bindParam(':data_id2', $data_array2['data_id'], PDO::PARAM_INT); 

$stmt->execute(); 

出於某種原因,嵌套foreach循環中執行兩個查詢時,從$ set_data1數據是由$ set_data2抵消。我試過用$ stmt-> closeCursor()關閉遊標。我試過使用單個語句來準備,只是將新參數綁定到語句。我試過將$ stmt和$ db實例設置爲null,然後重新實例化它們無濟於事。我試過在查詢中使用CASE THEN和IF條件...什麼都沒有。任何有關問題的信息都會很棒。我不知道PDO在循環中的同一個表上調用UPDATES時是否有錯誤,因爲我從來沒有在其他地方遇到過這個問題。提前致謝!

+0

您不顯示代碼,其中$ data_array1和$ data_array2準備好了。是否有可能/兩者中的data_id是相同的? – RobP

+0

不,這些ID是完全不同的,因爲它們之前使用不同的參數進行檢索,然後存儲在不同的陣列中。 –

+0

你可以發佈它在foreach循環中的外觀嗎?我懷疑你沒有在正確的地方打電話給你。 – serakfalcon

回答

2

對於初學者,您正在使用bindParam()就像是bindValue(),他們是quite different

沒有看到你從哪裏得到你的數組值,它有點難以看清是怎麼回事。它看起來像你提供的信息可能不是你正在使用的代碼,並且已被修改,特別是關於foreach循環和data_array變量,因爲你所描述的是BindParam常見的問題,所以這就是假設I將繼續努力。如果是這種情況,通常提供實際的代碼片段是很好的做法,包括初始化所使用的變量和發現問題的塊,而不僅僅是那些塊中的代碼。

這裏的另一個答案with why,基本上確保您通過引用您的foreach循環的值部分或您將bindParams更改爲bindValues。如果您打算繼續使用此結構,則您還需要確保您在此處使用兩個單獨的對象,而不是一個,因爲每次撥打​​時都運行了bindParam()方法。

因此,像,說,是的代碼結構沒有變化(這也許應該是因爲這是所有在循環,只執行應該是在一個循環中):

$set_data1 = "UPDATE data_table 
      SET data_status = 'PROCESSED' 
      WHERE data_id = :data_id1"; 

$stmt = $db->prepare($set_data1); 

$stmt->bindValue(':data_id1', $data_array1['data_id'], PDO::PARAM_INT); 

$stmt->execute(); 

$set_data2 = "UPDATE data_table 
       SET data_status = 'PENDING' 
       WHERE data_id = :data_id2"; 

$stmt2 = $db->prepare($set_data2); 

$stmt2->bindValue(':data_id2', $data_array2['data_id'], PDO::PARAM_INT); 

$stmt2->execute(); 

一個更優化的方式來儘管會這樣(請記住這只是一個普遍的例子):

$set_data = "UPDATE data_table 
      SET data_status = :data_status 
      WHERE data_id = :data_id"; 

$data_array = array(array('data_status' => $dataStatus1, 'data_id' => $dataId), array('data_status' => $dataStatus2, 'data_id' => $dataId2)); 
/* this is just to represent a multidimensional array (or a multidimensional object) containing the data status and the data id which should be handled and decided before you pass them into a loop. */ 

$stmt = $db->prepare($set_data); 

$data_status = null; 
$data_id = null; 

$stmt->bindParam(:data_status, $data_status); 
$stmt->bindParam(:data_id, $data_id); 

foreach($data_array as $name => $val) { 
    $data_status = $val['data_status']; 
    $data_id = $val['data_id']; 
    $stmt->execute()'; 
} 
+0

感謝您的提示。我最終完全重寫了邏輯,而是使用bindValue來代替,並且所有內容都運行平穩和美觀。感謝大家的幫助。 :) –

-1

雖然這是非常分不清什麼是您所提供的草圖你真正的代碼,

下面是你在做一個簡單的例子:

$apples = 4; 
$apples = 18; 
echo $apples; 

多少蘋果它會它打印,爲什麼它會干擾最初的金額?

+0

雖然不同的數據集仍然存在問題。即使我準備一次並執行多次,數據仍然會相互干擾。我爲兩種執行方法綁定了不同的參數,並操作了不同的行。我將如何去解決這個問題? –

+0

你能告訴我,它會打印多少,爲什麼? –

+0

存儲在數據庫中的結果是,具有不同ID的兩個數據集將作爲「PENDING」進行處理,並完全寫入data_id1的data_status。 –