关于PDO预处理与事务的问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | //使用PDO预处理的方式添加数据 (数据库名test 表名 users 字段id、name、age header( "content-type:text/html;charset=utf-8" ); $dns = "mysql:host=localhost;dbname=test" ; $pdo = new PDO( $dns , 'root' , '' ); //设定字符集 $pdo -> exec ( "SET NAMES UTF8" ); //开始事务 $pdo ->beginTransaction(); //sql 语句 //首先insert语句中预填写的值不是字符串而是数值,是不是不用加引号? $sql = "INSERT INTO `users`(`id`,`name`,`age`) VALUE(:id,':name',':age');" ; $id = 1; $name = "小明" ; $age = 18; //编辑数组 //利用遍历绑定参数,这样行不行?看到资料里说bindParam($k,$&v)不能直接foreach,但bindValue这样行不行? $arr = array ( ':id' => $id , ':name' => $name , ':age' => $age ); //开始预处理 $stmt = $pdo ->prepare( $sql ); //绑定参数 foreach ( $arr as $k => $v ){ $stmt ->bindValue( $k , $v ); } //execute的参数是什么?莫非是SQL语句?麻烦老师讲讲~ $stmt ->execute(); $r1 = $stmt ->fetchAll(PDO::FETCH_ASSOC); //第二次 $id = 2; $name = "小慕" ; $age = 18; $arr = array ( ':id' => $id , ':name' => $name , ':age' => $age ); //开始预处理 $stmt = $pdo ->prepare( $sql ); //绑定参数 foreach ( $arr as $k => $v ){ $stmt ->bindValue( $k , $v ); } $stmt ->execute(); $r2 = $stmt ->fetchAll(PDO::FETCH_ASSOC); //第三次 $id = 3; $name = "imooc" ; $age = 18; $arr = array ( ':id' => $id , ':name' => $name , ':age' => $age ); //开始预处理 $stmt = $pdo ->prepare( $sql ); //绑定参数 foreach ( $arr as $k => $v ){ $stmt ->bindValue( $k , $v ); } $stmt ->execute(); $r3 = $stmt ->fetchAll(PDO::FETCH_ASSOC); //判断是否执行成功 //pdo预处理非查询查询语句的返回值可以直接用来判断是否执行成功?查询语句返回的是TRUE? //那么,pdo非预处理 的非查询语句与查询语句与预处理的有区别么? if (!( $r1 >0&& $r2 >0&& $r3 >0)){ $pdo ->rollBack(); } $pdo ->commit(); ?> |
问题:
PDO预处理与事务可以结合使用么,老师我以上的代码有问题么?逻辑上就是这么做的么?
insert语句中预填写的值不是字符串而是数值,是不是不能加引号?如:$sql = "INSERT INTO `users`(`id`,`name`,`age`) VALUE(:id,':name',':age');"; 注意这里的id值是int类型在SQL语句里的VALUE(:id,':name',':age')中的:id 不能加引号对么?
利用遍历,绑定参数,这样行不行?看到资料里说bindParam($k,$&v)不能直接foreach,但使用bindValue结合foreach这样行不行?
execute的参数是什么?莫非是SQL语句?麻烦老师讲讲~
这个问题最重要~~麻烦老师了!pdo预处理 非查询 语句的返回值可以直接用来判断是否执行成功?查询语句返回的是TRUE?
那么,pdo非预处理 的 非查询 语句与 查询 语句与 预处理 的有区别么?我貌似记得不太一样,麻烦老师讲讲。
正在回答
您好,1.同学在运行自己的代码时,结果是否成功?结果是什么,插入数据是否成功?
2.可以不添加。
3.关于bindParam是否可以使用foreach,bindValue使用foreach参考如下:https://blog.csdn.net/Drug_/article/details/79867110
4.关于execute的具体说明:
5.例如修改时使用execute,返回值为布尔类型,可以进行判断。查询使用execute返回值也是布尔类型。
6.使用预处理语句会比多次执行查询效率高的多,原因如下:
1. 服务器只需要解析一次查询,这节约了解析和其他的开销
2. 因为服务器缓存了一部分执行计划,所以它只需要执行某些优化步骤一次
3. 整个查询不会被发送到服务器,只有参数才会被发送,这减少了网络流量。
4. Mysql 直接把参数保存在服务器的缓冲区内,不需要在内存中到处copy 数据
5. 预处理语句对安全性也有好处,它不需要在应用程序中对值进行转义和加引号,这更加方便,并且减少了遭SQL 注入攻击的可能性。
建议同学提问时分开提问,方便后期回顾。祝学习愉快!
- 参与学习 人
- 提交作业 225 份
- 解答问题 3372 个
掌握用PHP开发互联网网站的必备功能,掌握当下主流的Linux系统开发,并熟练使用热门框架ThinkPhp开发电商团购项目,是通向PHP工程师必经之路。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