2013-08-01 63 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

为什么你会为此投票而投票?它不仅可以工作,而且可以解决唯一的其他答案。 –