我曾经把它作为传递给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_COMMAND
为1002
第二个问题可能在64位的操作系统和一些Windows配置上有一些问题.
错误信息:http://bugs.php.net/bug.php?id = 47224
PDO :: exec()应该用于不返回结果集的查询,例如delete语句或'set'。当您希望返回结果集时,应使用PDO :: query()。它向您返回一个PDOStatement对象,您可以对其进行迭代以获取各个行。但是请注意,如果您在查询中使用来自不受信任来源的数据,则准备好的语句将是进行任何一种查询的最佳方法(但您可能知道)。
因此,在您的情况下PDO :: exec()是正确的。您是否确定将set names命令传递给PDO :: __ construct()作为最后一个值不起作用?它对我有用,我在Windows上有PHP 5.3。您能否发布更多您正在做的示例代码?