Sehen! Es gibt eine Falle mit PDOStatement::bindParam!

藏色散人
Freigeben: 2023-04-09 16:38:02
nach vorne
11807 Leute haben es durchsucht

Empfohlen: „PHP-Video-Tutorial

Kein Unsinn mehr, schauen Sie sich einfach den Code an:

<?php
$dbh = new PDO(&#39;mysql:host=localhost;dbname=test&#39;, "test");
$query = <<<query
  INSERT INTO `user` (`username`, `password`) VALUES (:username, :password);
QUERY;
$statement = $dbh->prepare($query);
$bind_params = array(&#39;:username&#39; => "laruence", &#39;:password&#39; => "weibo");
foreach( $bind_params as $key => $value ){
    $statement->bindParam($key, $value);
}
$statement->execute();
Nach dem Login kopieren

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");
Nach dem Login kopieren

Aber leider liegen Sie falsch. Die endgültige SQL-Ausführung lautet:

INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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);
Nach dem Login kopieren

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"]);
Nach dem Login kopieren

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.html

Das 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!

Verwandte Etiketten:
Quelle:laruence.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage