Prepared statements

In questo post facciamo un esempio di uso di prepared statements.

L'idea é quella di salvare il tempo necessario per eseguire una query preparandola per quanto possibile in anticipo, limitandosi a mandare al database i parametri che cambiano tra una esecuzione e l'altra.

Primo passo, il solito startup, come già visto nei precedenti post:
require_once("utils.php");

$mysqli = db_connect();
list_products($mysqli);
Adesso mi creo una query parametrizzata. In questo caso una semplice select sulla nostra tabella products che ritorna codice, nome e prezzo di tutte gli articoli registrati che abbiano un prezzo inferiore a un valore che vogliamo specificare di volta in volta.

Mi creo uno statement, usando la funzione stmt_init() e lo preparo per la mia query, chiudendo brutalmente la sessione se fallisco nel tentativo:
$query = "SELECT sku, name, price FROM products WHERE price < ?";  $stmt = $mysqli->stmt_init();
if(($stmt->prepare($query)) == false)
die("Can't prepare statement - execution aborted.");
Adesso leghiamo i parametri a variabili locali. Ogni punto di domanda nella query verrà abbinato a una variabile php per mezzo di bind_param(). Il primo parametro di questa funzione é il tipo di variabile che vogliamo usare (d sta per numero reale (decimal), s per stringa, etc.), segue la lista di tutte le variabili php utilizzate. Nel nostro caso é semplice, abbiamo solo una variabile da associare, di tipo "d".
$stmt->bind_param("d", $low);
Nel ciclo for che segue variamo il nostro parametro associato, e vediamo che succede.
Per prima cosa eseguiamo lo statement, poi facciamo una store_result() per avere a disposizione l'intero resultset risultante. Dato che sappiamo che ci tornano poche righe di tabella, questa é l'opzione migliore, che riduce gli accessi al database e non rischia di allocare grosse quantità di memoria inutilmente.
Inoltre, avendo chiamato la store_result() possiamo chiamare la num_rows() che ci dice quante righe abbiamo effetivamente selezionato. Se non ne abbiamo nemmeno una, passiamo alla successiva iterazione del ciclo for.
Altrimenti connettiamo i valori ritornati dalla select con variabili php per mezzo della bind_result(), e li mostriamo al nostro utente.
for($low = 2; $low <>execute();
$stmt->store_result();
if(($stmt->num_rows()) == 0)
{
echo "<br/>No item with a price less than $low €<br/>";
continue;
}

$stmt->bind_result($sku, $name, $price);

echo "<br/>Items with a price less than $low €:<br/>";
while ($stmt->fetch())
echo "($sku) $name: €$price<br/>";
}
Manca ora solo il cleanup. Chiudiamo lo statement, e la connessione al database.
$stmt>close();
db_close($mysqli);
Qui si può vedere il risultato di queste operazioni.

Nessun commento:

Posta un commento