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)
  • mixed query(string[, int]) SELECT, SHOW, EXPLAIN DESCRIBE MYSQLI_USE_RESULT MYSQLI_STORE_RESULT

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
  • array fetch_assoc()
  • array fetch_row()
  • array fetch_array()
  • object fetch_field()

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

  • name
  • orgname
  • table
  • orgtable
    def: il valore di default di questo campo, rappresentato come una stringa;
  • max_length
  • flags
  • type
  • decimals

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, ...)
  • bool execute()
  • void bind_result(...)
  • bool fetch()

Ti consigliamo anche