PDO :: exec()或PDO :: query()?

时间:2011-02-12 14:09:17

标签: php utf-8 pdo

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

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

但是刚刚发现它在Windows上的某些php版本上不起作用(在5.3中不起作用),因为有些bug。

现在我需要使用SET NAMES utf8

运行$pdo->exec("SET NAMES utf8");

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

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

2 个答案:

答案 0 :(得分:48)

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

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

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


关于这个bug,你可以采取一些解决方法

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

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

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

答案 1 :(得分:5)

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

所以,在你的情况下,PDO :: exec()是正确的。你确定将set names命令传递给PDO :: __ construct()作为最后一个值不起作用吗?它适用于我,我在Windows上有PHP 5.3。你能发布一些你正在做的事情的示例代码吗?