PDO-> query()和PDO-> exec()之间的区别

时间:2013-05-05 04:21:11

标签: php mysql sql pdo

让对PDO的引用等于PDO对象而不是PDO本身 -

我看到herePDO->query()PDO->exec()。在已关联的页面中,PDO->query();仅用于SELECT语句,PDO->exec()用于UPDATEINSERT,{{1}语句。现在,我对PDO来说是全新的,所以我不确定在使用还是方面发生了什么,所以我很感激为什么要使用不同方法的解释,以及为什么有不同的方法。

3 个答案:

答案 0 :(得分:19)

尽管有任何理论上的差异,但无论如何都不应该使用这些功能 - 所以,没有什么值得关注的。

使用PDO的唯一原因是支持预备语句,但这些功能都没有提供。所以,不应该使用它们。

使用prepare()/execute()代替,特别是代表UPDATE,INSERT,DELETE语句。

请注意,虽然准备好的声明被广泛宣传为安全措施,但它只是为了引起人们的注意。但他们的真实目的是正确的查询格式。这也为您提供了安全性 - 因为格式正确的查询也无法注入 - 就像副作用一样。但是再次 - 格式化是一个主要目标,因为即使无法正确格式化也可能导致查询错误。

编辑: 请注意,execute()仅返回TRUEFALSE,表示操作成功。有关其他信息,例如受UPDATE影响的记录数,则会提供rowCount()等方法。请参阅docs

答案 1 :(得分:14)

查看official docs for PDO

  • PDO::exec() - “执行SQL语句并返回受影响的行数”
  • PDO::query() - “执行SQL语句,将结果集作为PDOStatement对象返回”

两个函数都执行查询,但exec()仅返回受影响的行数。这对于UPDATE查询非常有用,它不返回任何有用的内容,只知道是否修改了适当的行数。

答案 2 :(得分:1)

我制作了一个流程图,以尝试帮助您确定在任何给定情况下都应使用哪个:

enter image description here

PDOStatement::prepare()与绑定变量结合将:

  • 防止意外的语法错误
  • 防止SQL注入攻击
  • 使具有不同值的重复查询更加有效。准备查询仅将查询发送到数据库服务器,而不发送值。 execute() PDOStatement时,您仅发送值而不查询。使用准备好的语句,用不同的值执行相同的查询10次会更有效。

在任何情况下,都切勿将用户输入直接放入查询中。但是,如果您的查询没有值,并且您决定使用PDO::query()而不是PDO::exec(),或者如果您使用PDOStatement::prepare()而不是其他两个,则不是安全问题。 ,但更多是效率问题。

常见异议:

但是,如果我从数据库中提取变量,该怎么办?如果我使用准备好的语句将其放入数据库中,那么可以安全地将它们直接放入其他查询中,而无需准备好的语句,对吗?

绝对不是。仅仅因为在插入数据库时​​使用了准备好的语句,并没有为将来的查询清理它。在后续查询中使用这些值时,您将需要再次使用准备好的语句。

但是,如果我只是手动将字符串硬编码到查询中,那么可以安全地将它们直接放入其他查询中而无需准备好的语句,对吗?

是的,现在很安全。也许今天我正在对其进行硬编码。明天我将其从数据库中拉出,然后再允许用户编辑数据库中的该字段。但是我是否记得要返回并更新查询以使用准备好的语句来保证完整性?可能不会。每当您在查询中发送值时,准备好的语句只是一种好习惯。

我可以直接将值放入查询吗?

例如,我唯一可以将值直接放入查询的时间就是发送布尔值(10),空字符串或NULL。在任何一种情况下,该值都将直接编码在查询中,而不是作为变量。