PDO对预处理语句的支持

zxh5566  2016-07-16 06:59   Hits: 

预处理语句的作用是,编译一次,可以多次执行,会在服务器上缓存查询的语法和执行过程,而只在服务器和客户端之间传
 
输有变化的列值,以此来消除这些额外的开销,可以有效防止SQL注入,在执行单个查询时快于直接使用query()/exec()的方
 
法,速度快而且安全,推荐使用。
 
1、PDOStatement对象
 
通过PDO使用预处理语句功能之前,先了解一下PDO扩展中的PDOStatement对象,如果通过执行PDO对象中的query()方法返回
 
的PDOStatement类对象,就代表的是一个结果集对象,如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象
 
,则为一个查询对象。
 
2、准备语句
重复执行一个SQL查询,通过每次迭代使用不同的参数,这种情况使用预处理语句运行效率最高,使用预处理语句,首先要先
 
准备一个SQL查询语句,但并不需要马上执行,对于一个准备好的SQL语句,如果在每次执行时都要改变一些列值,这种情况
 
必须使用占位符号而不是具体列值,而在PDO中有两种占位符的语法,命名参数和问号参数
使用命名参数作为占位符的insert语句如下
$dbh->prepare("insert into contactinfo (name,address,phone) values (:name,:address,:phone)");
使用问号占位符的insert语句如下
$dbh->prepare("insert into contactinfo (name,address,phone) values (?,?,?)");
不管哪种参数作为占位符,都需要使用PDO对象的prepare()方法,去准备这个将要用于迭代的查询,并返回PDOStatement类
 
对象
 
3、绑定参数
 
当查询准备好之后,需要在每次执行时替换输入的参数,可以通过PDOStatement对象中的bindParam()方法,把参数绑定到准
 
备好的查询中相应的占位符上
bindParam(mixed parameter,mixed & variable[,int data_type[,int length[,mixed driver_options]]])
第一个参数是必须的,如果在准备好的查询中,占位符语法使用名字参数时,将名字参数字符串作为第一个参数,如果占位
 
符语法使用问号参数时,将准备好的查询中列值占位符的索引偏移量,作为该方法的第一个参数提供
第二个参数也是必须的,提供赋给第一个参数所指定的占位符的值,它需要按引用传递,在结合准备存储过程使用此方时,
 
可以根据存储过程的某个动作修改这个值,因为该参数是按引用传递,所以只能提供变量作为参数,不能直接提供数值
第三个参数data_type是可选值,显示地为当前绑定的参数设置数据类型,可以是以下值。
PDO::PARAM_BOOL
PDO::PARAM_NULL
PDO::PARAM_INT
PDO::PARAM_STR
PDO::PARAM_LOB
PDO::PARAM_STMT
PDO::PARAM_INPUT_OUTPUT
第四个参数length是可选项,用于指定数据类型的长度,当在第三个参数中使用PDO::PARAM_INPUT_OUTPUT数据类型时必须使
 
用这个参数
第五个参数driver_options是可选项,通过该参数提供任何数据库驱动程序特定的选项。
查询中使用名字参数的绑定示例如下
<?php
$query = "insert into contactinfo(name,address,phone) values (:name,:address,:phone)";
$stmt = $dbh->prepare($query);
$name = 'zxh';
$address = 'tianjin';
$phone = '15822422406';
$stmt->bindParam(':name',$name);
$stmt->bindParam(':address',$address);
$stmt->bindParam(':phone',$phone);
?>
查询中使用问号参数的绑定示例如下所示,并在绑定时通过第三个参数显示指定数据类型:
<?php
$query = "insert into contactinfo(name,address,phone) values (?,?,?)";
$stmt = $dbh->prepare($query);
$name = 'zxh';
$address = 'tianjin';
$phone = '15822422406';
$stmt->bindParam(1,$name,PDO::PARAM_STR);
$stmt->bindParam(2,$address,PDO::PARAM_STR);
$stmt->bindParam(3,$phone,PDO::PARAM_STR,20);
?>
 
4、执行准备好的查询
 
当准备好查询并绑定了相应的参数,就可以通过调用PDOStatement类对象中的execute()方法反复执行了
 
<?php
$query = "insert into contactinfo(name,address,phone) values (?,?,?)";
$stmt = $dbh->prepare($query);
$name = 'zxh';
$address = 'tianjin';
$phone = '15822422406';
$stmt->bindParam(1,$name,PDO::PARAM_STR);
$stmt->bindParam(2,$address,PDO::PARAM_STR);
$stmt->bindParam(3,$phone,PDO::PARAM_STR,20);
$stmt->execute();
 
$name = 'zxh5566';
$address = 'hedong';
$phone = '15822422406';
$stmt->execute();
 
?>
 
如果你只是要传递输入参数,并且有许多这样的参数要传递,那么你会觉得下面所示的快捷语法非常有用,是通过execute()
 
方法中提供一个可选参数,该参数由准备查询中的命名参数占位符组成的数组,这是第二种为预处理查询再执行中替换输入
 
参数的方式。此方式省去了$stmt->bindParam()方法的调用
 
<?php
$query = "insert into contactinfo(name,address,phone) values (:name,:address,:phone)";
$stmt = $dbh->prepare($query);
$stmt->execute(array(':name'=>'zxh',':address'=>'tianjin',':phone'=>'15822422406'));
?>
上一篇:PDO如何执行SQL语句
下一篇: PDO获取数据