一分钟带你了解PHP中的预处理语句及事务

本篇文章给大家介绍一下php中的预处理语句及事务。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

一分钟带你了解PHP中的预处理语句及事务

PHP中的PDO操作学习(二)预处理语句及事务

今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现。只不过大部分情况下,大家都在使用框架,手写的机会非常少。

预处理语句功能

预处理语句就是准备好一个要执行的语句,然后返回一个 PDOStatement 对象。一般我们会使用 PDOStatement 对象的 execute() 方法来执行这条语句。为什么叫预处理呢?因为它可以让我们多次调用这条语句,并且可以通过占位符来替换语句中的字段条件。相比直接使用 PDO 对象的 query() 或者 exec() 来说,预处理的效率更高,它可以让客户端/服务器缓存查询和元信息。当然,更加重要的一点是,占位符的应用可以有效的防止基本的 SQL 注入攻击,我们不需要手动地给 SQL 语句添加引号,直接让预处理来解决这个问题,相信这一点是大家都学习过的知识,也是我们在面试时最常见到的问题之一。

// 使用 :name 形式创建一个只进游标的 PDOStatement 对象$stmt = $pdo->prepare("select * from zyblog_test_user where username = :username", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);var_dump($stmt);// object(PDOStatement)#2 (1) {//     ["queryString"]=>//     string(57) "select * from zyblog_test_user where username = :username"//   }$stmt->execute([':username' => 'aaa']);$aUser = $stmt->fetchAll();$stmt->execute([':username' => 'bbb']);$bUser = $stmt->fetchAll();var_dump($aUser);// array(1) {//     [0]=>//     array(8) {//       ["id"]=>//       string(1) "1"//       [0]=>//       string(1) "1"//       ["username"]=>//       string(3) "aaa"//       ……var_dump($bUser);// array(1) {//     [0]=>//     array(8) {//       ["id"]=>//       string(1) "2"//       [0]=>//       string(1) "2"//       ["username"]=>//       string(3) "bbb"//       ……

登录后复制

prepare() 方法的第一个参数就是我们需要执行的 SQL 语句,在这段代码中,我们使用的是 :xxx 形式的占位符,所以在调用 prepare() 方法返回的 PDOStatement 对象的 execute() 方法时,我们需要指定占位符的值。在代码中,我们使用这一条 SQL 语句,通过替换不同的占位符内容,实现了两次查询。

立即学习“PHP免费学习笔记(深入)”;

prepare() 方法的第二个参数是为返回的 PDOStatement 对象设置的属性。常见用法是:设置 PDO::ATTR_CURSOR 为 PDO::CURSOR_SCROLL,将得到可滚动的光标。 

某些驱动有驱动级的选项,在 prepare 时就设置。PDO::ATTR_CURSOR 是设置数据库游标的类型,而 PDO::CURSOR_FWDONLY 的意思是创建一个只进游标的 PDOStatement 对象。此为默认的游标选项,因为此游标最快且是 PHP 中最常用的数据访问模式。关于数据库游标的知识大家可以自行查阅相关的内容。

此外,PDOStatement 还可以通过 bindParam() 方法来绑定占位符数据,我们将在后面学习 PDOStatement 对象相关的文章中继续学习。

接下来,我们再看一下使用 ? 号占位符来实现查询,? 号占位符在绑定的时候是以下标形式进行绑定的。

// 使用 ? 形式创建一个只进游标的 PDOStatement 对象$stmt = $pdo->prepare("select * from zyblog_test_user where username = ?", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);$stmt->execute(['aaa']);$aUser = $stmt->fetchAll();var_dump($aUser);// array(1) {//     [0]=>//     array(8) {//       ["id"]=>//       string(1) "1"//       [0]=>//       string(1) "1"//       ["username"]=>//       string(3) "aaa"//       ……

登录后复制

当然,这种预编译语句不仅限于查询语句,增、删、改都是可以的,而且也都是支持占位符的。在 PHP中操作数据库的预处理语句 这篇文章中有详细的示例。

事务能力

关于事务想必大家也都有一定的了解,所以在这里也不介绍具体的概念了,我们只看看在 PDO 中事务是如何实现的。首先,我们先看下在没有事务的情况下会发生什么。

$pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)"); // 成功插入$pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 报错停止整个PHP脚本执行// Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist

登录后复制

假设这两个表需要同时更新,但第二条语句报错了。在没有事务的情况下,我们第一条数据是会正常插入成功的,这并不是我们需要的结果。在这时,就需要事务能力的帮助,让我们能够让两个表要么同时成功,要么同时失败。

