關於$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); // 直接傳入索引數組