この場所について$stmt->execute($categoryIds); パラメータ渡しに関する問題。
本当に、呆然としてしまったよ!ただこの一つの問題で、午後ずっと頭が混乱してたんだ!
夜にドキュメントを確認したとき、これが実はこの問題だったことに気づいた。
PDOException: SQLSTATE[HY093] エラー:根本的な原因は ; SQL文におけるパラメータプレースホルダー、および ; execute() 受入した配列引数が正しくマッチングされません。。
エラー原因の特定
execute()  ;入力を期待していますインデックス配列(例: ) ['value1', 'value2'])または関連配列(例: ) [':name' => 'value'])は、SQLにおける に対応させるために使用されます; ?  ;または ; :name プレースホルダー。
もし ; $categoryIds 条件を満たさない場合、エラーが発生します。よくある問題例:
配列のキー名が連続していない:もし ;
$categoryIds ;は ;array_filter() ;等の関数で処理された場合、「稀疏配列」が生成される可能性があります(例:キー名が 0、2、3 であるが、1 が欠落している)。execute()この不連続なインデックスを正しく処理できません。。キー名が正しくありませんSQLで名前付きプレースホルダー(例: )を使用している場合、
:id), тогда ;$categoryIdsキー名は完全に一致していなければなりません(例: )。[':id' => 1])。キー名の誤りまたは無効な文字(例:点 ;)の使用;.)いずれも、マッチングに失敗を引き起こします。。パラメータ数が一致しない:
$categoryIds中にある要素の数は、SQL文内のプレースホルダーの数と完全に一致する必要があります。多次元配列:もし ;
$categoryIds ;これは多次元配列(例:データベースから取得した結果セット)です。execute() ;処理もできません
ソリューション
1. 配列のインデックスを確認し、再設定する(最も一般的な原因)
もしあなたが ;を使用したことがあるなら; array_filter()  ;または同様の関数の場合、まず ;を使用してください。 array_values() インデックスをリセット:
// 假设 $categoryIds 来自过滤
// $categoryIds = array_filter($categoryIds);
$categoryIds = array_values($categoryIds); // 重置索引为 0, 1, 2...
$stmt->execute($categoryIds);2. キーナンバーがプレースホルダーと一致していることを確認してください。
名前付きプレースホルダー(例: ;)を使用している場合、 :cat_id)ご確認ください:
// 生成对应数量的 ? 占位符
$placeholders = rtrim(str_repeat('?,', count($categoryIds)), ',');
$sql = "SELECT * FROM articles WHERE category_id IN ($placeholders)";
$stmt = $pdo->prepare($sql);
$stmt->execute($categoryIds); // 直接传入索引数组