预处理数据绑定
PHP预处理方式操作MySQL数据库时,除了可以使用execute()的参数为预处理语句中的占位符绑定数据外,还可以使用PDOStatement类提供bindParam()方法或bindValue()方法实现绑定。两者的区别在于,bindParam()方法是将占位符绑定到指定的变量名上,在execute()执行预处理语句时,只要修改变量名的值即可。而bindValue()方法,在使用时是将值绑定到占位符上,然后再执行execute()执行预处理语句,每修改一次值,都要重复执行一次bindValue()和execute()。
在上一节的学习中,已经使用execute()为预处理语句中的占位符绑定数据,本节将演示bindParam()方法和bindValue()方法的具体使用。
1. bindValue()方法
bindValue()方法支持问号占位符和参数占位符。例如,为student表中的“name”和“mid”两个字段进行数据绑定。示例代码如下。
// 绑定问号占位符
$stmt->bindValue(1, 'Charles');
$stmt->bindValue(2, 2);
$stmt->execute();
// 绑定参数占位符
$stmt->bindValue('参数标识符名', 'Charles');
$stmt->bindValue('参数标识符名',2);
$stmt->execute();
从上述代码可以看出,bindValue()方法的第2个参数用来传入一个值,它无需进行变量的绑定,使用较为方便。
2. bindParam()方法
bindParam()方法同样支持问号占位符和参数占位符,示例代码如下。
// 绑定问号占位符
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $mid);
//绑定参数占位符
$stmt->bindParam('参数标识符名', $name);
$stmt->bindParam('参数标识符名', $entry_date);
在上述代码中,bindParam()的第1个参数是一个数字,表示对应SQL中的第几个问号占位符,第2个参数必须是定义的变量名。
下面通过代码演示两个方法的使用区别,创建C:\web\apache2.4\htdocs\pdo03.php文件,具体代码如下。
1 <?php
2 $dsn = 'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8mb4';
3 $pdo = new PDO($dsn, 'root', '123456');
4 $sql = 'SELECT id,name FROM `student` WHERE id=:id';
5 $stmt = $pdo->prepare($sql);
6 $id = 1;
7 // bindValue()方法
8 $stmt-> bindValue(':id', $id);
9 for(;$id <= 3; $id++){
10 $stmt-> execute();
11 $row = $stmt->fetch(PDO::FETCH_ASSOC);
12 }
13 // bindParam()方法
14 $stmt-> bindParam(':id', $id);
15 for($id = 1; $id <= 3; $id++){
16 $stmt-> execute();
17 $row = $stmt->fetch(PDO::FETCH_ASSOC);
18 }
将上述代码中$row的值使用print_r()函数输出,结果如下所示。
// bindValue()方法输出结果
Array ( [id] => 1 [name] => Tom)
Array ( [id] => 1 [name] => Tom)
Array ( [id] => 1 [name] => Tom)
// bindParam()方法输出结果
Array ( [id] => 1 [name] => Tom)
Array ( [id] => 2 [name] => Jack)
Array ( [id] => 3 [name] => Alen)
通过观察输出的结果,使用bindParam()方法将占位符绑定到指定的变量上后,通过对变量的赋值和预处理语句的执行,可以根据不同的变量值获取不同的结果。