Die spezifischen Beschreibungen der beiden Methoden in der PDOStatement-Klasse lauten wie folgt
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )<pre name="code" class="php">bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
Unterschied 1: bindParam bindet einen Parameter an den angegebenen Variablennamen, während bindValue Binden Sie einen Wert an einen Parameter
<pre name="code" class="php">$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); //$st->bindValue(1,$id,PDO::PARAM_INT);
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $st->bindParam(1,1,PDO::PARAM_INT); //$st->bindValue(1,1,PDO::PARAM_INT);
Fatal error: Cannot pass parameter 2 by reference
PDOStatement::bindValue(), PDOStatement::bindParam() Die Variable ist als gebunden Referenz, und sein Wert wird nur genommen, wenn PDOStatement::execute() aufgerufen wird
Zuerst $id einen Wert von 1 zuweisen, bindParam bindet die Variable und ändert $id vor der Ausführung auf 2, Und führen Sie dann die Operation aus. Die zu diesem Zeitpunkt erhaltene Ergebnismenge ist das Abfrageergebnis, wenn die ID = 2 ist, nicht das Abfrageergebnis, wenn die ID 1 ist. Dies ist die Erklärung der Variablen als Referenz. Vor der Ausführung können wir diese Variable ersetzen , und der beim Ausführen der Ausführungsoperation ersetzte Variablenwert ist der zuletzt geänderte Wert der Variablen.
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindValue(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
Normalerweise sollte die ausgeführte SQL-Anweisung
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('insert into tabletest(id,name) values(?,?)'); $params = array(1,'张三'); foreach($params as $k => $v){ $index = $k + 1; $st->bindParam($index,$v); } $st->execute();
insert into tabletest(id,name) values(1,'张三');
insert into tabletest(id,name) values('男','男');