Rootop 服务器运维与web架构

PHP PDO prepare()、execute()方法详解

每次将查询发送给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

作者:Venus

服务器运维与性能优化

评论已关闭。