2

所以我对这个问题很困惑。我正在向这个PHP文件发送一个帖子,AJAX它使用我的数组,反转它,分块,然后用它来绑定值。每个块都包含一行要更新的信息,因此 for 循环的每次迭代都会更新一行。

我第一次尝试这个时,我使用了以下代码。

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 是参数 binder 的持有者,它应该从 1 开始。

一些额外的信息。如果我 var_dump(chunks[0]) 和 var_dump(chunks[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我插入一行就结束了。有人可以告诉我这里发生了什么吗?任何帮助表示赞赏

4

2 回答 2

2

您的代码存在多个问题。但主要问题是您尝试将数组拆分为块的方式。假设您的数组中有 10 个项目,给定您的代码$chunk_count = count($update)/7;,这将使我们的块计数为 1.4285...,大于 1,但小于 2。然后在您的循环中,我希望它只运行一次,如果$i = 1;因为第一次通过循环,1 < 1.x,但第二次 2 > 1.x。

你想通过分解这个数组来完成什么?直接处理就行了。记住尽可能保持简单。

于 2013-08-01T04:06:01.117 回答
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());
}

这个答案的功劳归于比尔·卡尔文(Bill Karwin)

于 2013-08-01T14:35:48.753 回答