PHP的PDO预处理语句与存储过程


Posted in PHP onJanuary 27, 2019

PHP PDO 预处理语句与存储过程

很多更成熟的数据库都支持预处理语句的概念。

什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:

  • 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。
  • 提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

预处理语句如此有用,以至于它们唯一的特性是在驱动程序不支持的时PDO 将模拟处理。这样可以确保不管数据库是否具有这样的功能,都可以确保应用程序可以用相同的数据访问模式。

用预处理语句进行重复插入

下面例子通过用 name 和 value 替代相应的命名占位符来执行一个插入查询

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();
// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>

用预处理语句进行重复插入

下面例子通过用 name 和 value 取代 ? 占位符的位置来执行一条插入查询。

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();
// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>

使用预处理语句获取数据

下面例子获取数据基于键值已提供的形式。用户的输入被自动用引号括起来,因此不会有 SQL 注入攻击的危险。

<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
 while ($row = $stmt->fetch()) {
  print_r($row);
 }
}
?>

如果数据库驱动支持,应用程序还可以绑定输出和输入参数.输出参数通常用于从存储过程获取值。输出参数使用起来比输入参数要稍微复杂一些,因为当绑定一个输出参数时,必须知道给定参数的长度。如果为参数绑定的值大于建议的长度,就会产生一个错误。

带输出参数调用存储过程

<?php
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// 调用存储过程
$stmt->execute();
print "procedure returned $return_value\n";
?>

还可以指定同时具有输入和输出值的参数,其语法类似于输出参数。在下一个例子中,字符串"hello"被传递给存储过程,当存储过程返回时,hello 被替换为该存储过程返回的值。

带输入/输出参数调用存储过程

<?php
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// 调用存储过程
$stmt->execute();
print "procedure returned $value\n";
?>

占位符的无效使用

<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name']));
// 占位符必须被用在整个值的位置
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(array("%$_GET[name]%"));
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
php explode函数实例代码
Feb 27 PHP
php根据日期判断星座的函数分享
Feb 13 PHP
PHP静态文件生成类实例
Nov 29 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
四个PHP非常实用的功能
Sep 29 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 PHP
PHP中数组转换为SimpleXML教程
Jan 27 #PHP
实例讲解php实现多线程
Jan 27 #PHP
php中访问修饰符的知识点总结
Jan 27 #PHP
实例讲解php将字符串输出到HTML
Jan 27 #PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 #PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 #PHP
PHP的PDO事务与自动提交
Jan 24 #PHP
You might like
PHP读取xml方法介绍
2013/01/12 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
可插入图片的TEXT文本框
2013/12/27 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
解决Django中多条件查询的问题
2019/07/18 Python
Numpy的简单用法小结
2019/08/28 Python
Python实现扫码工具的示例代码
2020/10/09 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
非常详细的C#面试题集
2016/07/13 面试题
小学教师个人先进事迹材料
2014/05/17 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
党员承诺书格式范文
2015/04/28 职场文书
行政答辩状范文
2015/05/21 职场文书
物业保洁员管理制度
2015/08/05 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript