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

12 php mysql sql pdo

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

我看到这里有两个PDO->query()PDO->exec().在被链接的页面,似乎PDO->query();是用于SELECT报表ONLY,并PDO->exec()用于UPDATE,INSERT,DELETE语句.现在,我是全新的,以PDO,所以我不知道什么是使用它的条款回事相当尚未,所以我将不胜感激为什么要使用不同的方法解释,为什么有不同的方法.

You*_*nse 19

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

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

prepare()/execute()改用,特别是对于UPDATE,INSERT,DELETE语句.

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

编辑:请注意,execute()仅返回TRUEFALSE表示操作成功.有关其他信息,例如受a影响的记录数,提供的UPDATE方法等rowCount().查看文档.

  • 对某个主题发表自己的看法总是有帮助的,特别是如果你熟悉它,但你应该尊重OP并至少回答原始问题. (2认同)

Bai*_*ker 14

查看PDO官方文档:

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

这两个函数都执行查询,但exec()只返回受影响的行数.这对于UPDATE没有返回任何有用内容的查询很有用,只有在知道是否修改了适当的行数时才有用.


Mik*_*ike 6

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

在此处输入图片说明

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

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

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

常见反对意见:

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

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

但是,如果我只是手动将字符串硬编码到查询中,那么在没有准备好的语句的情况下将它们直接放入其他查询中是安全的,对吗?

是的,它是安全的……暂时。也许今天我正在对其进行硬编码。明天我从数据库中提取它,然后我允许用户在数据库中编辑该字段。但是我会记得回去更新查询以使用准备好的语句来保证完整性吗?可能不是。任何时候在查询中发送值时,准备好的语句都是很好的做法。

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

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