【发布时间】:2011-02-12 10:38:59
【问题描述】:
我一直在使用 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 循环中对 fetch 的调用只会工作一次,然后函数再次调用自己,结果集也改变了。
所以我想知道以递归方式使用 PDO 准备语句的最佳方式是什么。
一种方法是使用 fetchAll(),但它在手册中说有很大的开销。这样做的重点是提高效率。
我可以做的另一件事是不重复使用静态句柄,而是每次都创建一个新句柄。我相信,由于查询字符串是相同的,因此 MySQL 驱动程序内部无论如何都会使用准备好的语句,因此在每个递归调用上创建新句柄的开销很小。我个人认为这与观点相悖。
或者有什么方法可以改写吗?
【问题讨论】:
-
我只是做了一些(不是超级科学的)测试我非常相似的递归函数代码并得出结论,就我的目的而言,准备好的语句总体上较慢。如果您必须在每次使用前重新准备一份声明,那么准备一份声明的意义何在?我一定是错过了什么。
标签: php mysql recursion pdo prepared-statement