<?php
$db = new PDO($dsn,$username,$password);
$uname='avi';
$age=19;
$stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)');
$stmt->execute(array(':uname'=>$uname,':age'=>$age));
$stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(?,?)');
$stmt->execute(array($uname,$age));
$stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)');
$stmt->bindValue(':uname',$uname); //can be $uname or just 'avi'
$stmt->binParam(':age',$uname); //cannot be 'avi' or value only
$stmt->execute();
?>
我们应该何时使用bindParam()
?所有以前的方法似乎都更容易,并且需要更少的代码行。
使用bindParam()
优于其他方法(bindValue()
,execute()
)的好处是什么?
答案 0 :(得分:4)
bindParam()
通过引用绑定参数,因此它将在$stmt->execute()
进行评估,这与bindValue()
不同,后者在函数调用时进行求值。
以此为例:
bindParam:
<?php
try {
$dbh = new PDO("mysql:host=localhost;dbname=test", "root", "");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM test WHERE number = ?");
$stmt->bindParam(1, $xy, PDO::PARAM_INT);
$xy = 123; //See here variable is defined after it has been bind
$stmt->execute();
print_r($stmt->fetchAll());
} catch(PDOException $e) {
echo $e->getMessage();
}
?>
效果很好!
bindValue:
<?php
try {
$dbh = new PDO("mysql:host=localhost;dbname=test", "root", "");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM test WHERE number = ?");
$stmt->bindValue(1, $xy, PDO::PARAM_INT);
$xy = 123; //See here variable is defined after it has been bind
$stmt->execute();
print_r($stmt->fetchAll());
} catch(PDOException $e) {
echo $e->getMessage();
}
?>
输出:
注意:未定义的变量:xy
还有一些其他差异:
bindParam()
也有参数长度,如果你调用IN&amp; OUT过程将输出存储回变量(也需要在PDO::PARAM_INPUT_OUTPUT
附加一个OR),它可以(必须)使用语句到类型参数)bindParam()
&amp; bindValue()
您可以指定值的类型,您可以在execute()
中执行此操作,一切都只是一个字符串(PDO :: PARAM_STR)答案 1 :(得分:1)
bindParam优于bindValue的好处是,您可以在决定放入变量之前绑定变量。为什么你真的需要这样做,我不知道,但你可能会这样做。
绑定值
$x = function_call_to_determine_value();
$stmt->bindValue(':x',$x);
$stmt->execute();
Bind Param
$stmt->bindParam(':x',$x);
$x = function_call_to_determine_value();
$stmt->execute();