Dieser Artikel stellt hauptsächlich die Vorverarbeitung für den Betrieb von MySQL vor. Er hat einen bestimmten Referenzwert. Jetzt kann ich ihn mit Ihnen teilen.
Dieser Fehler bedeutet, dass der zweite Parameter nicht als Referenz übergeben werden kann
Der Grund für diesen Fehler ist bind_param Außer Der erste Parameter, der den Datentyp darstellt,
in der ()-Methode erfordert Variablen anstelle von direkten Mengen, da andere Parameter als Referenz übergeben werden
$sql = "select * from tmp where myname=? or sex =?"; $stmt = $mysqli->conn->prepare($sql); $name ="a"; $sex="b"; $stmt->bind_param('ss',$name,$sex);//必须要这样传参,且在mysqli等的预处理参数绑定中,必须要指定参数的类型且只能一次性绑定全部参数,不能像PDO那样一个个绑定 //$stmt->bind_param('ss',"a","b"); //这种方式的会报错:Fatal error: Cannot pass parameter 2 by reference$stmt->execute(); if($mysqli->conn->affected_rows){ $result = $stmt->get_result(); while($row = $result->fetch_assoc()){ var_dump($row); } }
2 , PHP verhindert SQL-Injection, nicht Verwenden Sie nicht mehr addslashes und mysql_real_escape_string
Unabhängig davon, ob Sie addslashes oder mysql_real_escape_string verwenden, können Sie Codierungsschwachstellen nutzen, um sich beim Server anzumelden, indem Sie ein beliebiges Passwort eingeben. ! ! ! (Ich werde nicht näher auf das Prinzip des Angriffs eingehen. Interessierte Schüler können sich mit den Einzelbyte- und Mehrbyte-Problemen bei der Zeichenkodierung befassen.)
🎜>Der Grund, warum mysql_real_escape_string die Injektion verhindern kann, liegt darin, dass mysql_escape_string selbst die aktuelle Codierung nicht bestimmen kann. Durch Hinzufügen können Sie die Injektion von Codierungsproblemen verhindern. Obwohl SQL-Injection bis zu einem gewissen Grad verhindert werden kann, wird die folgende perfekte Lösung dennoch empfohlen.
Die perfekte Lösung ist die Verwendung von PDO und MYSQLi mit Prepared Statement-Mechanismus anstelle von mysql_query (Hinweis: mysql_query ist seit PHP 5.5.0 veraltet und wird in Zukunft entfernt): PDO :$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row
MYSQLI:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }
PDO:
$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row }
MYSQLi:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }
auftritt, liegt darin, dass mit Ausnahme des ersten Parameters, der den Datentyp in der bind_param()-Methode darstellt, alle
aufgrund anderer Parameter Variablen anstelle direkter Mengen verwenden müssen sind durch Verweis bestanden. Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Wie PHP bestimmt, ob ein Link gültig ist
Interaktion zwischen PHP und Webseiten
Das obige ist der detaillierte Inhalt vonVorverarbeitung von MySQL in PHP Prepare. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!