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日期时间函数的高级应用技巧
May 16 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
php去掉文件前几行的方法
Jul 29 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
PHP实现随机发扑克牌
Apr 22 PHP
PHP开发API接口签名生成及验证操作示例
May 27 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的垃圾回收机制详解
2013/10/28 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
vue-cli如何引入bootstrap工具的方法
2017/10/19 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
使用django实现一个代码发布系统
2019/07/18 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
C#面试题
2016/05/06 面试题
节能环保标语
2014/06/12 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
购房委托书
2014/10/15 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
爱心助学感谢信
2015/01/21 职场文书
停课通知书
2015/04/24 职场文书
技术入股协议书
2016/03/22 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
Python内置的数据类型及使用方法
2022/04/13 Python