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 相关文章推荐
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
PHP程序61条面向对象分析设计的经验小结
Nov 12 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
Oct 23 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
laravel 5 实现模板主题功能(续)
Mar 02 PHP
PHP多态代码实例
Jun 26 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
详解Yii2 rules 的验证规则
Dec 02 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
python进程与线程小结实例分析
Nov 11 PHP
php实现根据身份证获取精准年龄
Feb 26 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
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
PHP扩展开发入门教程
2015/02/26 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
js中的闭包学习心得
2018/02/06 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
实体的生命周期
2013/08/31 面试题
团员个人的自我评价
2013/12/02 职场文书
捐款倡议书范文
2014/02/02 职场文书
单位委托书怎么写
2014/08/02 职场文书
党代会心得体会
2014/09/04 职场文书
父亲节活动总结
2015/02/12 职场文书