Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 66 di 67
  • livello intermedio
Indice lezioni

Interrogare database MySQL

Come interrogare un database MySQL con la nuova libreria mysqli e come creare prepared statement
Come interrogare un database MySQL con la nuova libreria mysqli e come creare prepared statement
Link copiato negli appunti

In PHP 5 abbiamo diverse soluzioni per connetterci ai database. Uno dei database più utilizzati in ambito opensource è sicuramente MySQL, che conta dalla sua una larga schiera di sviluppatori e supporters. In PHP 5 possiamo accedere a MySQL attraverso i layer di astrazione distribuiti nella release standard (PDO ed SDO), ma anche utilizzando la libreria mysql (quella utilizzata anche nella versione precedente di PHP) e la nuova libreria mysqli che fornisce un supporto più completo al linguaggio ed espone un'interfaccia ad oggetti.

Date lo modifiche apportate al linguaggio che puntano a muovere il paradigma di programmazione tipico di PHP da strutturato ad oggetti, mi pare una buona scelta imparare a conoscere la libreria mysqli utilizzando la sua interfaccia a classi piuttosto che basarsi sull'approccio a funzioni.

La connessione ad un database mysql prevede la creazione di un oggetto mysqli tramite il quale effettueremo le nostre operazioni di interrogazione e gestione del database:

<?php
$mysqli = new mysqli('host', 'username', 'password', 'dbname');
// ... eseguiamo le nostre operazioni ...
$mysqli->close();
?>

Una volta istanziato un oggetto mysqli possiamo operare su di esso:

<?php
// ... connessione

