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代码
Mar 08 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
PHP常用数组函数介绍
Jul 28 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php微信公众平台开发类实例
Apr 01 PHP
分享PHP守护进程类
Dec 30 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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安全配置
2006/10/09 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
Python中for循环详解
2014/01/17 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
24式加速你的Python(小结)
2019/06/13 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
商务英语求职自荐信范文
2013/12/24 职场文书
小学防溺水制度
2014/01/29 职场文书
总经理助理工作职责
2014/02/06 职场文书
基层党员对照检查材料
2014/09/24 职场文书
商务司机岗位职责
2015/04/10 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书