摘要:在《PDO中预处理语句占位符的使用》已经介绍了参数绑定方法bindParam(),冒号‘:’占位符和问号‘?’都可以使用这个方法绑定参数,而且还可以指定绑定参数的类型,再次确保在执行sql中传入参数的安全性。PDO扩展中,除了bindParam()方法外,还有其它的方法也可以绑定参数。
在《PDO中预处理语句占位符的使用》已经介绍了参数绑定方法bindParam(),冒号‘:’占位符和问号‘?’都可以使用这个方法绑定参数,而且还可以指定绑定参数的类型,再次确保在执行sql中传入参数的安全性。PDO扩展中,除了bindParam()方法外,还有其它的方法也可以绑定参数。
1、bindValue()方法绑定参数
bindValue()和bindParam()一样,都属于PDOStatement对象中的方法。该方法也是把一个值绑定到一个参数。bindValue()同样有3个参数PDOStatement::bindValue(mixed$parameter,mixed$value[,int$data_type=PDO::PARAM_STR]):bool
执行成功时返回TRUE, 或者在失败时返回FALSE。parameter
参数标识符。对于使用命名占位符的预处理语句,应是类似:name形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。
value
绑定到参数的值
data_type
使用PDO::PARAM_*常量明确地指定参数的类型。
bindValue()方法使用示例<?php
header('content-type:text/html;charset=utf-8');
try{
$pdo=newPDO('mysql:host=localhost;dbname=test','root','root');
$sql="INSERTtest_pdo(username,password,email)VALUES(?,?,?)";
$stmt=$pdo->prepare($sql);
$username='testuser111';
$password='123456';
$email='testuser11@';
$stmt->bindValue(1,$username,PDO::PARAM_STR);
$stmt->bindValue(2,$password,PDO::PARAM_STR);
$stmt->bindValue(3,$email);
$stmt->execute();
//再次绑定参数执行
$username='testuser222';
$password='123456';
$email='testuser22@';
$stmt->bindValue(1,$username,PDO::PARAM_STR);
$stmt->bindValue(2,$password,PDO::PARAM_STR);
$stmt->bindValue(3,$email);
$stmt->execute();
echo$stmt->rowCount();
}catch(PDOException$e){
echo$e->getMessage();
}
从bindValue()的使用示例来看再对比前文bindParam(),这两个方法使用方法似乎一样,既然如此为什么会有两个方法呢?请看下面的图:
通过这两个图,可以明显的发现,bindValue()方法是先给参数然后绑定参数最后执行,而且每次执行execute()前都需要再次绑定参数,而bindParam()方法则没有这个顺序问题,也无需再次绑定参数,在给定参数之前或者之后都不会报错。
2、bindColumn()方法绑定参数
bindColumn() 绑定一列到一个 PHP 变量
安排一个特定的变量绑定到一个查询结果集中给定的列。这个方法绑定的是结果集PDOStatement::bindColumn(mixed$column,mixed&$param[,int$type[,int$maxlen[,mixed$driverdata]]]):bool
执行成功时返回TRUE, 或者在失败时返回FALSE。
参数说明column
结果集中的列号(从1开始索引)或列名。如果使用列名,注意名称应该与由驱动返回的列名大小写保持一致。
param
将绑定到列的PHP变量名称
type
通过PDO::PARAM_*常量指定的参数的数据类型。
maxlen
预分配提示。
driverdata
驱动的可选参数。
下面通过具体的示例来理解bindColumn()方法<?php
header('content-type:text/html;charset=utf-8');
try{
$pdo=newPDO('mysql:host=localhost;dbname=test','root','root');
$sql="selectusername,password,emailfromtest_pdowhereid<20";
$stmt=$pdo->prepare($sql);
$stmt->execute();
$stmt->bindColumn(1,$username);
$stmt->bindColumn(2,$password);
$stmt->bindColumn(3,$email);
//绑定参数后需要用fetch(PDO::FETCH_BOUND)来获取结果集
while($stmt->fetch(PDO::FETCH_BOUND)){
echo'用户名:'.$username.'-密码:'.$password.'-邮箱'.$email.'
';
}
}catch(PDOException$e){
echo$e->getMessage();
}