Php PDO更新仅更新一行

Php PDO更新仅更新一行,php,pdo,Php,Pdo,所以我对这个问题很困惑。我正在使用AJAX向这个PHP文件发送一篇帖子,它接受我的数组,反转它,将它分块,然后使用它绑定值。每个块都保存一行要更新的信息,因此for循环的每次迭代都会更新一行 第一次尝试时,我使用了以下代码 if(isset($_POST['saveEdits'])) { $i = 0; $j = 1; $update = array(); $update = $_POST['saveEdits']; $chunk_c

所以我对这个问题很困惑。我正在使用
AJAX
向这个
PHP
文件发送一篇帖子,它接受我的数组,反转它,将它分块,然后使用它绑定值。每个块都保存一行要更新的信息,因此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';
}
所以有人建议我换衣服

$i = 0;

这不知怎的奏效了。这允许我一次插入数据,但不会插入所有数据。这一点对我来说很难理解$我是循环索引和块索引的持有者。它需要从0开始-无论什么。我不明白从1开始有什么帮助$j是param活页夹的夹持器,应从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
我插入一行就结束了。有人能告诉我这里发生了什么事吗?非常感谢您的帮助

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


通过分解此阵列,您试图实现什么目标?直接处理就行了。如果可能的话,记得保持简单。

保持简单。这是对我有用的东西。这仍然让我对最初的问题感到疑惑,但是哦,好吧

$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());
}

这个答案归功于比尔·卡温

这个数组总是7的倍数。这就是为什么我除以7。永远不会有余数。它将始终是一个整数。你可以在这把小提琴上看到这个过程。基本上我有一个可编辑的表,当用户完成时,一个循环将所有数据存储在一个数组中。然后我需要分解数组,以便绑定值。如果你有更好的解决方案,请告诉我。我不认为这是很好的,它只是工作,加上你的答案没有解释为什么它会插入值一次,而不是另一次,开始循环在1而不是0,这是非常诚实的困扰我这个问题+1我现在明白了。你可以从我的回答中看出这一点。为什么昨晚我从来并没有停下来思考如何粘贴完整的代码,这让我非常沮丧?html?我喜欢在回答我自己的问题后,我在没有任何解释的情况下获得否决票。参数没有定义。你还需要什么?你为什么要否决这个答案?它不仅能起作用,而且能实现唯一其他答案的建议。
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" }
$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());
}