He estado utilizando PDO y estoy preparando todas mis declaraciones principalmente por razones de seguridad. Sin embargo, tengo una parte de mi código que hace ejecuta la misma declaración muchas veces con diferentes parámetros, y pensé que allí sería donde brillarían las declaraciones preparadas. Pero en realidad rompen el código ...Recursividad en declaraciones preparadas
La lógica básica del código es esta.
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;
}
Me pareció bien, pero le faltaban muchas filas. Eventualmente me di cuenta de que el asa de la declaración estaba siendo modificada (ejecutada con diferentes param), lo que significa que la llamada a buscar en el ciclo while solo funcionará una vez, luego la función se llama de nuevo y el conjunto de resultados cambia.
Así que me pregunto cuál es la mejor forma de usar declaraciones preparadas con PDO de forma recursiva.
Una forma podría ser usar fetchAll(), pero dice en el manual que tiene una sobrecarga considerable. El objetivo de esto es hacerlo más eficiente.
La otra cosa que podría hacer es no reutilizar un identificador estático, y en su lugar crear uno nuevo cada vez. Creo que dado que la cadena de consulta es la misma, internamente el controlador de MySQL usará una declaración preparada de todos modos, por lo que solo existe la pequeña sobrecarga de crear un nuevo identificador en cada llamada recursiva. Personalmente creo que eso derrota el punto.
¿O hay alguna forma de volver a escribir esto?
que acaba de hacer alguna (no supercientífico) probando mi código de función recursiva muy similar y tengo conc Creo que, para mi propósito, las declaraciones preparadas son más lentas en general. ¿De qué sirve preparar una declaración si debe volver a prepararla antes de cada uso? Debo estar perdiendo algo. –