ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | PHP | Espressioni | Comandi | Libreria | Form | Cookie | Database | Config | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
Tutorial PHP
Database
Modifica del database


<<< Database >>>

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 "&nbsp;&nbsp;";
   echo "<input name=op type=submit value='".EDIT_OPTIONS."'>";
   echo "&nbsp;&nbsp;";
   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]>&nbsp;<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]>&nbsp;$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>&nbsp;";
	return $res;
 }
ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com