我有以下代码:
$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)
答案 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自动执行,您将无法绑定多个变量。因此,您必须通过显式执行语句来完成绑定时告诉它。