预处理
1.mysql预处理
定义:预处理prepare,是指客户端将要执行的SQL先发送给服务器,服务器先进行编译,不执行.等客户端需要服务器端执行的时候,发送一条执行指令,让服务器再执行已经提前处理好(预处理)的SQL指令.
①预处理流程:预处理流程是相对于普通sql执行流程的,普通的是客户端与服务器端一对一一次性的服务,而预处理可能是一对一但多次的服务.
②实现预处理:预处理的步骤最开始会比普通SQL多执行一步,但是后续会接受服务器端的响应时间,提升服务器端的服务效率.预处理步骤如下:
- 发送预处理: prepare 预处理名字 from '要重复执行的指令';
- 执行预处理: execute 预处理名字;
③预处理占位:如果一条SQL本身就是重复多次,那么还不见得预处理有什么优势,毕竟这样固定操作并不是特别多.更多的时候是需要条件变化的.因此预处理可以进行预处理占位,在执行的时候把数据填入即可实现不同的sql查询结果.
- 预处理占位符: 在预处理指令中要执行的sql指令,使用?来代替未知数据部分
- 携带数据执行预处理(using): 在执行预处理的时候将对应数据携带到预处理指令中.注意只能使用变量!
④预处理可以同时设定多个占位符,在执行预处理的时候传入到对应的参数即可(顺序匹配)
⑤预处理在mysql中,针对一个客户端不能出现同名预处理名,如果预处理使用完毕,我们可以把预处理删掉,以保证后续使用的方便.语法: drop prepare 预处理名;
总结
2.PDO预处理
定义:PDO预处理,是PDO封装了一套特定的方法,在方法中做了一些优化操作,使得开发人员可以便捷的用来实现预处理.
①PDO中预处理提供了1套方法机制,主要由以下几个方法组成:
- PDO::Prepare(): 发送预处理指令.只需提供指令即可.不需要prepare 名字 from.成功得到一个PDOStatement对象,失败返回FALSE(或者异常错误).
- PDOStatement::bindParam(): 绑定预处理所需要的参数.只能绑定变量(引用传递)
- PDOStatement::bindValue(): 绑定预处理所需要的参数.可以绑定值(值传递)
- PDOStatement::execute(): 执行预处理,成功返回true,失败返回false
②PDO发送预处理指令:使用PDO::prepare()方法发送预处理指令.
③绑定预处理参数:如果预处理需要携带参数,使用PDOStatement::bindParam()/bindValue()进行参数绑定
- PDOStatement::bindValue()
注意:如果在发送预处理指令的时候,使用的是?作为占位符,那么我们在进行数据绑定的时候,是按照顺序进行绑定的.起始位置从1开始.多个占位符依此类推
- PDOStatement::bindParam()
④执行预处理:使用PDOStatement::execute()方法:
总结
3.PDO预处理数据绑定
定义:数据绑定,是指定义预处理指令时使用占位符代替后续执行预处理时的实际数据.
①在PDO中PDOStatement::execute本身是可以直接进行数据绑定的.即在参数中增加对应的占位符数据,以数组形式传入
②PDOStatement::bindParam()和PDOStatement::bindValue()区别
- 二者都可以实现占位符绑定
- bindValue()既可以绑定变量(值传递)也可以是数据常量;bindParam()只能绑定变量(引用传递)
- 因为bindParam()绑定的是变量(引用传递),所以如果绑定的变量发生改变,会直接影响后续的execute结果