在《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=new PDO('mysql:host=localhost;dbname=test','root','root'); $sql="INSERT test_pdo(username,password,email) VALUES(?,?,?)"; $stmt=$pdo->prepare($sql); $username='testuser111'; $password='123456'; $email='testuser11@qq.com'; $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@qq.com'; $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=new PDO('mysql:host=localhost;dbname=test','root','root'); $sql="select username,password,email from test_pdo where id<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.'<br>'; } }catch(PDOException $e){ echo $e->getMessage(); }