2

withSQLを使用してテーブルを更新したいと思います。ただし、次のエラーが発生し続けますPHPPDO

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

では、私のコードのどこに問題があるのでしょうか? どんな助けでも大歓迎です

4

1 に答える 1

1

確かに、SQL パラメータの番号は 1 から始まります (その回答の所有者が削除した理由はわかりません)。

パラメータの番号付けは、数字のゼロが発明される前の 1980 年代にさかのぼる SQL/CLI 標準で定義されています。;-)


コードが更新されない理由については、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());
}
于 2013-08-01T02:51:35.443 に答える