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

2022-08-30 14:34:02

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

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

但是刚刚发现由于某些错误,它不适用于Windows上的某些php版本(在5.3中不起作用)。

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

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

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


答案 1

使用时返回的结果不是受影响的行的整数。PDO::EXECPDOStatement

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

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


关于错误,您可以采取一些解决方法

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

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

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


答案 2

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

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


推荐