搜索

首页  >  问答  >  正文

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?

我想大声告诉你我想大声告诉你2729 天前774

全部回复(1)我来回复

  • 阿神

    阿神2017-06-05 11:09:31

    1.PDO::query执行一条SQL语句,如果通过,则返回一个PDOStatement对象。PDO::query函数有个“非常好处”,就是可以直接遍历这个返回的记录集。
    2.PDO::exec执行一条SQL语句,并返回受影响的行数。此函数不会返回结果集合。官方建议:
    对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
    对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。
    PDO::exec支持SELECT/DELETE/UPDATE/INSERT等全部SQL语句执行,所以相比PDO query()函数功能要强大的多。由于只返回受影响的函数,所以,如果执行SELECT则无法得到PDOStatement对象,故也无法遍历结果集,只能按照官方建议去使用query或execute函数。。
    3.prepare的原理是这样的,预先把sql语句发送给sql server进行编译,等exec的时候再真正的执行。一次编译,多次执行。如果只是一次查询的话,prepare和query效率基本相当。如果多次执行,prepare的效率就会提现出来。另外并不是所有sql注入都可以防止,where in(“ ”)这样的就不行。

    回复
    0
  • 取消回复