Ho utilizzato PDO e preparato tutte le mie istruzioni principalmente per motivi di sicurezza. Tuttavia, ho una parte del mio codice che fa esegue la stessa istruzione molte volte con parametri diversi, e ho pensato che sarebbe stato dove le dichiarazioni preparate brillavano davvero. Ma in realtà infrangono il codice ...Ricorsione in istruzioni preparate
La logica di base del codice è questa.
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;
}
Mi sembrava soddisfacente, ma mancava un sacco di file. Alla fine mi sono reso conto che l'handle dell'istruzione veniva modificato (eseguito con parametri diversi), il che significa che la chiamata per il recupero del ciclo while funzionerà solo una volta, quindi la funzione si chiama nuovamente e il set di risultati viene modificato.
Quindi mi chiedo quale sia il modo migliore di utilizzare le istruzioni PDO preparate in modo ricorsivo.
Un modo potrebbe essere utilizzare fetchAll(), ma nel manuale si dice che ha un notevole overhead. Il punto centrale di tutto ciò è renderlo più efficiente.
L'altra cosa che potrei fare non è riutilizzare un handle statico, e invece ne fare uno nuovo ogni volta. Credo che poiché la stringa di query è la stessa, internamente il driver MySQL utilizzerà comunque una dichiarazione preparata, quindi c'è solo il piccolo sovraccarico di creare un nuovo handle su ogni chiamata ricorsiva. Personalmente penso che sconfigga il punto.
Oppure c'è un modo per riscriverlo?
ho solo fatto qualche (non super scientifico) testare il mio codice funzione ricorsivo molto simile e avere conc Ho lodato che per i miei scopi, le dichiarazioni preparate sono complessivamente più lente. Qual è il punto di preparare una dichiarazione se devi ri-prepararla prima di ogni utilizzo? Devo mancare qualcosa. –