Wiederverwendung von Parametern in PDO-vorbereiteten Anweisungen: Eine saubere Lösung
Vorbereitete Anweisungen in PDO schränken normalerweise die Wiederverwendung desselben benannten Parameters ein. Diese Einschränkung stellt eine Herausforderung dar, wenn Abfragen mit mehreren Übereinstimmungskriterien unter Verwendung identischer Parameter erstellt werden. Das manuelle Umbenennen von Parametern (:term1, :term2 usw.) ist umständlich und fehleranfällig.
Nutzung benutzerdefinierter MySQL-Variablen
Ein effizienterer und lesbarerer Ansatz sind die benutzerdefinierten Variablen von MySQL. Diese Methode rationalisiert die Parameterverwaltung und verbessert die Wartbarkeit des Codes.
Der Prozess umfasst die folgenden Schritte:
Variableninitialisierung: Verwenden Sie PDOStatement::bindParam
, um einer benutzerdefinierten Variablen einen Wert zuzuweisen.
<code class="language-php"> $stmt = $dbh->prepare("SET @term = :term"); $stmt->bindParam(":term", "%$term%", PDO::PARAM_STR);</code>
Abfrageintegration: Ersetzen Sie mehrere Instanzen des ursprünglichen Parameters durch die benutzerdefinierte Variable (@term
) in Ihrer SQL-Abfrage.
<code class="language-sql"> SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term</code>
Anweisungsausführung: Bereiten Sie die geänderte Abfrage vor und führen Sie sie aus.
<code class="language-php"> $stmt = $dbh->prepare($sql); $stmt->execute();</code>
Anschauliches Beispiel:
Bedenken Sie diese komplexe Abfrage:
<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>
Refactoring mit benutzerdefinierten Variablen ergibt:
<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>
Vorteile dieses Ansatzes:
Das obige ist der detaillierte Inhalt vonWie kann ich denselben Parameter mehrmals effizient in einer PDO-vorbereiteten Anweisung verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!