我曾经将此作为传递给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()?
答案 0 :(得分:48)
使用PDO::EXEC
时,返回的结果不是PDOStatement
,而是受影响行的整数。
使用PDO::QUERY
时,返回的结果为PDOStatement
。
所以答案是它取决于你需要对数据做什么,如果你需要运行查询而不对结果做任何事情,那么你应该使用exec
来执行查询,否则如果你需要行数,返回的数据应该使用pdo::query
,然后使用调用返回的结果。
关于这个bug,你可以采取一些解决方法
PDO_MYSQL
MYSQL_ATTR_INIT_COMMAND
替换为1002
第二个问题可能在64位操作系统和某些Windows配置上存在一些问题。
答案 1 :(得分:5)
PDO :: exec()应该用于不返回结果集的查询,例如delete语句或'set'。当您希望返回结果集时,应该使用PDO :: query()。它会向您返回一个PDOStatement对象,您可以迭代它以获取各行。请注意,如果您在查询中使用来自不受信任来源的数据,那么准备好的语句将是进行任何一种查询的最佳方式(但您可能知道这一点)。
所以,在你的情况下,PDO :: exec()是正确的。你确定将set names命令传递给PDO :: __ construct()作为最后一个值不起作用吗?它适用于我,我在Windows上有PHP 5.3。你能发布一些你正在做的事情的示例代码吗?