关于PDO预处理与事务的问题。

关于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();
?>

问题:

  1. PDO预处理与事务可以结合使用么,老师我以上的代码有问题么?逻辑上就是这么做的么?

  2. insert语句中预填写的值不是字符串而是数值,是不是不能加引号?如:$sql = "INSERT INTO `users`(`id`,`name`,`age`) VALUE(:id,':name',':age');"; 注意这里的id值是int类型在SQL语句里的VALUE(:id,':name',':age')中的:id 不能加引号对么?

  3. 利用遍历,绑定参数,这样行不行?看到资料里说bindParam($k,$&v)不能直接foreach,但使用bindValue结合foreach这样行不行?

  4. execute的参数是什么?莫非是SQL语句?麻烦老师讲讲~

  5. 这个问题最重要~~麻烦老师了!pdo预处理 非查询 语句的返回值可以直接用来判断是否执行成功?查询语句返回的是TRUE?

  6. 那么,pdo非预处理非查询 语句与 查询 语句与 预处理 的有区别么?我貌似记得不太一样,麻烦老师讲讲。

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

您好,1.同学在运行自己的代码时,结果是否成功?结果是什么,插入数据是否成功?

2.可以不添加。

3.关于bindParam是否可以使用foreach,bindValue使用foreach参考如下:https://blog.csdn.net/Drug_/article/details/79867110

4.关于execute的具体说明:

http://img1.sycdn.imooc.com//climg/5c341cb00001cbc508150569.jpg

5.例如修改时使用execute,返回值为布尔类型,可以进行判断。查询使用execute返回值也是布尔类型。

6.使用预处理语句会比多次执行查询效率高的多,原因如下:

1. 服务器只需要解析一次查询,这节约了解析和其他的开销
2. 因为服务器缓存了一部分执行计划,所以它只需要执行某些优化步骤一次
3. 整个查询不会被发送到服务器,只有参数才会被发送,这减少了网络流量。
4. Mysql 直接把参数保存在服务器的缓冲区内,不需要在内存中到处copy 数据
5. 预处理语句对安全性也有好处,它不需要在应用程序中对值进行转义和加引号,这更加方便,并且减少了遭SQL 注入攻击的可能性。 

建议同学提问时分开提问,方便后期回顾。祝学习愉快!

  • 轩辕小齐V 提问者 #1
    老师您好 关于问题1 我没有权限使用 mmapp 这个软件,电脑是公司的,我的代码是在记事本里写的。周末可以测试,这不是着急继续学写么,一共就剩100来天,麻烦辛苦老师了
    2019-01-08 13:53:10
  • 轩辕小齐V 提问者 #2
    老师您好!关于问题3 你我看的是同一份资料,但是资料里没确定bindValue使用foreach行不行~~麻烦您了,多多指点。
    2019-01-08 14:12:18
  • 轩辕小齐V 提问者 #3
    问题5,以后一定分开提问,谢谢!
    2019-01-08 14:14:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师