Я использовал 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 все равно будет использовать подготовленный оператор, поэтому есть только небольшие накладные расходы на создание нового дескриптора для каждого рекурсивного вызова. Лично я думаю, что это побеждает суть.
Или есть способ переписать это?