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和XSL stylesheets转换XML文档
Oct 09 PHP
PHP 错误之引号中使用变量
May 04 PHP
php win下Socket方式发邮件类
Aug 21 PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php懒人函数 自动添加数据
Jun 28 PHP
php curl的深入解析
Jun 02 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
php单一接口的实现方法
Jun 20 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
IIS6的PHP最佳配置方法
2007/03/19 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
新页面打开实际尺寸的图片
2006/08/25 Javascript
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
JavaScript 常用函数
2009/12/30 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
医药代表个人的求职信分享
2013/12/08 职场文书
二年级数学教学反思
2014/01/21 职场文书
大学活动邀请函
2014/01/28 职场文书
新党章心得体会
2014/09/04 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书