为什么在fetchAll()之前需要execute()

时间:2012-04-23 10:27:54

标签: php mysql database pdo

我有以下代码:

$clicks = $statement->prepare($query);
$offers->bindValue(1, $id, PDO::PARAM_INT);
$clicks->execute();
$results = $clicks->fetchAll();
  • 查询正常
  • 绑定工作正常

实际上让我想知道的是,为什么我必须先执行()查询才能调用fetchAll()。 我来到这个解决方案/假设,因为,execute()只返回true / false而不调用execute(),fetchAll()不会返回任何内容。 这是正常的做法吗?

很久以前我一直在使用PDO,所以我不记得如何正确处理它。

非常感谢

(我使用PHP5.3,上面使用的代码是PDO / PDOStatement)

3 个答案:

答案 0 :(得分:4)

嗯,SELECT * FROM myTable只是一段文字,你必须首先将它发送到服务器,然后解析它等,然后才能fetchAll()fetchAll不会自动execute()的原因是fetchAll可以调用两次,如果您只需要执行一次,则不希望执行两次查询:)

它也与参数绑定等有关。参数可以更改,但您可能仍希望在原始参数值上使用提取函数。

这是一个设计的东西,这使得使用PDO进行编程变得更加容易。它只需要1行代码:)

你可能可以创建一个包装器并使fetchAll()执行执行和获取,但你肯定会遇到麻烦。

修改: 另一个原因是execute()实际上采用了一个可选的参数数组,允许您绑定参数。 $stmt -> execute(array($id));允许您跳过bindValue来电。

答案 1 :(得分:1)

PDO prepare()使用prepared statements,所以是的:必须做好准备,然后执行才能获得任何结果。如果您不需要重复使用该语句,则可以使用query()

答案 2 :(得分:1)

因为如果绑定变量后SQL自动执行,您将无法绑定多个变量。因此,您必须通过显式执行语句来完成绑定时告诉它。