|
Esaminiamo adesso le principali funzioni di databasse disponibili, tenendo
presente quanto segue:
- Aprendo una connessione viene ritornato un valore, l'id della connessione, che serve ad identificarla. Molte funzioni
richiedono opzionalmente l'id; se non viene specificato fanno riferimento all'ultima connessione aperta.
- Una connessione può essere persistente. Questo significa che invece di aprire e chiudere la connessione ogni volta,
questa viene lasciata aperta per un certo tempo in modo da poterla riutilizzare. Tutte le volte che si cerca di accedere
allo stesso database con lo stesso utente e password viene riutilizzata la connessione lasciata apeta. Questo approccio
migliora sensibilmente l'efficienza.
- Eseguendo una query viene ritornato un valore che serve ad identificare i risultati. Questo valore deve essere
utilizzato esplicitamente in tutte le chiamate successive che fanno riferimento al risultato.
- Dalla tabella risultato, una riga può essere letta in un array (con i valori ordinati come sono stati richiesti) oppure in
un array associativo (con le chiavi corrispondenti ai campi). Notare che non è sensibilmente più inefficiente l'utilizzo
dell'array associativo rispetto all'array indicizzato.
|
Funzione |
Descrizione |
| mysql_connect(host [,utente][,password]) |
Si connette ad un database server mysql in esecuzione su
host specificando utente e password. Ritorna un valore (id)
che serve a individuare la connessione. |
| mysql_pconnect(host [,user] [,password]) |
Come mysql_connect, ma la connessione è persistente. |
| mysql_close([id]) |
Chiude la connessione al database server id |
| mysql_select_db(database [,id]) |
Usa il database come database corrente. |
| mysql_create_db(database [,id]) |
Crea un nuovo database sul server. |
| mysql_drop_db(database [,id]) |
Rimuove il database specificato. |
| mysql_query(query [,id]) |
Esegue la query. Se si tratta di una INSERT, DELETE o
UPDATE ritorna vero o falso a seconda che la richiesta
abbia avuto successo oppure no. Se l'operazione è una
SELECT ritorna un valore che indentifica il risultato. |
| mysql_affected_rows([id]) |
Ritorna il numero di righe che sono state coinvolte
dall'ultima operazione sul database. |
| mysql_errno([id]) |
Ritorna il codice di errore dell'ultima operazione richiesta. |
| mysql_error([id]) |
Ritorna il testo dell'errore dell'ultima operazione richiesta. |
| mysql_insert_id([id]) |
Ritorna il valore generato dall'ultima operazione di
INSERT che ha inserito un valore automaticamente in una
tabella con valori ad autoincremento. |
| mysql_fetch_array([risultato]) |
Ritorna un array associativo contente la riga corrente del
risultato e avanza alla riga successiva. Se si sono lettti
tutti i valori, ritorna un array vuoto che può essere
interpretato come falso. |
| mysql_fetch_row([risultato]) |
Ritorna un array indicizzato contente la riga corrente del
risultato e avanza alla riga successiva. Se sono stati letti
tutti i valori, ritorna un array vuoto che può essere
interpretato come falso. |
| mysql_num_fields([risultato) |
Ritorna il numero di campi del risultato. |
| mysql_num_rows([risultato]) |
Ritorna il numero di righe del risultato. |
Per accedere al database, il primo passo è quello di effettuare una connessione:
// File: functions.inc
//------------------------------------------------------------------------
// Connessione al database
//------------------------------------------------------------------------
mysql_pconnect("localhost", "user", "pippo");
mysql_select_db("agenda");
Queste righe vengono eseguite per ogni pagina che viene richiesta. Poiché abbiamo usato mysql_pconnect invece di
mysql_connect, utilizziamo una connessione persistente. La successiva chiamata mysql_select_db serve a
selezionare il database su cui si deve lavorare. Adesso possiamo esaminare le funzioni che permettono la modifica del
database, che finora abbiamo tralasciato. Una delle più semplici è option_company, che stampa una lista come la
seguente, utilizzata nel corpo del campo SELECT della form di immissione contatto:
<option value='3'>La Pulente scrl
<option value='1' SELECTED>NovoMobili snc
<option value='2'>Pescato Fresco srl
Il corpo della funzione è:
//File: functions.inc
Function option_company() {
global $Contact;
$res = mysql_query("SELECT idCompany, Name FROM Company ORDER by Name");
while($r = mysql_fetch_array($res))
echo ("<option value='$r[idCompany]'".
($r[idCompany]==$Contact[fkCompany] ? " SELECTED" : "").">$r[Name]");
}
Notare il meccanismo: sul database corrente (aperto e selezionato con le chiamate precedenti) è possibile effettuare una
interrogazione SQL che ritornata un risultato, mantenuto in $res. Il risultato in realtà viene memorizzato internamente,
ma è possibile accedere alle singole righe con un array associativo utilizzando mysql_fetch_array($res): le
chiavi di questo array assciativo sono i nomi dei campi e i valori sono i campi del record corrente. Chiamando
ripetutamente questa funzione vengono ritornati i record successivi. Analoghe a questa funzione sono le altre due,
select_company e select_contact che ritornato un singolo contatto o ditta. Queste funzioni vengono utilizzate
quando si deve effettuare la modifica di un record, per caricare i dati negli array associativi Company e Contact che
verranno poi visualizzati e modificati dalla form, come abbiamo visto nei paragrafi precedenti.
//File: functions.inc
Function select_company($idCompany) {
if(!$idCompany) return setErr(ERR_NOKEY);
$res = mysql_query("SELECT * FROM Company WHERE idCompany=".$idCompany);
$row = mysql_fetch_array($res); return $row;
}
Function select_contact($idContact) {
if(!$idContact)
return setErr(ERR_NOKEY);
$res = mysql_query("SELECT * FROM Contact WHERE idContact=".$idContact);
$row = mysql_fetch_array($res);
return $row;
}
 Figura 4 - La schermata principale dell'agenda che mostra ditte e contatti.
Un po' più complicata è la pagina di visualizzazione dell'agenda, che deve interrogare il database ed inoltre tenere conto
delle opzioni di visualizzazione impostate con i cookie. Il risultato è visibile in Figura 4.
<form>
<table border=0 cellspacing=0 cellpadding=5>
<tr bgcolor=#abcdef>
<? echo list_headers();
$ncol = count(explode("<t", list_headers()));
// interrogazione per visualizzare ditte e contatti
$rs = mysql_query("SELECT *, Contact.Email as ContactEmail, Company.Email as CompanyEmail"
. " FROM Company LEFT JOIN Contact ON idCompany=fkCompany ORDER BY idCompany, Name");
$acc = "";
$nacc=0;
$curr = "";
// codice per accorpare la visualizzazione delle ditte
while(1) {
$r = mysql_fetch_array($rs);
if(($r and $curr!=$r['idCompany']) or !$r) {
if($acc)
echo "<tr bgcolor=#eeeeee><td rowspan=$nacc bgcolor=#dddddd>$acc<td colspan=6>";
$nacc = 1;
$curr=$r['idCompany'];
$acc = list_company($r);
}
if(!$r) break;
# Stampa contatto
if($r['idContact']) {
$acc .= "\n<tr bgcolor=#eeeeee>" . list_contact($r);
++$nacc;
}
}
mysql_free_result($rs);
?>
<tr bgcolor=#abcdef>
<?
echo "<td colspan=$ncol align=center>";
echo "<input name=op type=submit value='".NEW_COMPANY."'>";
echo "<input name=op type=submit value='".EDIT_COMPANY."'>";
echo "<input name=op type=submit value='".DELETE_COMPANY."'>";
echo " ";
echo "<input name=op type=submit value='".EDIT_OPTIONS."'>";
echo " ";
echo "<input name=op type=submit value='".NEW_CONTACT."'>";
echo "<input name=op type=submit value='".EDIT_CONTACT."'>";
echo "<input name=op type=submit value='".DELETE_CONTACT."'>";
?>
<tr bgcolor=#abcdef><td colspan=7><? echo getErr(); ?>
</table>
</form>
In questa pagina sono utilizzati una serie di accorgimenti che realmente hanno impatto solo sulla visualizzazione. Le
complicazioni non sono concettuali ma sono legate al fatto che si visualizzare per ogni ditta una cella di una tabella che
occupa tante righe quanti sono i contatti. Per ottenere questo risultato si è dovuto accumulare le varie righe nella tabella
nella variabile $acc per poi visualizzarle insieme quando è finalmente noto il numero di righe. Un altro aspetto che
complica le cose è il fatto che la visualizzazione dipende anche dalle opzioni di visualizzazione. Pertanto il contenuto
effettivo delle cella della ditta e dei contatti e la riga di intestazione viene generata dalle fuzioni list_header,
list_contact e list_company.
Le funzioni che stampano i vari campi tenendo conto delle opzioni di visualizzazione sono:
// File: functions.inc
//------------------------------------------------------------------------
// Gestione Opzioni
//------------------------------------------------------------------------
Function list_headers() {
global $mask;
$res = "<th>Ditta";
$res .= "<th>Cognome<th>Nome";
$res .= ( $mask & F_CONT_HOME ) ? "" : "<th>Casa";
$res .= ( $mask & F_CONT_MOBILE ) ? "" : "<th>Cellulare";
$res .= ( $mask & F_CONT_EMAIL ) ? "" : "<th>Email";
return $res;
}
Function list_company($r) {
global $mask;
$r = webquote($r);
$res = "<input type=radio name=idCompany value=$r[idCompany]> <b>$r[Name]</b><br>\n";
$res .= ($mask & F_COMP_ADDR) ? "" : "<br>$r[Street]<br>$r[City] $r[State]\n";
$res .= ($mask & F_COMP_PHONE) ? "" : "<br>Tel:$r[Phone] Fax:$r[Fax]\n";
$res .= ($mask & F_COMP_NET) ? "" : "<br><tt>$r[Web] $r[CompanyEmail]</tt>\n";
return $res;
}
Function list_contact($r) {
global $mask;
$r = webquote($r);
$res = "<td><input type=radio name=idContact value=$r[idContact]> $r[FirstName]<td>$r[LastName]";
$res .= ( $mask & F_CONT_HOME ) ? "" : "<td>$r[Home]";
$res .= ( $mask & F_CONT_MOBILE ) ? "" : "<td>$r[Mobile]";
$res .= ( $mask & F_CONT_EMAIL ) ? "" : "<td><tt>$r[ContactEmail]</tt> ";
return $res;
}
|