学科分类
目录
PHP基础

PDO预处理

利用PHP操作SQL时,传统方式是将发送的数据和SQL写在一起,这种方式每条SQL都需要经过分析、编译和优化的周期;而预处理语句只需要预先编译一次用户提交的SQL模板,在操作时,发送相关数据即可完成对应的操作。这极大地提高了运行效率,而且无需考虑数据中包含特殊字符(如单引号)导致的语法问题。PDO预处理的实现基于MySQL预处理的机制,对预处理的操作进行封装。下面分别讲解PDO实现预处理机制常用的prepare()方法和execute()方法。

1. prepare()方法

PDO类提供的prepare()方法用于准备预处理的SQL语句,在执行成功时返回一个PDOStatement类对象,其基本语法格式如下。

public PDOStatement PDO::prepare (
string $statement, 
array $driver_options = array()
)

在上述语法中,参数$statement表示预处理的SQL语句,该语句中动态变化的量(如查询、更新、删除的条件、插入的数据等)可用占位符代替,这样在执行预处理语句时,根据占位符绑定的数据即可完成相关操作;$driver_options是可选参数,表示设置一个或多个PDOStatement对象的属性值。

PDO支持两种占位符,分别为问号占位符(?)和参数占位符(:参数名称),在一条预处理SQL语句中只能选择其中一种形式。

2. execute()方法

PDOStatement类提供的execute()方法,用于执行一条预处理语句,其语法格式如下。

**bool** PDOStatement**::****execute([ array $input_parameters ])**

在上述语法中,可选参数$input_parameters表示为预处理语句中的占位符绑定数据,若省略该参数,则execute()方法仅用于执行一条预处理语句。其中,$input_parameters的元素个数必须与预处理语句中占位符数量相同,当是问号占位符(?)时,$input_parameters必须是一个索引数组;当是参数占位符(:参数名称)时,$input_parameters必须是一个关联数组。

为了读者更好地理解,下面通过代码演示PDO预处理的使用。

创建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  // 无参数预处理指令
 5  $sql = 'SELECT * FROM `student`';
 6  $stmt = $pdo->prepare($sql);
 7  $stmt->execute();
 8  // 有参数预处理指令
 9  $sql = 'SELECT * FROM `student` WHERE id=?';
 10 $stmt = $pdo->prepare($sql);
 11 $stmt->execute([1]);

在上述代码中,第4~5行用于准备一条预处理的查询语句,prepare()方法返回的$stmt是PDOStatement类对象;第8~10行代码用于为占位符绑定数据并执行带参数的预处理SQL语句。上述代码的查询结果可以通过PDO中的fetch()方法从结果集中获取数据。

在编写预处理SQL语句时,除了可以使用问号占位符(?)外,还可以使用参数占位符,它的使用方式与问号占位符(?)大致相同。示例代码如下。

$sql = 'SELECT * FROM `student` WHERE id=:id';
$stmt = $pdo->prepare($sql);
$stmt->execute([ ':id' => 1 ]);

从上述代码可知,预处理SQL语句中的参数占位符是由冒号“:”和标识符组成,在为参数占位符绑定数据时,只要保证数组中元素的“键名”与参数占位符的“标识符”相同即可,键名中的冒号可以省略。

点击此处
隐藏目录