ホームページ >データベース >mysql チュートリアル >複数のレコードを挿入すると、PDO プリペアド ステートメントが「SQLSTATE[HY093]: 無効なパラメータ番号」で失敗するのはなぜですか?

複数のレコードを挿入すると、PDO プリペアド ステートメントが「SQLSTATE[HY093]: 無効なパラメータ番号」で失敗するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-13 00:06:16419ブラウズ

Why Does My PDO Prepared Statement Fail with

複数レコード挿入時の SQL エラーのトラブルシューティング

最近の開発作業では、 PDO 準備済みステートメントでエラーが発生しました:

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

見かけは同等であるにもかかわらず挿入される値の数 (count($matches)) とプレースホルダーの数 (count($values)) において、クエリの実行に失敗しました。

根本原因

このエラーは、$values 配列の初期化に関する誤解から発生しました。最初に空の配列が含まれていた $matches とは異なり、$values には初期化されていない値が設定されました。その結果、$values に $matches より大きいカウントが含まれており、パラメーター不一致エラーが発生しました。

解決策

この問題を解決するには、明示的に次のことを行うことが重要です。ループに入る前に $values を空の配列として初期化します:

$matches = array('1');
$count = count($matches);
$values = [];
for($i = 0; $i < $count; ++$i) {
    $values[] = '(?)';
}

この変更により、$matches のカウントと$values が一致すると、クエリが正常に実行されます。

その他の考慮事項

さらに、ターゲット テーブルのハッシュ列に重複キーの競合を処理するための一意のインデックス。これは、INSERT ステートメントの後に次の行を追加することで実現できます:

ON DUPLICATE KEY UPDATE hash=values(hash)

以上が複数のレコードを挿入すると、PDO プリペアド ステートメントが「SQLSTATE[HY093]: 無効なパラメータ番号」で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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