每次将查询发送给MySQL服务器时,都必须解析该查询的语法,确保结构正确并能够执行。这是这个过程中必要的步骤,但也确实带来了一些开销。做一次是必要的,但如果反复地执行相同的查询,批量插入多行并只改变列值时会怎么样呢?预处理语句会在服务器上缓存查询的语法和执行过程,而只在服务器和客户端之间传输有变化的列值,以此来消除这些额外的开销。
PDO为支持此特性的数据库提供了预处理语句功能。因为MySQL支持这个特性,所以可以在适当时使用预处理语句。
预处理语句是使用两个方法实现的:prepare()方法负责准备要执行的查询,execute()方法使用一组给定的列参数反复地执行查询。这些参数可以显式地作为数组传递给execute()方法,也可以使用通过bindParam()方法指定的绑定参数提供给execute()方法。
使用预处理语句——prepare()方法:
prepare()方法负责准备要执行的查询。语法格式如下:
PDOStatement PDO::prepare(string statement[,array driver_options])
但是,用作准备语句的查询与以住使用的查询略有区别,因为对于每次执行迭代中要改变的值,必须使用占位符而不是具体的列值。
查询支持两种不同的语法:命名参数和问号参数。
使用命名参数的查询如下:
INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen;
其中,:xuesheng与:yuwen都是列占位符。
使用问号参数的查询如下:
INSERT INTO tb_chengji SET xuesheng=?,yuwen=?;
其中,?也是列占位符。(需要bindParam()方法传递进去参数)
选择哪一种语法都可以,但是前者更明确一些。
使用prepare()方法准备一个用于迭代执行的查询案例:
<?php $pdo=new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); // 连接数据库 $query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen"; $result=$pdo->prepare($query);
上面的代码将查询准备好了。继续下面的传值操作。
执行准备查询——execute()方法:
execute()方法负责执行准备好的查询。语法格式如下:
bool PDOStatement::execute([array input_parameters])
该方法需要有每次迭代执行中替换的输入参数。这可以通过两种方法实现:作为数组将值传递给方法,或者通过bindParam()方法把值绑定到查询中相应的变量名或位置偏移。
下面介绍第一种方法。
实例代码中准备了一条语句并通过execute()方法反复执行,每次使用不同的参数:
<?php $pdo=new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); // 连接数据库 $query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen"; $result=$pdo->prepare($query); $result->execute(array(':xuesheng'=>'赵天平',':yuwen'=>'90')); // 执行一次 $result->execute(array(':xuesheng'=>'张冬雪',':yuwen'=>'115')); // 再执行一次
关于问号传值及bindParam传参可参考: http://www.baike369.com/content/?id=5447
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/3501.html