Я использую 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;
}
Это выглядело хорошо для меня, но было пропущено много строк. В конце концов я понял, что дескриптор оператора был изменен (выполнен с другим параметром), что означает, что вызов fetch в цикле while будет работать только один раз, затем функция снова вызывает себя и набор результатов изменяется.
Поэтому мне интересно, как лучше всего использовать подготовленные операторы PDO рекурсивным способом.
Одним из способов может быть использование fetchAll (), но в руководстве говорится, что это требует значительных накладных расходов. Весь смысл в том, чтобы сделать его более эффективным.
Еще одна вещь, которую я мог бы сделать, это не использовать статический дескриптор, а вместо этого создавать новый каждый раз. Я полагаю, что, поскольку строка запроса одинакова, драйвер MySQL внутренне будет использовать подготовленный оператор в любом случае, поэтому есть небольшая нагрузка на создание нового дескриптора при каждом рекурсивном вызове. Лично я думаю, что это победит.
Или есть какой-нибудь способ переписать это?