我一直在使用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