ホームページ >バックエンド開発 >PHPチュートリアル >複数の挿入クエリが「SQLSTATE[HY093]: 無効なパラメータ番号」で失敗するのはなぜですか?

複数の挿入クエリが「SQLSTATE[HY093]: 無効なパラメータ番号」で失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 02:09:13207ブラウズ

Why Does My Multiple Insert Query Fail with

「複数挿入クエリの準備中にエラーが発生しました」

複数挿入クエリを実行しようとすると、「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 の空の配列を初期化するようにしてください。これにより、プレースホルダー値の数が、挿入されるデータ ポイントの数と一致することが保証されます。

追加の考慮事項:

  • ハッシュ列に一意のインデックスがあることを確認してください。重複したエントリを防ぐため。
  • 準備と実行の代わりに準備済みステートメント ($stmt) を使用します。メソッド。

改訂されたコード例:

$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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。