首頁  >  文章  >  後端開發  >  為什麼在使用 PHP PDO 準備語句和 MySQL LIKE 查詢時得到空結果?

為什麼在使用 PHP PDO 準備語句和 MySQL LIKE 查詢時得到空結果?

Patricia Arquette
Patricia Arquette原創
2024-10-30 19:11:30346瀏覽

Why Am I Getting Null Results When Using PHP PDO Prepared Statements with MySQL LIKE Queries?

PHP PDO 準備語句MySQL LIKE 查詢:解決空結果

在MySQL 中,常見的操作涉及使用LIKE 子句來執行資料通配符搜尋。在 MySQL 中使用 PHP 的 PDO 類別時,必須了解如何正確建構這些查詢以避免空結果。

讓我們檢查一下 LIKE 查詢不會透過 PDO 類別傳回結果的場景。 MySQL 用戶端中的原始查詢是:

<code class="sql">SELECT    hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE "%searchTerm%"
LIMIT 25;</code>

此查詢利用 LIKE 運算子來尋找 hs.hs_text 欄位在其值中包含 searchTerm 的所有行。但是,當此查詢轉換為 PHP 的 PDO 類別時,它無法傳回任何結果。

<code class="php">$sql = 
'SELECT   hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE :searchTerm
LIMIT 25';

$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));</code>

PHP 程式碼中的問題是 WHERE 子句中的 searchTerm 周圍存在雙引號。 PHP 中的準備語句在綁定值時不需要引號。只有當字串值直接嵌入查詢本身時才需要引號。

要解決此問題,只需從searchTerm 參數中刪除雙引號即可:

<code class="php">$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));</code>

此修改允許PDO類將searchTerm 值正確綁定到查詢,這將產生預期的結果。

準備好的語句透過將資料與查詢分離來提高安全性和效率。它們透過允許資料庫處理綁定過程來防止 SQL 注入漏洞並優化查詢執行。了解如何透過 PHP 的 PDO 類別正確使用 LIKE 查詢對於從 MySQL 資料庫中有效檢索資料至關重要。

以上是為什麼在使用 PHP PDO 準備語句和 MySQL LIKE 查詢時得到空結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn