使用PDO更新包含多个数组的SQL表

时间:2013-08-01 02:35:00

标签: php pdo

我想使用SQL使用PHP更新PDO表。但是我一直收到以下错误

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

我无法理解我哪里出错了。

    $j = 1;
    $chunk_count = count($update)/7;
    $backwards = array_reverse($update);
    $chunks = array_chunk($backwards, 7);

    var_dump($chunks[1]);       

    try {
        for($i = 0; $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());
    }

如果我var_dump($chunks[1]),我会看到以下值

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" }    

那么我的代码中的问题在哪里?任何帮助表示赞赏

1 个答案:

答案 0 :(得分:1)

确实,SQL参数从1开始编号(我不知道为什么该答案的所有者删除了它)。

参数编号在SQL / CLI标准中定义,该标准可以追溯到20世纪80年代,在数字零发明之前。 ; - )


至于为什么你的代码没有更新,我希望确保id值定位在你期望的位置。在反转和分块数组之后,如果id值没有在正确的位置结束,它可能会尝试更新行,但是没有匹配。

以下是编写此例程的另一种方法:

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

var_dump($chunks[1]);       

try {
    $update_project = $db->prepare('
        UPDATE projects
        SET comments = ?,
            contact = ?,
            est_end = ?,
            est_start = ?,  
            apm = ?,  
            pm = ?                              
        WHERE id = ?
    ');
    $n = 0;
    foreach ($chunks as $chunk) {
        $update_project->execute($chunk);
        $n += $update_project->rowCount();
    }   

    echo 'Projects Updated, affected $n rows';        

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