Credevo di passare subito a descrivere la piccola gestione DB, ma andando avanti ho pensato che prima c'era da chiarire alcuni punti senza i quali copiereste sì il codice che posto, ma, se dovesse poi succedere qualcosa di imprevisto, non sapreste poi dove mettere le mani.
Quindi...................ecco un'altra puntata teorica.
Prima di continuare con l'esplorazione della nostra gestione è bene soffermarci un attimino su alcune considerazioni che vanno fatte sulle Query, altrimenti ci si ritrova con una montagna di codice e non si sa da dove iniziare.
Nel 3D precedente abbiamo detto che le Query possono essere di lettura o scrittura.
Una Query manda una "richiesta" al "Data Base" attivo.
Per Query con SELECT, SHOW, DESCRIBE, EXPLAIN ed altre dichiarazioni restituisce dei valori o FALSE
Per Query con DELETE, INSERT, REPLACE, UPDATE, DROP ed altre dichiarazioni restituisce TRUE o FALSE
I passi da seguire per agire con un DB, prima di offrirgli una Query, sono questi:
- creare la Query che vogliamo mandare in esecuzione
- Impostazione dei dati per la connessione
- Quindi iniziare aprendo una connessione verso il nostro DB
- Il passo successivo è quello di specificare il nome del database al quale ci vogliamo connettere
- Poi avremo l'istruzione successiva per eseguire la Query
- Alla fine è buona norma chiudere la connessione al DB
Il tutto può essere definito come in questo frammento di codice dove mettiamo anche una sorta di controllo di eventuali fallimenti:
<?php
$Query = "quello che vuoi";
if (!$link = mysql_connect($Host, $User, $Password)) {
echo "errore nella connessione<br />".mysql_error() . "<br />\n";
} else {
echo "La connessione è avvenuta con successo<br />\n";
}
if (!mysql_select_db($DBName, $link)) {
echo "DataBase non trovato<br />".mysql_error() . "<br />\n";
} else {
echo "Il database è stato agganciato con successo<br />\n";
}
$result = mysql_query($Query, $link);
if (!$result) {
echo $Query . "<br />";
die ("errore nella query<br />".mysql_error());
} else {
................
}
mysql_close ($link);
?>
Per comprendere meglio il tipo di errore che eventualmente si verifichi, abbiamo a disposizione la funzione
MySQL mysql_error()Se ci aspettiamo che la Query ci debba restituire dei valori possiamo leggere tali valori in queto modo:
<?php
$result = mysql_query($Query, $link);
if (!$result) {
echo 'Errore nella Query: ' . mysql_error();
}
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
echo $row['Field'] . "<br />\n";
}
}
?>
Se la Query è una semplice Query di comando (quindi non ci aspettiamo alcun valore restituito), possiamo terminare qui la nostra procedura:
<?php
$result = mysql_query($query, $link);
if (!$result) {
echo "errore nella query<br />\n" . $query . "<br />";
}
?>
Il discorso si potrebbe concludere qui. Ma è bene che mostrare almeno alcuni esempi di query per compiere le più comuni operazioni.
Elenco di tutte le tabelle presenti nel DB
$Query = "SHOW TABLES FROM $DBName";
Questa Query potrebbe tornarci utile per poter decidere se:
* dobbiamo creare una tabella
* dobbiamo eliminare una tabella
Creazione di una tabella
$Query = "CREATE TABLE rubrica (id mediumint unsigned NOT NULL auto_increment, cognome varchar(100), nome varchar(100), nato DATE NOT NULL DEFAULT '0000-00-00', indirizzo varchar(100), cap varchar(10), citta varchar(100), prov varchar(10), tel1 varchar(20), tel2 varchar(20), tel3 varchar(100), PRIMARY KEY (id)) ENGINE = MyISAM";
Eliminazione una tabella
$Query = "DROP TABLE rubrica";
Lettura dei campi di una tabella
$table = "rubrica";
$Query = "SHOW COLUMNS FROM " . $table;
Conoscere il numero di record:
$Query = "SELECT * FROM " . $table;
$result = mysql_query($Query, $link);
$num_rows = mysql_num_rows($result);
echo $num_rows . " record nella tabella " . $table> . "<br />\n";
Una volta creata una tabella è possibile eseguire diverse operazioni. Tra le principali abbiamo queste:
* Inserimento dei dati
* Modifica dei dati
* Eliminazione dei dati
* Visualizzazione dei dati
Inserimento dei dati$Query = "INSERT INTO rubrica(id, cognome, nome, nato, indirizzo, cap, citta, prov, tel1, tel2, tel3) VALUES ('0', 'Liberali', 'Franca', '2004-08-20', 'VIA MARCHESANE, 232', '36010', 'Aragona', 'TN', '036 34871949', '06 0798', '')";
Per modificare un record$Query = "UPDATE rubrica SET cognome = 'Migliavacca', nome = 'Luigi', nato = '2004-01-22', indirizzo = 'VIA DEL TUSCOLANO 1', cap = '14030', citta = 'Tatti', prov = 'MC', tel1 = '054/458798', tel2 = '555/4568978', tel3 = '054/458798' WHERE id = 1";
Per eliminare un record$Query = "DELETE FROM rubrica WHERE id = '1'";
Lettura dei datiQui entriamo nel cuore della gestione vera e propria, ma anche la più complessa.
Quindi iniziamo senz'altro dalla più semplice per arrivare a quella più complessa, almeno nel nostro caso.
Mostra tutti i dati di tutti i campi di una tabella
$Query = "SELECT * FROM rubrica";
Mostra i dati dei soli campi indicati nella Query
$Query = "SELECT cognome, nome, indirizzo FROM rubrica";
Pone una condizione nella scelta dei record
$Query = "SELECT * FROM rubrica WHERE nome = 'Matteo'";
Pone più condizioni (è possibile usare nella clausola WHERE un AND oppure un OR)
$Query = "SELECT cognome, nome, indirizzo FROM rubrica WHERE nome = 'Matteo' AND citta <> 'Venezia'";
Effettua una ricerca tramite una porzione di stringa su un campo
$Query = "SELECT * FROM rubrica WHERE cognome LIKE '%a%'";
Effettua una ricerca tramite una porzione di stringa su più campi
$Query = "SELECT * FROM rubrica WHERE cognome LIKE '%a%' OR nome LIKE '%a%' OR citta LIKE '%a%'";
Restituisce un elenco ordinato dei record
$Query = "SELECT * FROM rubrica ORDER BY nome";
Dopo ogni connessione al DB, proposta della Query, ed eventuale visualizzazione dei dati da quest'ultima restituiti, è buona norma chiudere il collegamento aperto per rilasciare le risorse impegnate.
Ma nella stessa istanza è possibile eseguire anche più Query ricordandosi tuttavia di chiudere alla fine l'istanza aperta precedentemente.
mysql_close ($link);
Ora, prima di concludere vediamo un piccolo esempio completo come riportato nel codice di esempio qui di seguito.
In questo esempio vogliamo trovare nella tabella tutti i nostri contatti che abitano in una città che hanno all'interno del loro nome la stringa "co":
<?php
if (!$link = mysql_connect($Host, $User, $Password)) {
echo "errore nella connessione<br />".mysql_error() . "<br />\n";;
} else {
echo "La connessione è avvenuta con successo<br />\n";
}
if (!mysql_select_db($DBName, $link)) {
echo "DataBase non trovato<br />".mysql_error() . "<br />\n";;
} else {
echo "Il database è stato agganciato con successo<br />\n";
$Query = "SELECT * FROM " . $table;
echo "La Query per contare i record<br />\n" . $Query . "<br />\n";
$result = mysql_query($Query, $link);
$num_rows = mysql_num_rows($result);
if ($num_rows != 0) {
echo "Nella tabella " . $table . " ci sono
" . $num_rows . " record<br />\n";
echo "Ora vediamo quante città contendono
nel loro nome la stringa \"co\"<br />\n";
$Query = "SELECT * FROM rubrica WHERE citta LIKE '%co%' ORDER BY nome";
echo "La Query:<br />\n" . $Query . "<br />\n";
$result = mysql_query($Query, $link);
if (!$result ) {
echo "Errore nella Query<br />\n" . mysql_error() . "<br />\n";
} else {
if (mysql_num_rows($result)) {
echo "I record trovati<br />\n";
echo " <div align=\"center\">\n";
echo "<table>\n";
echo "<tr>\n";
echo "<th>cognome</th>\n";
echo "<th>nome</th>\n";
echo "<th>citta</th>\n";
echo "<th>prov</th>\n";
echo "</tr>\n";
while ($row = mysql_fetch_array($result)) {
echo "<tr>\n";
echo "<td>" . $row['cognome'] . "</td>\n";
echo "<td>" . $row['nome'] . "</td>\n";
echo "<td>" . $row['citta'] . "</td>\n";
echo "<td>" . $row['prov'] . "</td>\n";
echo "</tr>\n";
}
echo "</table>\n";
echo "</div>\n";
} else {
echo "Nessun record trovato<br />\n";
}
}
} else {
echo "Nessun record trovato nella tabella " . $table . "<br />\n";
}
}
mysql_close ($link);
?>
Per la chiusura del collegamento è da notare che avviene solo dopo l'esecuzione della seconda Query e la visualizzazione del Resultset restituito.
Questo potrebbe essere un possibile risultato che il codice sopra riportato potrebbe restituire:
La connessione è avvenuta con successo
Il database è stato agganciato con successo
La Query per contare i record
SELECT * FROM rubrica
Nella tabella rubrica ci sono 25 record
Ora vediamo quante città contendono nel loro nome la stringa "co"
La Query:
SELECT * FROM rubrica WHERE citta LIKE '%co%' ORDER BY nome
I record trovati
cognome | nome | citta | prov |
Scicchitano | Andrea | Codena | RO |
Maini | Marilena | Cossila | TO |
Di Maggio | Mario | Copertino | PC |
Maini | Mirella | San Donato in Collina | CL |
ATTENZIONE:TUTTI I NOMI CHE FIGURANO NEI MIEI ELENCHI PRESENTI E FUTURI NON SI RIFERISCONO ASSOLUTAMENTE A PERSONE REALI.
Anche se li ho prelevati da un archivio reale li ho passati in Excel, mescolati casualmente tutti i campi.
Questa precisazione per quanto riguarda le disposizioni sulla privaci.