学科分类
目录
PHP基础

预处理数据绑定

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()方法将占位符绑定到指定的变量上后,通过对变量的赋值和预处理语句的执行,可以根据不同的变量值获取不同的结果。

点击此处
隐藏目录