SQL预处理语句(Prepared Statements)
2013-12-19 10:19
92 查看
许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个主要的优点:
查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(然而,如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)。
正因为预处理语句是如此有用,它成了PDO唯一为不支持此特性的数据库提供的模拟实现。这使你可以使用统一的数据访问规范而不必关心数据库本身是否具备此特性。
其实主流的PHP框架都支持Prepared Statements,而且要简单很多。下面是ThinkPHP模型支持的例子:
查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(然而,如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)。
正因为预处理语句是如此有用,它成了PDO唯一为不支持此特性的数据库提供的模拟实现。这使你可以使用统一的数据访问规范而不必关心数据库本身是否具备此特性。
相关文章推荐
- windows mysql 自动备份的几种方法
- mysql 无法启动时,告诉你一个比较二的秘密
- SQLite3基础教程(二)
- MYSQL 不能插入中文!!!
- SQLite3基础教程(一)
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- Sql FAQ
- oracle sql-大全
- oracle 11g x64在WIN7 64位旗舰版 安装(york测试通过2013-12-19)
- Oracle Function INSTR
- oracle中的数值函数
- Discuz!NT中的Redis架构设计
- Oracle编辑数据时提示:这些查询结果不可更新,请使用ROWI或者SELECT……FOR UPDATE获得可更新结果。
- SQL 分割字符串
- 数据库综合系列 之 存储过程
- 数据库设计(一、二、三及BCNF范式)
- Mysql 环形复制
- sqlserver 错误:对象名"XXXX"无效
- mysql互为主从复制
- Mysql 复制步骤