php - prepare与sql的开销?

查看:120
本文介绍了php - prepare与sql的开销?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

请教相同的SQL查询语句用prepare与query的开销是一样大的吗?
$sql = $pdo -> prepare("select * from table");
$sql -> execute();
$rs = $sql -> fetch(PDO :: FETCH_ASSOC);

$sql = $pdo -> query("select * from table");
$rs = $go -> fetch(PDO :: FETCH_ASSOC);
例如上面prepare与query查询是否效率一样?(忽略SQL语句注入)。
单条查询结果用哪一条比较好?
prepare是否在查询时会向数据库至少发送两次数据库?

关于PDO的prepare是否只适合于select?其他的update、insert into这两个操作呢?prepare用占位符可以有效防注入,但当?="abc./-+#$%`123"这些特殊符号(除非对其转义)时,执行语句却报错,
exec是否更适用于update、insert into?

解决方案

PHP 的 PDO里面有个选项,叫 ATTR_EMULATE_PREPARES

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

正式的prepare需要把这个设置成false。

prepare支持所有DML语句。 清单在此 https://dev.mysql.com/doc/ref... 几乎涵盖了所有日常能用到的语句

正式的prepare 需要和数据库服务器通信两次,一次prepare,一次填空。
query和exec只需要一次。

所以看起来prepare会慢。

但是prepare 之后,填空的速度是优化过的,格外快。

所以结论是,如果SQL服务器在本地,prepare和query在执行一次的时候几乎是速度一样的。
如果需要插入100次数据,需要prepare一次,填空100次,同等条件下(SQL服务器网络延迟相同),prepare的速度远远优于一条一条query执行。
如果客户端和SQL服务器距离差半个地球,那么query可能更快。

所以尽量统统用prepare吧,没毛病。一个是增加效率,一个是放注入。注入大部分都是发生在update 和insert上,结果这俩你想用exec,那还防个毛线。。。

你的执行语句却报错是你自己的问题,不信的话你把你相关PDO的代码和SQL错误代码贴出来。

这篇关于php - prepare与sql的开销?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