try {    // 开始事务    $pdo->beginTransaction();    $pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)");    $pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 不存在的表    // 提交事务    $pdo->commit();} catch (Exception $e) {    // 回滚事务    $pdo->rollBack();    // 输出报错信息    echo "Failed: " . $e->getMessage(), PHP_EOL;    // Failed: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist}

登录后复制

首先就是 beginTransaction() 方法,它是用来关闭数据库的自动提交,并启动一个事务,在这个方法之后,只有遇到 commit() 或者 rollBack() 方法后才会关闭这个事务。

commit() 方法就是操作过程中没有出现意外的话,就将在 beginTransaction() 之后的所有数据操作一起打包提交。

rollBack() 是回滚数据,当 beginTransaction() 之后的某一条语句或者代码出现问题时,回滚之前的数据操作,保证 beginTransaction() 之后的所有语句要么都成功,要么都失败。

就是这样三个简单的函数,就为我们完成了整个事务操作。关于事务的深入学习我们会在将来深入地研究 MySQL 时再进行探讨。在这里我们需要注意的是,PDO 对象最好指定错误模式为抛出异常,如果不指定错误模式的话,事务中出现的错误也不会直接报错,而是返回错误码,我们需要通过错误码来确定是否提交或回滚。这样远没有异常机制来的简洁直观。

总结

我们简单的梳理并学习了一下 PDO 中的预处理和事务相关的知识,接下来就要进入 PDOStatement 对象相关内容的学习。PDOStatement 对象就是 PDO 的预处理对象,也就是在日常开发中我们会接触到的最多的数据操作对象。这块可是重点内容,大家可不能松懈了哦!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E7%9A%84PDO%E6%93%8D%E4%BD%9C%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%8C%EF%BC%89%E9%A2%84%E5%A4%84%E7%90%86%E8%AF%AD%E5%8F%A5%E5%8F%8A%E4%BA%8B%E5%8A%A1.php

登录后复制

推荐学习:php视频教程

以上就是一分钟带你了解PHP中的预处理语句及事务的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2511632.html

(0)
上一篇 2025年3月5日 14:36:56
下一篇 2025年3月5日 14:37:17

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php 二维数组怎么删除某个字段

    php二维数组删除某个字段的方法:首先创建一个PHP示例文件;然后使用array_walk和array_diff两个函数来删除数组中某个字段即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 php 二维数组怎么…

    2025年3月5日
    000
  • php怎么安装xdebug扩展

    php安装xdebug扩展的方法:1、进入xdebug官网;2、在用户下载引导页面粘贴当前phpinfo信息;3、下载插件,并将插件放于指定目录;4、加入xdebug设置;5、查看插件是否安装成功;6、配置phpstorm即可。 本文操作环…

    2025年3月5日 编程技术
    200
  • linux php fopen 失败原因是什么

    linux php fopen 失败原因是因为设置权限了,其解决办法就是执行命令“setenforce 0”临时关闭“selinux”即可。 本文操作环境:centOS6.8系统、PHP7.1版,DELL G3电脑 linux php fo…

    2025年3月5日
    200
  • php怎么设置content type

    在PHP中可以通过header函数来设置content type,设置代码如“header( ‘Content-Type:text/html;charset=utf-8 ‘);”。 本文操作环境:Windows7系统…

    2025年3月5日
    200
  • php怎么设置请求头信息

    php设置请求头信息的方法:1、使用header函数设置请求头信息;2、通过fsockopen函数设置请求头信息;3、通过使用curl组件设置请求头信息。 本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑 php怎么设…

    2025年3月5日
    200
  • php怎么实现ipv6转成ipv4

    php实现ipv6转成ipv4的方法:首先创建一个PHP示例文件;然后定义一个ipv6地址;最后通过hexdec以及substr函数将ipv6地址转为ipv4地址即可。 本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑…

    2025年3月5日
    200
  • php怎么将时间戳转化为时间格式

    在php中可以通过“date()”函数将时间戳转化为时间格式,其转换语法是“date(format,timestamp)”,参数format规定时间戳的格式。 本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑 php怎…

    2025年3月5日
    200
  • php 扩展不显示不出来怎么办

    php扩展不显示不出来是因为php-fpm启动时,没指定php.ini,其解决办法就是指定php.ini文件来启动“php-fpm”服务即可。 本文操作环境:linux5.9.8系统、PHP5.6版,DELL G3电脑 php 扩展不显示不…

    2025年3月5日
    200
  • php怎么只取小数点后两位

    php只取小数点后两位的方法:1、利用round对浮点数进行四舍五入;2、利用sprintf格式化字符串;3、利用千位分组来格式化数字。 本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑 php怎么只取小数点后两位?P…

    2025年3月5日
    200
  • 三分钟带你了解PHP中的预处理类及绑定数据

    本篇文章给大家介绍一下php中的预处理类及绑定数据。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 PHP中的PDO操作学习(三)预处理类及绑定数据 要说 PDO 中最强大的功能,除了为不同的数据库提供了统一的接口之外,更…

    2025年3月5日
    200

发表回复

登录后才能评论