【问题标题】:PDO::exec() or PDO::query()?PDO::exec() 还是 PDO::query()?
【发布时间】:2023-04-03 15:14:01
【问题描述】:

我曾经将此作为选项之一(第 4 个参数)传递给 PDO 构造函数:

$aOptions[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";

但刚刚发现由于一些bug,它在Windows上的某些php版本上不起作用(在5.3中不起作用)。

现在我需要使用$pdo->exec("SET NAMES utf8"); 运行SET NAMES utf8

$pdo->query("SET NAMES utf8");

在实例化 pdo 对象之后。那么,我应该使用哪一个 - exec() 或 query()?

【问题讨论】:

  • 您发现有什么不同吗?
  • 很高兴看到其他人使用 PDO 而不是那些糟糕的 mysql_query 函数。 :)
  • 我已经用了很长时间了,但是最近才开始在我的家用电脑windows上开发,现在开始出现一些与windows相关的bug

标签: php utf-8 pdo


【解决方案1】:

使用PDO::EXEC 时,返回的结果不是PDOStatement,而是受影响行的整数。

使用PDO::QUERY 时,返回的结果是PDOStatement

所以答案取决于你需要对数据做什么,如果你需要运行查询而不对结果做任何事情,那么你应该使用exec 来执行查询,否则如果你需要行数,返回的数据应该使用pdo::query,然后使用调用返回的结果。


关于该错误,您可以采取多种解决方法

  • 安装PDO_MYSQL
  • MYSQL_ATTR_INIT_COMMAND 替换为1002
  • 将您的 PHP 更新到已通过并修补的最新稳定版本。

第二个问题可能在 64 位操作系统和某些 windows 配置上存在一些问题。

错误信息:http://bugs.php.net/bug.php?id=47224

【讨论】:

  • 我在 64 位 Windows 上,所以这可能是相关的。无论如何,我将只使用 $pdo->exec("SET NAMES utf8");在构造函数中,而不是将其作为参数传递。
  • 你有什么 PHP 版本?
【解决方案2】:

PDO::exec() 应该用于不返回结果集的查询,例如删除语句或“set”。当您期望返回结果集时,应使用 PDO::query()。它向您返回一个 PDOStatement 对象,您可以对其进行迭代以获取各个行。但请注意,如果您在查询中使用来自不受信任来源的数据,则准备好的语句将是进行任何一种查询的最佳方式(但您可能知道这一点)。

因此,在您的情况下,PDO::exec() 是正确的。您确定将 set names 命令作为最后一个值传递给 PDO::__construct() 不起作用吗?它对我有用,我在 Windows 上有 PHP 5.3。你能发布更多你正在做什么的示例代码吗?

【讨论】:

  • 是的,我确定。我得到这个:PHP致命错误:未定义的类常量'MYSQL_ATTR_INIT_COMMAND'
  • Dmitri,您应该看到一个错误:bugs.php.net/bug.php?id=47224 临时解决方法是使用常量的1002 instad
  • 如果您在 Windows 上使用新的 mysqlnd 驱动程序,该错误似乎不存在。这就是我正在使用的,这就是为什么这个错误对我来说不存在。 Mysqlnd 也应该提供比旧的 libmysql 驱动程序更好的性能...
猜你喜欢
  • 1970-01-01
  • 2013-04-29
  • 2012-07-08
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2017-04-23
  • 2015-02-18
相关资源
最近更新 更多