複数挿入クエリを実行しようとすると、「SQLSTATE[HY093]: 無効なパラメータ」のようなエラーが発生する場合があります。番号: パラメータが定義されていませんでした。」このエラーは、クエリ内のプレースホルダー値 (?) の数が、渡されるパラメーターの数と一致しない場合に発生します。
次のコード例を考えてみましょう。
// BUILD VALUES $count = count($matches); for($i = 0; $i < $count; ++$i) { $values[] = '(?)'; } // INSERT INTO DATABASE $q = $this->dbc->prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash"); $q->execute($matches);
このシナリオではの場合、execute が呼び出される直前に count($matches) が count($values) と等しいため、戸惑うかもしれません。ただし、エラーは引き続き発生します。
根本的な問題:
$values がプレースホルダー値を設定する前に既存の値で初期化されるときに、根本的な問題が発生します。その結果、カウントの不一致が発生します。
解決策:
このエラーを解決するには、ループ内に値を設定する前に $values の空の配列を初期化するようにしてください。これにより、プレースホルダー値の数が、挿入されるデータ ポイントの数と一致することが保証されます。
追加の考慮事項:
改訂されたコード例:
$matches = array('1'); $count = count($matches); $values = []; for($i = 0; $i < $count; ++$i) { $values[] = '(?)'; } // INSERT INTO DATABASE $sql = "INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash=values(hash)"; $stmt = $dbh->prepare($sql); $data = $stmt->execute($matches);
以上が複数の挿入クエリが「SQLSTATE[HY093]: 無効なパラメータ番号」で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。