In PHP ist PDO (PHP -Datenobjekte) eine leichte Möglichkeit, auf Datenbanken zuzugreifen. Es unterstützt mehrere Datenbanktypen wie MySQL, PostgreSQL, SQLite usw. PDO bietet eine leistungsstarke Methode PDOSTATEMENT :: BindValue , um Parameter in SQL -Anweisungen zu binden. Dies vermeidet nicht nur SQL -Injektionsprobleme, sondern verbessert auch die Wartbarkeit und Lesbarkeit des Codes. In diesem Artikel wird ausführlich erläutert, wie BindValue korrekt verwendet wird, um Parameter zu binden.
Pdostatement :: bindValue ist ein angegebener Parameter, der in PDO verwendet wird, um einen Wert an eine SQL -Anweisung zu binden. Diese Methode bindet einen Wert an einen Parameter und kann die Platzhalter in der SQL -Anweisung automatisch ersetzen, wenn die SQL -Anweisung ausgeführt wird. Dies gibt zwei Vorteile:
Vermeiden Sie SQL -Injektionsangriffe : Durch die Ersetzung von Platzhaltern durch Bindung von Werten kann sicherstellen, dass eingehende Werte nicht böswillig in SQL -Abfragen injiziert werden.
Der Code ist klar und leicht zu pflegen : Die Verwendung von Platzhaltern und gebundenen Parametern macht SQL -Anweisungen klarer und von den Daten selbst getrennt, was es einfacher macht, später zu ändern.
Die grundlegende Syntax der BindValue -Methode lautet wie folgt:
<span><span><span class="hljs-title class_">PDOStatement</span></span><span>::</span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-variable">$parameter</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>, </span><span><span class="hljs-variable">$data_type</span></span><span> = PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span></span>
$ parameter : Dies ist ein Platzhalter in einer SQL -Erklärung, die ein genannter Platzhalter (zum Beispiel : Benutzername ) oder ein Fragezeichen -Platzhalter ( ? ) sein kann.
$ Wert : Der Wert, der gebunden werden muss.
$ data_type (optional): Der Typ des gebundenen Werts. Normalerweise können Sie PDO :: param_str (Standard), pdo :: param_int , pdo :: param_bool und andere Typen auswählen.
Nehmen wir an, wir möchten eine Abfrage ausführen, um die detaillierten Informationen eines Benutzers und Abfragen basierend auf dem Benutzernamen des Benutzers zu erhalten:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// erstellen PDO Beispiel</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-comment">// Vorbereiten SQL Stellungnahme,Verwenden Sie benannte Platzhalter</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>;
</span><span><span class="hljs-comment">// Vorverarbeitung SQL Stellungnahme</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-comment">// verwenden bindValue Binden Sie Parameter</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-comment">// Eine Frage ausführen</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// Ergebnisse erhalten</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$user</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Im obigen Code ist : Benutzername ein genannter Platzhalter in der SQL -Anweisung, und die BindValue -Methode bindet den tatsächlichen Benutzernamen John_DOE an diesen Platzhalter. Wenn SQL ausgeführt wird, wird : Benutzername durch John_doe ersetzt.
Neben der Benennung von Platzhaltern können Sie auch ein Fragezeichen ( ? ) Als Platzhalter verwenden. Hier ist ein Beispiel für die Verwendung eines Fragemarks -Platzhalters:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// erstellen PDO Beispiel</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-comment">// Vorbereiten SQL Stellungnahme,verwenden问号占位符</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>;
</span><span><span class="hljs-comment">// Vorverarbeitung SQL Stellungnahme</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-comment">// verwenden bindValue Binden Sie Parameter</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'jane_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>); </span><span><span class="hljs-comment">// Binden Sie den ersten Platzhalter für Fragezeichen</span></span><span>
</span><span><span class="hljs-comment">// Eine Frage ausführen</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// Ergebnisse erhalten</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$user</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
In diesem Beispiel binden wir den ersten Platzmarke -Platzhalter mit dem ersten Parameter 1 der BindValue -Methode. Beachten Sie, dass die Reihenfolge des Fragezeichens Platzhalter bei 1 und nicht bei 0 beginnen.
Obwohl BindValue und Bindparam beide zur Bindung von SQL -Parametern verwendet werden, gibt es einige subtile Unterschiede zwischen ihnen:
BindValue bindet den Wert sofort an den Platzhalter, und unabhängig von der nachfolgenden Ausführung ist der gebundene Wert immer der anfänglich übergebene Wert.
BindParam bindet eine Referenz auf eine Variable, was bedeutet, dass sich auch die gebundenen Parameter ändern, wenn der Wert dieser Variablen vor der Ausführung der SQL -Anweisung geändert wird.
Zum Beispiel:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-comment">// verwenden bindValue</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'jane_doe'</span></span><span>; </span><span><span class="hljs-comment">// Modifizierter variabler Wert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>(); </span><span><span class="hljs-comment">// 查询会verwenden john_doe</span></span><span>
</span><span><span class="hljs-comment">// verwenden bindParam</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'jane_doe'</span></span><span>; </span><span><span class="hljs-comment">// Modifizierter variabler Wert</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>(); </span><span><span class="hljs-comment">// 查询会verwenden jane_doe</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Wie oben gezeigt, verwendet BindValue den anfänglichen Wert, den BindParam den modifizierten Wert verwendet.
SQL -Injektion verhindern : SQL -Injektionsangriffe können durch Platzhalter und Bindungsparameter effektiv vermieden werden.
Führen Sie die gleiche Abfrage mehrmals aus : Wenn Sie die gleiche Abfrage mehrmals ausführen müssen, kann die Leistung von BindValue die Leistung verbessern und den Code ordentlich halten.
Lesbarkeit und Wartbarkeit : Die Verwendung von Platzhaltern und Parameterbindung kann SQL -Anweisungen klarer machen, leichter zu lesen und zu verstehen, insbesondere in komplexen Abfragen.
Pdostatement :: bindValue ist ein sehr nützliches Tool, das die Ausführung von SQL -Anweisungen durch Bindungsparameter vereinfacht und gleichzeitig die Sicherheit und Lesbarkeit des Codes verbessert. Wenn Sie es korrekt verwenden, können Entwickler die SQL -Injektion vermeiden und die Zuverlässigkeit von Datenbankabfragen sicherstellen. Bei der Behandlung komplexer Datenbankinteraktionen ist das Beherrschen der Verwendung von PDO für jeden PHP-Entwickler eine Muss.
Verwandte Tags:
PDOStatement