pdo 预处理的问题

发布于 2021-11-29 01:06:19 字数 958 浏览 856 评论 2

pdo预处理,直接使用prepare()传递数组,和通过绑定变量bindParam().实现有什么不同.下面是两个例子,我看到某些资料说第一种效率差一些,是不是这种情况?
使用数组指定预处理变量
<?php
$pdo=new PDO($dsn,$user,$pwd);  // 连接数据库
$query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";
$result=$pdo->prepare($query);

$result->execute(array(':xuesheng'=>'赵天平',':yuwen'=>'90'));  // 执行一次
$result->execute(array(':xuesheng'=>'张冬雪',':yuwen'=>'115')); // 再执行一次
?>


通过bindParam实现的
<?php
$pdo=new PDO($dsn,$user,$pwd);  // 连接数据库
$query="INSERT INTO tb_chengji SET xuesheng=:xuesheng,yuwen=:yuwen";
$result=$pdo->prepare($query);

$xuesheng='赵天平';
$yuwen='90';
$result->bindParam(':xuesheng',$xuesheng);
$result->bindParam(':yuwen',$yuwen);
$result->execute();

$xuesheng='张冬雪';
$yuwen='115';
$result->bindParam(':xuesheng',$xuesheng);
$result->bindParam(':yuwen',$yuwen);
$result->execute();
?>


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泪冰清 2021-12-03 23:16:25

SQL经过prepare才叫预处理,PDO的exec和query只是执行SQL语句,不是预处理.

execute里放数组,跟使用bindParam都可以达到绑定参数的作用,效果是一样的.

方法1(问号占位符)

$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');

$stmt->execute(array($title,$content,$id));

//execute中所有值视作PDO::PARAM_STR处理

方法1(命名占位符)

$stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id');

$stmt->execute(array(':title' => $title,':content' => $content,':id' => $id));

//execute中所有值视作PDO::PARAM_STR处理

方法2(问号占位符)

$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');

$stmt->bindParam(1, $title,   PDO::PARAM_STR);

$stmt->bindParam(2, $content, PDO::PARAM_STR);

$stmt->bindParam(3, $id,      PDO::PARAM_INT);

$stmt->execute();

方法2(命名占位符)

$stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id');

$stmt->bindParam(':title',   $title,   PDO::PARAM_STR);

$stmt->bindParam(':content', $content, PDO::PARAM_STR);

$stmt->bindParam(':id',      $id,      PDO::PARAM_INT);

$stmt->execute();

PDO对比MySQLi:

MySQLi只有一种写法(MySQLi不支持命名占位符)

$stmt->bind_param('ssi', $title, $content, $id);

更多:

PHP MySQLi/PDO_MySQL/PDO_SQLite CRUD(增查改删)

柒夜笙歌凉 2021-12-03 05:39:25

不重开帖子了,补充一下.在学习pdo预处理方式时遇到了三种语句写法:

1.$_sql = "INSERT INTO user (user,email) VALUES ('Lee','yc@gmail.com')";
$stmt=$pdo->prepare($_sql);
$stmt->execute();




2.$query="INSERT INTO chengji SET xuesheng=:xuesheng,yuwen=:yuwen";

$result=$pdo->prepare($query);

$result->execute(array(':xuesheng'=>'赵天平',':yuwen'=>'90'));  // 执行一次
3.$query="INSERT INTO chengji SET xuesheng=:xuesheng,yuwen=:yuwen";

$result=$pdo->prepare($query);

$xuesheng='赵天平';

$yuwen='90';

$result->bindParam(':xuesheng',$xuesheng);

$result->bindParam(':yuwen',$yuwen);

$result->execute();

这三种预处理语句,有啥区别了?在防止sql注入上效果是不是一样的?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文