Heim > Artikel > Backend-Entwicklung > Sehen! Es gibt eine Falle mit PDOStatement::bindParam!
Empfohlen: „PHP-Video-Tutorial“
Kein Unsinn mehr, schauen Sie sich einfach den Code an:
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test"); $query = <<<query INSERT INTO `user` (`username`, `password`) VALUES (:username, :password); QUERY; $statement = $dbh->prepare($query); $bind_params = array(':username' => "laruence", ':password' => "weibo"); foreach( $bind_params as $key => $value ){ $statement->bindParam($key, $value); } $statement->execute();
Entschuldigung, was ist die letzte ausgeführte SQL-Anweisung und gibt es ein Problem mit dem obigen Code?
Okey, Ich denke, die meisten Klassenkameraden werden denken, dass die endgültige SQL-Ausführung lautet:
INSERT INTO `user` (`username`, `password`) VALUES ("laruence", "weibo");
Aber leider liegen Sie falsch. Die endgültige SQL-Ausführung lautet:
INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");
Ist das eine große Falle?
------ Wenn Sie den Grund selbst herausfinden möchten, dann lesen Sie nicht weiter---------
Dieses Problem stammt aus einem heutigen Fehlerbericht: #63281
Der Grund ist der Unterschied zwischen bindParam und bindValue where , bindParam erfordert, dass der zweite Parameter eine Referenzvariable (Referenz) ist.
Lassen Sie uns das foreach des obigen Codes zerlegen, das heißt, dieses foreach:
<?php foreach( $bind_params as $key => $value ){ $statement->bindParam($key, $value); }
ist äquivalent zu:
<?php //第一次循环 $value = $bind_params[":username"]; $statement->bindParam(":username", &$value); //此时, :username是对$value变量的引用 //第二次循环 $value = $bind_params[":password"]; //oops! $value被覆盖成了:password的值 $statement->bindParam(":password", &$value);
Also, wenn bindParam verwendet wird Sie sollten dieser Falle besondere Aufmerksamkeit schenken, wenn Sie sie in Verbindung mit foreach verwenden.
1 Verwenden Sie nicht foreach, sondern weisen Sie Werte manuell zu
<?php $statement->bindParam(":username", $bind_params[":username"]); //$value是引用变量了 $statement->bindParam(":password", $bind_params[":password"]);
2 , oder übergeben Sie das gesamte Parameter-Array direkt in „execute“. Seien Sie vorsichtig, wenn Sie foreach verwenden!
Originaladresse: https://www.laruence.com/2012/10/16/2831.htmlDas obige ist der detaillierte Inhalt vonSehen! Es gibt eine Falle mit PDOStatement::bindParam!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!