PDO 简介——预处理语句和存储过程

转载 2008年09月28日 18:16:00

许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个主要的优点:

  1. 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
  2. 传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(然而,如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)


正因为预处理语句是如此有用,它成了PDO唯一为不支持此特性的数据库提供的模拟实现。这使你可以使用统一的数据访问规范而不必关心数据库本身是否具备此特性。

  1. /*
  2. 使用预处理语句重复插入数据(1)
  3. 此示例演示了一个通过向命名占位符代入一个name和一个value值来执行的INSERT查询
  4. */
  5. $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
  6. $stmt->bindParam(':name'$name);
  7. $stmt->bindParam(':value'$value); //插入一行
  8. $name = 'one';
  9. $value = 1;
  10. $stmt->execute();//使用不同的值插入另一行
  11. $name = 'two';
  12. $value = 2;
  13. $stmt->execute();
  14. /*
  15. 使用预处理语句重复插入数据(2)
  16. 此示例演示了一个通过向用?表示的占位符代入一个name和一个value值来执行的INSERT查询
  17. */
  18. $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
  19. $stmt->bindParam(1, $name);
  20. $stmt->bindParam(2, $value); // 插入一行
  21. $name = 'one';
  22. $value = 1;
  23. $stmt->execute(); // 使用不同的值插入另一行
  24. $name = 'two';
  25. $value = 2;
  26. $stmt->execute();
  27. /*
  28. 通过预处理语句获取数据
  29. 此示例演示使用从表单获取的数据为关键值来执行查询获取数据。用户的输入会被自动添加引号,所以这儿不存在SQL注入攻击的危险。
  30. */
  31. $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
  32.     if ($stmt->execute(array($_GET['name']))) {
  33.         while ($row = $stmt->fetch()) {
  34.         print_r($row);
  35.     }
  36. }

如果数据库驱动支持,你也可以像绑定输入参数那样绑定输出参数。输出参数常用于存储过程的返回值。输出参数用起来比输入参数稍微复杂一些,使用时你必须知道它返回的参数值有多大。如果它返回的参数值比你建议的大,就会发生错误。

  1. //调用一个带有输出参数的存储过程
  2. $stmt = $dbh->prepare("CALL sp_returns_string(?)");
  3. $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); //执行存储过程
  4. $stmt->execute();
  5. print "procedure returned $return_value/n";

 

你也可以指定既代表输入又代表输出的参数,语法类似于输出参数。在下个代码示例中,“hello”字符串被传递到存储过程中,当它返回时,hello就会被存储过程的返回值取代。

  1. //调用一个带有输入/输出参数的存储过程
  2. $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
  3. $value = 'hello';
  4. $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
  5. // 执行存储过程
  6. $stmt->execute();
  7. print "procedure returned $value/n";
  8. //占位符的错误使用
  9. $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
  10. $stmt->execute(array($_GET['name'])); // 占位符必须用于整个值的位置(下面是正确的用法)
  11. $stmt = $dbh->prepare(”SELECT * FROM REGISTRY where name LIKE ?”);
  12. $stmt->execute(array(”%$_GET[name]%”));

PHP使用PDO调用sqlserver存储过程记录【分享个通用方法】

由于业务这边存储过程一直在sqlserver上面,所以要用php去调用它,然而我们本地的是windows,而线上又是linux,一开始使用Yii框架的一些机制去调用发现在本地一直都是好的然而到线上就不...
  • u012655332
  • u012655332
  • 2017年06月21日 08:45
  • 809

PDO 简介——预处理语句和存储过程

许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个...
  • qq_34625397
  • qq_34625397
  • 2016年06月07日 10:42
  • 672

前端学PHP之PDO预处理语句

前面的话   本来要把预处理语句和前面的基础操作写成一篇的。但是,由于博客园的限制,可能是因为长度超出,保存时总是报错,于是再开一篇。另一方面,相较于前面的exec()和query()语句来说,...
  • lHz76ttw1U
  • lHz76ttw1U
  • 2017年03月08日 16:25
  • 366

面向对象,PDO基础知识,PDO预处理,SQL事务处理

面向对象,PDO基础知识,PDO预处理,SQL事务处理
  • github_36885144
  • github_36885144
  • 2016年12月06日 15:42
  • 419

php学习笔记之PDO预处理

PDO预处理方法 prepare()// 用于执行查询SQL语句,返回PDOStatement对象 bindValue() //将值绑定到对应的一个参数,返回布尔值 bindParam()//将...
  • sdut406
  • sdut406
  • 2016年06月11日 23:27
  • 921

PHP5中PDO的简单使用

作者:heiyeluren http://blog.csdn.net/heiyeshuwu> 时间:2006-10-29 关键字:PHP PHP5 PDO 数据库抽象类 PDO(PHP D...
  • leo115
  • leo115
  • 2012年05月06日 10:27
  • 63366

[原创]PHP5中PDO的简单使用

PHP5中PDO的简单使用作者:heiyeluren http://blog.csdn.net/heiyeshuwu>时间:2006-10-29关键字:PHP PHP5 PDO 数据库抽象类 PDO(...
  • heiyeshuwu
  • heiyeshuwu
  • 2006年10月29日 21:15
  • 6825

PDO预处理语句PDOStatement对象使用总结

PDO预处理语句PDOStatement对象使用总结 PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的...
  • u011252402
  • u011252402
  • 2015年08月05日 08:40
  • 1283

DBO 预处理语句和存储过程

预处理语句可以带来两大好处: 查询只需要被解析(或准备)一次,但也可以与相同的或不同的参数执行多次。准备查询时,数据库将分析,编译和优化查询的执行计划。对于复杂的查询,这个过程可能需要比较​...
  • guobiaomzld
  • guobiaomzld
  • 2012年11月03日 14:51
  • 1055

pdo使用

PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的...
  • czh0423
  • czh0423
  • 2013年11月20日 16:55
  • 1314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PDO 简介——预处理语句和存储过程
举报原因:
原因补充:

(最多只允许输入30个字)