我曾经把它作为传递给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_MYSQLMYSQL_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。您能否发布更多您正在做的示例代码?
| 归档时间: |
|
| 查看次数: |
22855 次 |
| 最近记录: |