back to top

Lavorare con PHP e MySQL

In questa lezione vedremo insieme come รจ possibile far interagire le nostre pagine PHP con i database MySQL. Per dovere di completezza non possiamo non ricordare che PHP รจ in grado di connettersi a diversi database server (MySQL, MS Access, PostgreSql, Oracle, Microsoft Sql Server, Sybase,โ€ฆ) tuttavia noi ci limiteremo a vedere lโ€™interazione con MySQL che รจ senza dubbio la soluzione piรน comune e diffusa.

Lavorare con PHP/MySQL

MySQL รจ un database veloce e potentissimo in grado di gestire applicazioni con un elvato grado di criticitร  e, cosa non secondaria, รจ un software open source, liberamente scaricabile dal sito www.mysql.com.

Pubblicitร 

Come abbiamo accennato nella lezione precedente PHP mette a disposizione dello sviluppatore diverse funzioni per interagire con i database MySQL. Vediamo insieme le piรน importanti.

Connettersi ad un database MySQL

Per prima cosa vediamo come fa PHP a connetersi al MySQL Server. Allo scopo soccorre la funzione mysql_connect() che si utilizza con la seguente sintassi:

mysql_connect(server, utente, password);

Ad esempio:

$myconn = mysql_connect('localhost', 'pippo', 'xxxxxx') or die('Errore...');

si noti lโ€™utilizzo del comando die() il cui scopo รจ, in caso di errore, bloccare lโ€™elaborazione dello script e stampare a video un messaggio.

Questa operazione โ€“ la connessione al server MySQL โ€“ รจ da considerare preliminare ad ogni altra operazione sui database. Una volta concluse le operazioni sul database รจ possibile chiudere la connessione al server in modo esplicito mediante la funzione mysql_close() in questo modo:

mysql_close($myconn);

Selezionare un database

Una volta stabilita la connessione รจ necessario selezionare uno specifico db sul quale lavorare. A questo scopo PHP ci fornisce la funzione mysql_select_db() da utilizzarsi con la seguente sintasi:

mysql_select_db(database, connessione);

Ad esempio:

mysql_select_db('mio_database', $myconn) or die('Errore...');

Effettuare una query

Per prima cosa vediamo come รจ possibile recuperare (leggere) dei dati presenti nel nostro database. Per fare questo dobbiamo formulare ed eseguire una query, la quale consiste in una interrogazione che lo sviluppatore rivolge al database utilizzando il linguaggio SQL. Per fare ciรฒ si fa ricorso alla funzione mysql_query() con la seguente sintassi:

mysql_query(query, connessione);

Ad esempio:

$query = "SELECT * FROM tabella WHERE id > 100";
$result = mysql_query($query, $myconn) or die('Errore...');

Si noti che lโ€™indicazione della connessione รจ facoltativa; se omessa lo script utilizzerร  lโ€™ultima connessione aperta.

Leggere i record restituiti da una query di SELECT

Una volta "recuperati" i dati dal database mediante una SELECT dovremo preoccuparci di ciclarli, ad esempio, per stamparli a video. A tal fine ci serviranno una serie di altre funzioni come, ad esempio, mysql_num_rows() e mysql_fetch_rows().

Vediamo quindi un esempio completo: poniamo di voler recuperare dalla tabella "amici" una serie di dati (nome, cognome e telefono) e di volerli stampare a video per ogni occorrenza trovata nel nostro database. Ecco il codice completo del nostro script PHP opportunamente commentato:

<?php
// mi connetto al MySql Server
$myconn = mysql_connect('localhost', 'pippo', 'xxxxxx') or die('Errore...');

// seleziono il database degli amici
mysql_select_db('database_degli_amici', $myconn) or die('Errore...');

// imposto ed eseguo la query
$query = "SELECT nome, cognome, telefono FROM amici ORDER BY cognome ASC";
$result = mysql_query($query, $myconn) or die('Errore...');

// conto il numero di occorrenze trovate nel db
$numrows = mysql_num_rows($result);

// se il database รจ vuoto lo stampo a video
if ($numrows == 0){
  echo "Database vuoto!";
}
// se invece trovo delle occorrenze...
else
{
  // avvio un ciclo for che si ripete per il numero di occorrenze trovate
  for ($x = 0; $x < $numrows; $x++){
    
    // recupero il contenuto di ogni record rovato
    $resrow = mysql_fetch_row($result);
    $nome = $resrow[0];
    $cofgnome = $resrow[1];
    $telefono = $resrow[2];

    // stampo a video il risultato
    echo "nome: <b>" . $nome . "</b><br/>";
    echo "cognome: <b>" . $cognome . "</b><br/>";
    echo "telefono: <b>" . $telefono . "</b>";
  }
}

