PHP PDO prepare()、execute()和bindParam()方法详解
每次将查询发送给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=?;
其中,?也是列占位符。
选择哪一种语法都可以,但是前者更明确一些。
下面使用prepare()方法准备一个用于迭代执行的查询:
<?php
$pdo=new PDO($dsn,$user,$pwd); // 连接数据库
$query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";
$result=$pdo->prepare($query);
?>
上面的代码将查询准备好了。继续下面的操作。
执行准备查询——execute()方法
execute()方法负责执行准备好的查询。语法格式如下:
bool PDOStatement::execute([array input_parameters])
该方法需要有每次迭代执行中替换的输入参数。这可以通过两种方法实现:作为数组将值传递给方法,或者通过bindParam()方法把值绑定到查询中相应的变量名或位置偏移。
下面介绍第一种方法,第二种方法在bindParam()方法中介绍。
实例代码中准备了一条语句并通过execute()方法反复执行,每次使用不同的参数:
<?php
$pdo=new PDO($dsn,$user,$pwd); // 连接数据库
$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()方法进行绑定来传递查询参数。
绑定参数——bindParam()方法
execute()方法中的input_parameters参数是可选的,虽然很方便,但是如果需要传递多个变量时,以这种方式提供数组会很快变得难以处理(当数组元素过多时,也就是当数据表中的列过多时,代码设计会变得特别难以阅读或出错)。使用bindParam()方法可以解决这个问题。语法格式如下:
boolean PDOStatement::bindParam(mixed parameter,mixed &variable[,int datatype
[,int length[,mixed driver_options]]])
parameter:当在prepare()方法中使用命名参数时,parameter是预处理语句中使用语法(例如:xuesheng)指定的列值占位符的名字;使用问号参数时,parameter是查询中列值占位符的索引偏移。
variable:该参数存储将赋给占位符的值。它按引用传递,因为结合准备存储过程使用此方法时,可以根据存储过程的某个动作修改这个值。
datatype:该参数显式地设置参数的数据类型,可以为以下值:
- PDO_PARAM_BOOL:SQL BOOLEAN类型。
- PDO_PARAM_INPUT_OUTPUT:参数传递给存储过程时使用此类型,因此,可以在过程执行后修改。
- PDO_PARAM_INT:SQL INTEGER数据类型。
- PDO_PARAM_NULL:SQL NULL数据类型。
- PDO_PARAM_LOB:SQL大对象数据类型。
- PDO_PARAM_STMT:PDOStatement对象类型,当前不可操作。
- PDO_PARAM_STR:SQL CHAR、VARCHAR和其它字符串数据类型。
length:该参数指定数据类型的长度。只有当赋为PDO_PARAM_INPUT_OUTPUT数据类型时才需要这个参数。
driver_options:该参数用来传递任何数据库驱动程序特定的选项。
下面修改前面的实例,使用bindParam()方法来赋列值:
<?php
$pdo=new PDO($dsn,$user,$pwd); // 连接数据库
$query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";
$result=$pdo->prepare($query); $xuesheng='赵天平';
$yuwen='90';
$result->bindParam(':xuesheng',$xuesheng);
$result->bindParam(':yuwen',$yuwen);
$result->execute(); $xuesheng='张冬雪';
$yuwen='115';
$result->bindParam(':xuesheng',$xuesheng);
$result->bindParam(':yuwen',$yuwen);
$result->execute();
?>
如果使用问号参数,语句则如下所示:
$query="INSERT INTO tb_chengji SET xuesheng=?,yuwen=?";
因此对应的bindParam()方法调用如下:
$xuesheng='赵天平';
$yuwen='90';
$result->bindParam(1,$xuesheng);
$result->bindParam(2,$yuwen);
......
$xuesheng='张冬雪';
$yuwen='115';
$result->bindParam(1,$xuesheng);
$result->bindParam(2,$xuesheng);
实例
在执行下面的实例代码之前,tb_chengji数据表中的数据记录如下图所示:

