红穆笔记
首頁 踩坑總結 卡卡卡,一個BUG改一天!<b>Fatal error</b>: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in
踩坑總結

卡卡卡,一個BUG改一天!<b>Fatal error</b>: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in

卡卡卡,一个BUG改一天!<b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in

關於$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),請檢查:

// 正確的做法
$sql = "SELECT * FROM articles WHERE category_id IN (:cat_id1, :cat_id2)";
$stmt = $pdo->prepare($sql);
// $categoryIds 的鍵名必須和佔位符完全一致
$stmt->execute([':cat_id1' => 1, ':cat_id2' => 2]);

3. 使用 ? 佔位符(更簡單)

如果 $categoryIds 是一個簡單的索引數組(如 [1, 2, 3]),使用 ? 佔位符會更方便:

// 生成對應數量的 ? 佔位符
$placeholders = rtrim(str_repeat('?,', count($categoryIds)), ',');
$sql = "SELECT * FROM articles WHERE category_id IN ($placeholders)";
$stmt = $pdo->prepare($sql);
$stmt->execute($categoryIds); // 直接傳入索引數組

 

微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

浏览器缓存增加你网站二次访问速度

瀏覽器緩存增加你網站二次訪問速度 踩坑總結

使用瀏覽器緩存官方話語:如果用戶會多次訪問您的網站,那麼靜態資源的瀏覽器緩存可以節省用戶的時間。緩存標頭應當應用到所有可緩存的靜態資源中,而不僅僅是應用到一小部分靜態資源(例如,圖片)中。可緩存的資源包括JS和CSS文件、圖像文件及其他二進制對象文件(媒體文件和PDF文件等)。通常情況下,HTML不…
👁 202
常用正则表达式

常用正則表達式 踩坑總結

正則表達式網址(URL)[a-zA-z]+://[^\s]*IP地址(IP Address)((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)電子郵件(Email)\w+([-+.]\w+)*@\w+([-.]\w+)*…
👁 243

推薦閱讀

php 将一个字符串分割为组成它的字符

php 將一個字符串分割爲組成它的字符 語言筆記 PHP

問: php裏如何將一個字符串分割爲組成它的字符?比如hello -&gt; [h, e, l, l, o] 以下有三種方法:這是需要被分割的字符串: $str = 'Hello小樣';字符串的長度:$len = mb_strlen($str, 'utf8');// 7第一種:$arr = str_…
👁 182
(PC+WAP)蓝色五金机械设备pbootcms企业网站模板 通用营销型网站源码下载 0106

(PC+WAP)藍色五金機械設備pbootcms企業網站模板 通用營銷型網站源碼下載 0106 實用收藏 pbootcms模板

一套通用的藍色五金機械設備PbootCMS企業網站模板,適用於各類機械製造與五金加工行業,支持PC和移動端。設計風格簡潔專業,功能模塊齊全。是機械設備公司快速搭建營銷型品牌官網、提升線上推廣效果的基礎選擇。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密…
👁 41
(自适应手机端)影视资讯类网站pbootcms模板 影视新闻博客网站源码下载 0346

(自適應手機端)影視資訊類網站pbootcms模板 影視新聞博客網站源碼下載 0346 實用收藏 pbootcms模板

一款自適應手機端的影視資訊與影視新聞博客PbootCMS網站模板。設計風格娛樂時尚,適合分享電影評論、影視資訊及行業動態。有助於影評人或影視愛好者在線上搭建內容分享平臺。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關文章Pb…
👁 59
(自适应手机端)响应式小学初中作文网站pbootcms模板 文章资讯论文作文个人博客网站源码下载 0585

(自適應手機端)響應式小學初中作文網站pbootcms模板 文章資訊論文作文個人博客網站源碼下載 0585 實用收藏 pbootcms模板

一款響應式小學初中作文與論文個人博客PbootCMS網站模板,支持PC與WAP端。設計風格清新文藝,適合學生、教師或文學愛好者分享作文、散文及教育心得。有助於搭建一個內容健康、積極向上的文學分享平臺。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:w…
👁 56