首页 » PHP教程 » phpprepare毛病技巧_PHP中的PDO操作进修二预处理语句及事务

phpprepare毛病技巧_PHP中的PDO操作进修二预处理语句及事务

duote123 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

//利用:name形式创建一个只进游标的PDOStatement工具$stmt=$pdo->prepare("selectfromzyblog_test_userwhereusername=:username",[PDO::ATTR_CURSOR=>PDO::CURSOR_FWDONLY]);var_dump($stmt);//object(PDOStatement)#2(1){//["queryString"]=>//string(57)"selectfromzyblog_test_userwhereusername=: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 语句,通过更换不同的占位符内容,实现了两次查询。

prepare() 方法的第二个参数是为返回的 PDOStatement 工具设置的属性。
常见用法是:设置 PDO::ATTR_CURSOR 为 PDO::CURSOR_SCROLL,将得到可滚动的光标。
某些驱动有驱动级的选项,在 prepare 时就设置。
PDO::ATTR_CURSOR 是设置数据库游标的类型,而 PDO::CURSOR_FWDONLY 的意思是创建一个只进游标的 PDOStatement 工具。
此为默认的游标选项,由于此游标最快且是 PHP 中最常用的数据访问模式。
关于数据库游标的知识大家可以自行查阅干系的内容。

phpprepare毛病技巧_PHP中的PDO操作进修二预处理语句及事务

此外,PDOStatement 还可以通过 bindParam() 方法来绑定占位符数据,我们将在后面学习 PDOStatement 工具干系的文章中连续学习。

phpprepare毛病技巧_PHP中的PDO操作进修二预处理语句及事务
(图片来自网络侵删)

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

//利用?形式创建一个只进游标的PDOStatement工具$stmt=$pdo->prepare("selectfromzyblog_test_userwhereusername=?",[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("insertintotran_innodb(name,age)values('Joe',12)");//成功插入$pdo->exec("insertintotran_innodb2(name,age)values('Joe',12)");//报错停滞全体PHP脚本实行//Fatalerror:UncaughtPDOException:SQLSTATE[42S02]:Basetableorviewnotfound:1146Table'blog_test.tran_innodb2'doesn'texist

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

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

首先便是 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

参考文档:

https://www.php.net/manual/zh/pdo.prepare.php

https://www.php.net/manual/zh/pdo.begintransaction.php

https://www.php.net/manual/zh/pdo.commit.php

https://www.php.net/manual/zh/pdo.rollback.php

标签:

相关文章