// chiudo la connessione
mysql_close($myconn);
?>

Quello che abbiamo fatto qui sopra dovrebbe eservi abbastanza chiaro (ricordate la lezione sui cicli?)โ€ฆ Resta pertanto da chiarire solo il significato di due funzioni specifiche che abbiamo utilizzato:

  • mysql_num_rows() โ€“ Serve per conteggiare il numero di records trovati allโ€™interno del nostro db sulla base di una data query;
  • mysql_fetch_row() โ€“ Recupera il contenuto dei records trovati. Piรน precisamente restituisce una array contenente i valori di ogni campo riscontrato nel recordset che potremo poi richiamare specificando il relativo indice numerico.

Di seguito, per completezza, alcune considerazioni in merito al codice del nostro esempio.

In alternativa a mysql_fetch_row() avremmo potuto utilizzare mysql_fetch_assoc(), in tal caso i dati dal recordset sarebbero stati recuperabili mediante lโ€™indicazione del nome del campo (invece che dellโ€™indice numerico). Ad esempio:

// usando mysql_fetch_rows() abbiamo scritto...
$nome = $resrow[0];

// ...usando mysql_fetch_assoc() avremmo scritto
$nome = $resrow['nome'];

In alternativa a questi due, infine, avremmo potuto usare mysql_fetch_array() che supporta, indistintamente, entrambe le tecniche di chiamata.

Ancora, nel nostro esempio abbiamo ciclato il recordset utilizzando un comune ciclo for ma avremmo potuto usare, forse piรน correttamente, anche while in questo modo:

// ...

if ($numrows == 0){
  echo "Database vuoto!";
}
else
{
  while ($resrow = mysql_fetch_row($result)) {
    $nome = $resrow[0];
    $cofgnome = $resrow[1];
    $telefono = $resrow[2];

    // Stampo a video il risultato
    // ...  
  }
}

// ...

Cenni di SQL: INSERT INTO, UPDATE e DELETE

Per finire vediamo brevemente come eseguire altre importanti operazioni con i database attraverso i piรน comuni comandi del linguaggio SQL.

Con INSERT INTO si inseriscono nuovi dati nel db, con UPDATE si aggiornano dei dati giร  presenti, con DELETE si cancellano dei dati.

Dal punto di vista di PHP queste operazioni non differiscono tra loro, lโ€™unica cosa che cambia รจ la query che viene eseguita, ma questo discorso attine al linguaggio SQL. Facciamo degli esempi:

Per INSERT INTO useremo:

mysql_query("INSERT INTO tabella VALUES('valore1','valore2','valore3')");

Per UPDATE useremo:

mysql_query("UPDATE tabella SET campo1='valore1', campo2='valore2', campo3='valore3' WHERE id = 1");

Per DELETE useremo:

mysql_query("DELETE FROM tabella WHERE id = 1");

Attenzione! se nelle query di UPDATE e DELETE non usiamo la clausola "WHERE" verranno aggiornati/eliminati tutti i record del db!

Facciamo un esempio di utilizzo di queste query; vediamo come cancellare con PHP un record dal nostro database MySQL:

<?php
// mi connetto al server MySQL
$myconn = mysql_connect('localhost', 'pippo', 'xxxxxx') or die('Errore...');

// mi connetto al database degli amici
mysql_select_db('database', $myconn) or die('Errore...');

// imposto ed eseguo la query
$query = "DELETE FROM tabella WHERE id = 1";
$result = mysql_query($query, $myconn) or die('Errore...');

// chiudo la connessione
mysql_close($myconn);
?>

Per le altre operazioni basterร  sostituire la query mantenendo inalterata la struttura del codice PHP.

Aggiornamento: le nuove funzioni MySQLi e PDO_MySQL

In questa lezione sono state presentate diverse funzioni della famiglia mysql_* le quali, tuttavia, sono considerate deprecate nelle versioni piรน recenti di PHP a favore delle piรน moderne funzioni MySQLi e PDO_MySQL.

Per quanto riguarda la famiglia di funzioni mysqli_*, fortunatamente, il passaggio รจ piuttosto semplice in quanto (mantenendo lo stile di programmazione procedurale) sarร  sufficiente cambiare il prefisso "mysql_" in "mysqli_" per continuare ad utilizzare buona parte dei nostri vecchi script.

Per quanto riguarda PDO_MySQL, invece, vi invito a leggere la nostra breve guida allโ€™utilizzo di PDO.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).