我一直在使用PDO并且主要是为了安全原因准备我的所有陈述。然而,我有一部分代码确实多次用不同的参数执行相同的语句,我认为这将是准备好的语句真正发光的地方。但他们实际上破坏了代码...准备好的陈述中的递归
代码的基本逻辑是这样的。
function someFunction($something) {
global $pdo;
$array = array();
static $handle = null;
if (!$handle) {
$handle = $pdo->prepare("A STATEMENT WITH :a_param");
}
$handle->bindValue(":a_param", $something);
if ($handle->execute()) {
while ($row = $handle->fetch()) {
$array[] = someFunction($row['blah']);
}
}
return $array;
}
它看起来很好,但它错过了很多行。最终,我意识到语句句柄正在被改变(用不同的参数执行),这意味着在while循环中获取的调用只能工作一次,然后函数再次调用自己,并且结果集被改变。
所以我想知道什么是以递归方式使用PDO准备语句的最佳方式。
一种方法可能是使用fetchAll(),但它在手册中说有很大的开销。这整个意义在于让它更有效率。
我可以做的另一件事是不重用一个静态句柄,而是每次都做一个新的。我相信由于查询字符串是相同的,因此MySQL内部的驱动程序无论如何都会使用准备好的语句,所以在每次递归调用时创建一个新句柄的开销很小。就我个人而言,我认为这打破了这一点。
或者有什么方法可以重写?
我只是做了一些(不是超级科学)测试我非常相似的递归函数代码,并有浓对于我的目的而言,准备好的陈述总体上较慢。如果您在每次使用前必须重新准备,那么准备一份声明有什么意义?我肯定错过了什么。 – 2012-11-14 19:32:13