在 PDO 準備語句中重複使用參數:乾淨的解
PDO 中的準備語句通常會限制相同命名參數的重複使用。當使用相同參數建立具有多個匹配條件的查詢時,此限制帶來了挑戰。 手動重新命名參數(:term1、:term2等)很麻煩,而且容易出錯。
利用 MySQL 使用者定義的變數
一種更有效率、更易讀的方法涉及 MySQL 的使用者定義變數。此方法簡化了參數管理並增強了程式碼可維護性。
流程涉及以下步驟:
變數初始化:使用PDOStatement::bindParam
為使用者定義的變數賦值。
<code class="language-php"> $stmt = $dbh->prepare("SET @term = :term"); $stmt->bindParam(":term", "%$term%", PDO::PARAM_STR);</code>
查詢整合: 在 SQL 查詢中以使用者定義的變數 (@term
) 取代原始參數的多個實例。
<code class="language-sql"> SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term</code>
語句執行:準備並執行修改後的查詢。
<code class="language-php"> $stmt = $dbh->prepare($sql); $stmt->execute();</code>
範例:
考慮這個複雜的查詢:
<code class="language-sql">( SELECT t1.`name` AS resultText FROM table1 AS t1 WHERE t1.parent = :userID AND ( t1.`name` LIKE :term OR t1.`number` LIKE :term AND t1.`status` = :flagStatus ) ) UNION ( SELECT t2.`name` AS resultText FROM table2 AS t2 WHERE t2.parent = :userParentID AND ( t2.`name` LIKE :term OR t2.`ticket` LIKE :term AND t1.`state` = :flagTicket ) )</code>
使用使用者定義變數進行重構會產生:
<code class="language-sql">SET @term = :term; ( SELECT t1.`name` AS resultText FROM table1 AS t1 WHERE t1.parent = :userID AND ( t1.`name` LIKE @term OR t1.`number` LIKE @term AND t1.`status` = :flagStatus ) ) UNION ( SELECT t2.`name` AS resultText FROM table2 AS t2 WHERE t2.parent = :userParentID AND ( t2.`name` LIKE @term OR t2.`ticket` LIKE @term AND t1.`state` = :flagTicket ) )</code>
這種方法的優點:
以上是如何在 PDO 準備語句中有效地多次使用相同的參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!