• 售前

  • 售后

热门帖子
入门百科

PHP的PDO预处置惩罚语句与存储过程

[复制链接]
白刃玄衣及 显示全部楼层 发表于 2021-10-26 13:58:15 |阅读模式 打印 上一主题 下一主题
PHP PDO 预处置惩罚语句与存储过程
许多更成熟的数据库都支持预处置惩罚语句的概念。
什么是预处置惩罚语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以利用变量参数进行定制。预处置惩罚语句可以带来两大好处:
      
  • 查询仅需分析(或预处置惩罚)一次,但可以用雷同或差别的参数实验多次。当查询准备好后,数据库将分析、编译和优化实验该查询的计划。对于复杂的查询,此过程要花费较长的时间,假如必要以差别参数多次重复雷同的查询,那么该过程将大大降低应用程序的速度。通过利用预处置惩罚语句,可以制止重复分析/编译/优化周期。简言之,预处置惩罚语句占用更少的资源,因而运行得更快。  
  • 提供给预处置惩罚语句的参数不必要用引号括起来,驱动程序会自动处置惩罚。假如应用程序只利用预处置惩罚语句,可以确保不会发生SQL 注入。(然而,假如查询的其他部门是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。
预处置惩罚语句如此有用,以至于它们唯一的特性是在驱动程序不支持的时PDO 将模仿处置惩罚。这样可以确保不管数据库是否具有这样的功能,都可以确保应用程序可以用雷同的数据访问模式。
用预处置惩罚语句进行重复插入
下面例子通过用 name 和 value 更换相应的定名占位符来实验一个插入查询
  1. <?php
  2. $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
  3. $stmt->bindParam(':name', $name);
  4. $stmt->bindParam(':value', $value);
  5. // 插入一行
  6. $name = 'one';
  7. $value = 1;
  8. $stmt->execute();
  9. // 用不同的值插入另一行
  10. $name = 'two';
  11. $value = 2;
  12. $stmt->execute();
  13. ?>
复制代码
用预处置惩罚语句进行重复插入
下面例子通过用 name 和 value 代替 ? 占位符的位置来实验一条插入查询。
  1. <?php
  2. $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
  3. $stmt->bindParam(1, $name);
  4. $stmt->bindParam(2, $value);
  5. // 插入一行
  6. $name = 'one';
  7. $value = 1;
  8. $stmt->execute();
  9. // 用不同的值插入另一行
  10. $name = 'two';
  11. $value = 2;
  12. $stmt->execute();
  13. ?>
复制代码
利用预处置惩罚语句获取数据
下面例子获取数据基于键值已提供的情势。用户的输入被自动用引号括起来,因此不会有 SQL 注入攻击的危险。
  1. <?php
  2. $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
  3. if ($stmt->execute(array($_GET['name']))) {
  4. while ($row = $stmt->fetch()) {
  5.   print_r($row);
  6. }
  7. }
  8. ?>
复制代码
假如数据库驱动支持,应用程序还可以绑定输出和输入参数.输出参数通常用于从存储过程获取值。输出参数利用起来比输入参数要轻微复杂一些,由于当绑定一个输出参数时,必须知道给定参数的长度。假如为参数绑定的值大于建议的长度,就会产生一个错误。
带输出参数调用存储过程
  1. <?php
  2. $stmt = $dbh->prepare("CALL sp_returns_string(?)");
  3. $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
  4. // 调用存储过程
  5. $stmt->execute();
  6. print "procedure returned $return_value\n";
  7. ?>
复制代码
还可以指定同时具有输入和输出值的参数,其语法类似于输出参数。在下一个例子中,字符串"hello"被通报给存储过程,当存储过程返回时,hello 被更换为该存储过程返回的值。
带输入/输出参数调用存储过程
  1. <?php
  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. ?>
复制代码
占位符的无效利用
  1. <?php
  2. $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
  3. $stmt->execute(array($_GET['name']));
  4. // 占位符必须被用在整个值的位置
  5. $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
  6. $stmt->execute(array("%$_GET[name]%"));
  7. ?>
复制代码
总结
以上就是这篇文章的全部内容了,盼望本文的内容对大家的学习大概工作具有肯定的参考学习价值,谢谢大家对草根技能分享的支持。假如你想相识更多相干内容请查看下面相干链接

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作