关于PDO预处理与事务的问题。
//使用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积分~
来为老师/同学的回答评分吧
0 星