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

Dmi*_*tri 29 php pdo utf-8

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

$aOptions[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
Run Code Online (Sandbox Code Playgroud)

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

现在我需要运行SET NAMES utf8任何一个$pdo->exec("SET NAMES utf8");

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

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

Rob*_*itt 48

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

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

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


关于这个bug你可以采取几种方法

  • 安装 PDO_MYSQL
  • 替换MYSQL_ATTR_INIT_COMMAND1002
  • 更新您的PHP到最新的稳定版本,它已被传递和修补.

第二个问题可能在64位的操作系统和一些Windows配置上有一些问题.

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


Jer*_*emy 5

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

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