2013-08-01 100 views
1

所以我很困惑這個問題。我使用AJAX發送了一個帖子到PHP文件,並且它使用我的數組,將它反轉,將它塊化,然後使用它來綁定值。每個塊都有一行值得更新的信息,因此for循環的每次迭代都會更新一行。PDO更新只更新一行

我第一次嘗試這個,我用下面的代碼。

if(isset($_POST['saveEdits'])) { 
    $i = 0; 
    $j = 1; 
    $update = array();   
    $update = $_POST['saveEdits']; 
    $chunk_count = count($update)/7;  
    $backwards = array_reverse($update); 
    $chunks = array_chunk($backwards, 7);    

    try { 
     for($i; $i < $chunk_count; $i++) { 
      $update_project = $db->prepare(' 
       UPDATE projects 
       SET comments = ?, 
        contact = ?, 
        est_end = ?, 
        est_start = ?, 
        apm = ?, 
        pm = ?        
       WHERE id = ? 
      '); 

      foreach ($chunks[$i] as $field => $val) {       
       $update_project->bindValue($j++, $val, PDO::PARAM_STR);         
      }   
      $update_project->execute(); 

     } 

     echo 'Projects Updated';   

    } catch(PDOException $e) { 
     die($e->getMessage()); 
    } 
} else {  
    echo 'could not update projects table'; 
} 

,我會收到以下錯誤每個

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\core\functions\update_projects.php on line 31 

因此有人提出時,我改變

$i = 0; 

$i = 1; 

這莫名其妙的作品。這讓我插入數據一次,但不插入所有的數據。事實上,這工作在所有是難以理解的。 $ i是我的循環索引和塊索引的持有者。它需要從0開始 - 不管。我不明白如何從1開始有任何幫助。 $ j是參數綁定的持有者,其中應該從開始於1.

一些附加信息。如果我的var_dump(塊[0])和後續代碼var_dump(塊[1]),我看到下面的

array(7) { [0]=> string(13) "more comments" [1]=> string(9) "jimmy doe" [2]=> string(6) "1-1-14" [3]=> string(7) "12-1-13" [4]=> string(9) "janey doe" [5]=> string(9) "jonny doe" [6]=> string(2) "17" } 
array(7) { [0]=> string(13) "some comments" [1]=> string(7) "jim doe" [2]=> string(6) "1-1-14" [3]=> string(7) "12-1-13" [4]=> string(8) "jane doe" [5]=> string(7) "jon doe" [6]=> string(2) "16" } 

所以審查。 $i = 0,我得到錯誤最多,$i = 1我得到插入一行,它結束了。有人能告訴我這裏發生了什麼事嗎?任何幫助表示讚賞

+0

可以粘貼完整的代碼? HTML? – Konsole

+1

我喜歡這個,我在回答我自己的問題後得到了一個沒有解釋的投票。 –

+0

參數未定義。你還需要什麼? –

回答

2

您的代碼有多個問題。但主要問題是你試圖將數組拆分爲塊的方式。假設你的數組中有10個項目,給定代碼$chunk_count = count($update)/7;,這會給我們一個塊數1.4285 ...,大於1但小於2.然後在你的循環中,我希望它只運行一次如果$i = 1;因爲第一次通過循環,1 < 1.x,但第二次2> 1.x.

你想通過分解這個數組來完成什麼?直接處理它。請儘可能保持簡單。

+0

這個數組將總是7的倍數。所以這就是爲什麼我除以7的結果。永遠不會有餘數。它將始終是一個整數。你可以在這個小提琴http://jsfiddle.net/NuLPC/8/看到這個過程。基本上我有一個可編輯的表,當用戶完成一個循環將所有數據存儲在一個數組中。然後我需要打破陣列,以便我可以綁定值。如果你有更好的解決方案,請讓我知道。我不認爲這很漂亮,它只是工作 –

+0

或它*應該*工作是我的意思 –

+0

再加上你的回答並不能解釋*爲什麼*它會插入價值一次而不是另一個開始循環在1而不是0,這是非常誠實的讓我困擾這個問題 –

1

保持簡單。這是對我有用的東西。這仍然讓我不知道原來的問題,但哦。

$backwards = array_reverse($update); 
$chunks = array_chunk($backwards, 7); 
$n = 0;   

try { 
    $update_project = $db->prepare(' 
     UPDATE projects 
     SET comments = ?, 
      contact = ?, 
      est_end = ?, 
      est_start = ?, 
      apm = ?, 
      pm = ?        
     WHERE id = ? 
    '); 

    foreach ($chunks as $chunk) { 
     $update_project->execute($chunk); 
     $n += $update_project->rowCount(); 
    } 

    echo 'Projects Updated, affected ' . $n . ' rows';   

} catch(PDOException $e) { 
    die($e->getMessage()); 
} 

感謝這個答案去比爾Karwin here

+0

爲什麼你會爲此投票而投票?它不僅可以工作,而且可以解決唯一的其他答案。 –