执行下面的实例代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP PDO prepare()、execute()和bindParam()方法详解实例-www.baike369.com</title>
</head>
<body>
<?php
$dbms='mysql';
$dbname='db_xuesheng';
$user='root';
$pwd='1234';
$host='localhost';
$dsn="$dbms:host=$host;dbname=$dbname";
try{
$pdo=new PDO($dsn,$user,$pwd);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query="INSERT INTO tb_chengji SET xuesheng = :xuesheng,yuwen = :yuwen,shuxue = :shuxue,yingyu = :yingyu";
$result=$pdo->prepare($query); $result->execute(array(":xuesheng"=>"周一刚",":yuwen"=>"55",":shuxue"=>"80",":yingyu"=>"78"));
$result->execute(array(":xuesheng"=>"胡伟",":yuwen"=>"107",":shuxue"=>"99",":yingyu"=>"113")); $xuesheng="孙维维"; // 可以接受<form>标签传递过来的值
$yuwen="86";
$shuxue="66";
$yingyu="78";
$result->bindParam(":xuesheng",$xuesheng);
$result->bindParam(":yuwen",$yuwen);
$result->bindParam(":shuxue",$shuxue);
$result->bindParam(":yingyu",$yingyu);
$result->execute(); // 可以多次添加数据记录
$xuesheng="王萍";
$yuwen="116";
$shuxue="45";
$yingyu="69";
$result->bindParam(":xuesheng",$xuesheng);
$result->bindParam(":yuwen",$yuwen);
$result->bindParam(":shuxue",$shuxue);
$result->bindParam(":yingyu",$yingyu);
$result->execute(); }catch(Exception $exception){
echo $exception->getMessage();
}
?>
</body>
</html>
上面的实例执行一次代码,可以添加多条数据记录。当然,执行一次代码,也可以添加一条记录。
上面的实例代码,还可以写成下面的格式,效果是一样的:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP PDO prepare()、execute()和bindParam()方法详解实例-www.baike369.com</title>
</head>
<body>
<?php
$dbms='mysql';
$dbname='db_xuesheng';
$user='root';
$pwd='1234';
$host='localhost';
$dsn="$dbms:host=$host;dbname=$dbname";
try{
$pdo=new PDO($dsn,$user,$pwd);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query="INSERT INTO tb_chengji SET xuesheng=?,yuwen=?,shuxue=?,yingyu=?";
$result=$pdo->prepare($query); $result->execute(array("周一刚","55","80","78"));
$result->execute(array("胡伟","107","99","113")); $xuesheng="孙维维"; // 可以接受<form>标签传递过来的值
$yuwen="86";
$shuxue="66";
$yingyu="78";
$result->bindParam(1,$xuesheng);
$result->bindParam(2,$yuwen);
$result->bindParam(3,$shuxue);
$result->bindParam(4,$yingyu);
$result->execute(); // 可以多次添加数据记录
$xuesheng="王萍";
$yuwen="116";
$shuxue="45";
$yingyu="69";
$result->bindParam(1,$xuesheng);
$result->bindParam(2,$yuwen);
$result->bindParam(3,$shuxue);
$result->bindParam(4,$yingyu);
$result->execute();
}catch(Exception $exception){
echo $exception->getMessage();
}
?>
</body>
</html>
执行实例代码以后,tb_chengji数据表中的数据记录如下图所示:

提示
当使用PHP中PDO的prepare()、execute()和bindParam()方法时,网页的编码一定要设置为utf-8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
否则,将不能输入中文汉字数据。
PHP PDO prepare()、execute()和bindParam()方法详解的更多相关文章
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- 利用C#实现AOP常见的几种方法详解
利用C#实现AOP常见的几种方法详解 AOP面向切面编程(Aspect Oriented Programming) 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 下面这篇文章主要 ...
- php调用C代码的方法详解和zend_parse_parameters函数详解
php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方 ...
- oracle 重置序列从指定数字开始的方法详解
原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n ); v_startnum ):;--从多少开始 v_step ):;--步进 tsql ...
- Python操作SQLite数据库的方法详解
Python操作SQLite数据库的方法详解 本文实例讲述了Python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简单介绍 SQLite数据库是一款非常小巧的嵌入式开 ...
- session的使用方法详解
session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...
- Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解
下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- ecshop后台增加|添加商店设置选项和使用方法详解
有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...
随机推荐
- 利用 gulp 来合并seajs 的项目
gulp-seajs-transport 和 gulp-seajs-concat这两个gulp插件 gulp-seajs-transpor 这个插件这样是给每个js模块 标示 模块名称 gulp-se ...
- 将PS/2接口鼠标改造成USB接口鼠标
改造接线图 不是所有PS/2鼠标都可以改为USB鼠标的,可以改的PS/2鼠标的特征: A.早期PS/2鼠标电路板一般带有两块集成电路,(一块光电感应,一块按键或USB协议转换,和一只24M的晶体振荡器 ...
- cocos2dx 3.1.1移植安卓apk (lua项目交叉编译 mac环境下)
cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境下 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new te ...
- 读博 在没有导师PUSH的情况下该何去何从?
读博已有两月之久,与导师也是仅有的一面之缘,短短数分钟谈话大致总结便是看看基础知识,再然后就没有什么了,突然之间有些小懵逼.突然间感慨这就是我的博士生涯的生活,这就没有啦,以后就这么过啦?在读博士之前 ...
- hog+svm+检测人(代替默认的参数)
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui. ...
- 利用asynchttpclient开源项目来把数据提交给服务器
可以通过github去查找asynchttpclient,并下载源代码,并加载到自己的工程中. 1.利用get方法提交 2.利用post方法来提交
- AOP jdk动态代理
一: jdk动态代理是Spring AOP默认的代理方法.要求 被代理类要实现接口,只有接口里的方法才能被代理,主要步骤是先创建接口,接口里创建要被代理的方法,然后定义一个实现类实现该接口,接着将被代 ...
- 51Nod 1058: N的阶乘的长度(斯特林公式)
1058 N的阶乘的长度 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Inp ...
- 10款PHP开源网店系统
在当今经济危机的大环境下,网上购物越来越来吃香,网上开店成本低,快捷方便,出名的电子商务网站有淘宝,拍拍,Ebay或是最新的百度有啊,这些网站都提供开店的机会,如果是想自己搭建购物平台,可以从下面选择 ...
- HDU3584 Cube
分析 三维树状数组,跟二维的差不多,只不过容斥的不一样. 更新区间\((x_1,y_1,z_1)\rightarrow(x_2,y_2,z_2)\)时,需要利用容斥原理.须要更新的节点更新如下: \[ ...