$mysqli->autocommit(true);
$mysqli->query("
CREATE TABLE test (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
title VARCHAR(32) NOT NULL,
content TEXT NOT NULL,
PRIMARY KEY(id)
);
");

// Inseriamo qualche informazione

for($i = 0; $i < 1000; ++$i)

{
$query = sprintf("INSERT INTO test (title, content) VALUES ('%s', '%s')", "Titolo ".$i, "Contenuto di prova ".$i);
$mysqli->query($query);
}

// Selezioniamo e stampiamo le righe inserite

$result = $mysqli->query("SELECT * FROM test", MYSQLI_USE_RESULT);

while($row = $result->fetch_assoc())

{
printf("<h3>%s</h3><p>%s</p><hr />", $row['title'], $row['content']);
}

$result->close();

// ....

?>

I metodi utilizzati nell'esempio precedente sono i seguenti:

  • void autocommit(bool): permette di impostare l'oggetto in modo che richiami automaticamente il metodo commit() dopo aver effettuato una query. In caso sia impostato a false e si stia operando su tabelle che supportano le transizioni, è necessario richiamare commit manualmente per applicare le modifiche apportate dalle query;
  • mixed query(string[, int]): esegue una query SQL sul database utilizzato. Il risultato restituito dipende dalla tipologia di query eseguita: nel caso la query SELECT, SHOW, EXPLAIN o DESCRIBE viene restituito un oggetto (di cui analizzeremo le proprietà successivamente) altrimenti viene restituito true in caso di query eseguita correttamente, false in caso contrario. Il secondo parametro passato al metodo può essere la costante MYSQLI_USE_RESULT o MYSQLI_STORE_RESULT: la seconda è quella impostata di default e viene utilizzata per effettuare il buffering dei dati recuperati attraverso la query; invece nel caso si utilizzi la prima costante i dati non sono bufferizzati;

Come accennato le chiamate al metodo query possono restituire un oggetto nel caso in cui la query eseguita preveda un risultato diverso dalle informazioni sulla sua corretta esecuzione. Questo oggetto è un'istanza della classe mysqli_result, ed espone metodi per iterare sui risultati. Vediamo i più interessanti:

  • proprietà num_rows: restituisce il numero delle righe contenute nel buffer o nel risultato SQL;
  • array fetch_assoc(): restituisce il successivo risultato sotto forma di un array avente come chiavi i nomi dei campi recuperati e come valori i rispettivi valori. In caso l'iterazione sia terminata viene restituito NULL;
  • array fetch_row(): opera come fetch_assoc ma utilizza indici numerici per identificare i risultati;
  • array fetch_array(): restituisce un array che contiene sia indici numerici che stringhe per recuperare i valori;
  • object fetch_field(): restituisce un oggetto che contiene le informazioni sui campi recuperati dalla query;

Nel caso si utilizzi fetch_field l'oggetto restituito espone le seguenti proprietà:

  • name: il nome della colonna;
  • orgname: il nome originale della colonna nel caso sia stato specificato un alias;
  • table: il nome della tabella a cui appartiene il campo, a meno che questo non sia calcolato (come nel caso di "SELECT (1+1) AS test" per esempio);
  • orgtable: il nome originale della tabella nel caso in cui sia stato specificato un alias;
    def: il valore di default di questo campo, rappresentato come una stringa;
  • max_length: la lunghezza massima del campo;
  • flags: un intero che rappresenta i flag associati al campo;
  • type: il tipo di dato utilizzato per il campo;
  • decimals: il numero di decimali utilizzati (solo nel caso di campi numerici);

Prepared statement

Dopo questa introduzione, possiamo passare ad analizzare uno degli aspetti più interessanti della libreria mysqli, i prepared statement. Normalmente quando il database esegue una query, effettua prima una compilazione di quest'ultima e poi esegue il codice compilato. Questa operazione viene normalmente effettuata ogni volta che una query viene eseguita, anche nel caso di chiamate successive a query molto simili. I prepared statement permettono di precompilare una query lasciando dei campi variabili: quando la query dovrà essere eseguita potranno essere assegnati solo questi campi e non si dovrà procedere con l'intera compilazione, guadagnando molto in performance.

Vediamo come si prepara ed utilizza un prepared statement:

<?php

// ... connessione

$search = '';

$stmt = $mysqli->prepare("SELECT id, title FROM test WHERE title LIKE ?");

$stmt->bind_param('s', $search);

for($i = 0; $i < 5; ++$i)

{
$search = '%'.$i.'%';
$stmt->execute();
$stmt->bind_result($id, $title);
echo "<h3>",$i,"</h3>";
while($stmt->fetch())

{
printf("<strong>%d</strong><span>%s</span><br />", $id, $title);
}
$stmt->free_result();
}

$stmt->close()

// ...

?>

Utilizzando il metodo prepare dell'oggetto mysqli possiamo creare un prepared statement, rappresentato da un'istanza della classe mysqli_stmt. La query passata come argomento può contenere una serie di punti di domanda nei posti in cui successivamente inseriremo i valori. I punti di domanda possono essere inseriti solamente nelle posizioni in cui la query SQL si aspetterebbe dei valori (come quelli degli INSERT, gli assegnamenti di UPDATE o i valori delle condizioni della clausola WHERE). Una volta preparato l'oggetto possiamo operarvi utilizzando i suoi metodi:

  • void bind_param(string, ...): associa una o più variabili ai singoli placeholder specificati nella query precompilata. Il primo argomento è una stringa di cui ogni singolo carattere rappresenta il tipo di dato in cui convertire i valori contenuti nelle variabili connesse. I caratteri utilizzabili sono i per gli interi, d per i double, s per le stringhe e b per i blob. I restanti parametri sono i nomi delle variabili che vogliamo connettere.
  • bool execute(): esegue un prepared statement salvando gli eventuali risultati recuperati in un buffer interno ed estraendo i valori dei placeholder dalle variabili connesse;
  • void bind_result(...): associa i singoli campi recuperati dalla query a delle variabili. I valori di queste variabili saranno aggiornati ad ogni chiamata effettuata al metodo fetch;
  • bool fetch(): passa al record successivo assegnando i valori dei campi recuperati alle variabili connesse. Se non c'è alcun record restituisce false;

Ti consigliamo anche