Vediamo come creare un semplice sito in php per la gestione di problematiche, che consenta quindi ad un operatore di gestire eventuali problematiche rilevate dagli utenti; un esempio pratico potrebbe essere quello che si può verificare quando avete problemi con la vostra linea del telefono e chiamate un operatore che prende nota del vostro problema e successivamente lo risolverà, chiudendo così anche la problematica in questione. L'applicazione è costituita da un menù di operazioni riservato ovviamente agli operatori, che accedendo all'applicazione tramite una login e pwd, possono cancellare, modificare, risolvere o inserire una nuova problematica o utente (cliente).
Un esempio funzionante è mostrato qui) (
).
Ovviamente tale applicazione si appoggia su un database MySql, costituito da tre tabelle: "login", riservata ai dati di accesso dei vari operatori, "tt", contenente tutte le problematiche, e "utenti" in cui sono registrati tutti i dati dei clienti. Qui trovate il dump del db.
Il codice php necessario per realizzare l'applicazione si articola in diversi files, sia template html e sia files in php.
In questo tutorial, non viene usata una logica ad oggetti, per cui non verrà sviluppata nessuna classe.
In questa applicazione, la gestione della Login e pwd e del messaggio di benvenuto viene effettuata tramite i Cookies, di cui abbiamo già parlato in un precedente tutorial.
Vediamo ora l'elenco di tutti i files costituenti l'applicazione:
Di seguito è riportato il suo codice php-html:
| <?php $pagename = "Autenticazione"; $nome = $_POST ["login"]; $passw = $_POST ["pwd"]; $link = mysql_connect ("localhost", "root", "") or die ("connessione non riuscita"); mysql_select_db ("trouble_ticket") or die ("Selezione del DB non riuscita: " . mysql_error()); $sql = "SELECT * FROM login WHERE login='$nome' AND pwd='$passw'"; $result = mysql_query ($sql) or die ("query non riuscita". mysql_error()); if (mysql_num_rows($result) == 0) { echo "Utente sconosciuto <br>"; exit; } setcookie ( 'user', $nome, time()+3600); require_once("header.php"); ?> <TR> <TD width="20%" class=row1 valign=top> <? require_once ("menu.php"); ?> </TD> <TD width="80%" valign=top> <TABLE border=0 cellpadding=0 cellspacing=2 width=100% class=bodyline height=100%> <TR> <TD valign=top> <? echo "<BR><BR><CENTER> <span class=gensmall>ciao $nome sei autenticato/a </span></CENTER><br>"; ?> </TD> </TR> </TABLE> </TD> </TR> <tr height=5%> <td colspan=2 class=row1 align=middle> </td> </TR> </TBODY> </TABLE> </BODY> </HTML> |
Essa è quindi composta da una prima porzione di codice php e poi il solito codice html necessario per printare la tabella di visualizzazione; non usando le classi, ricordatevi che ogni pagina php deve contenere il codice html necessario per la corretta visualizzazione della pagina, a partire quindi dai tag <HTML> e <HEAD>, fogli di stile, etc...
All'inizio del codice, viene attivata la connessione al database "trouble_ticket" attraverso mysql_select_db(), come già spiegato in precedenza. Viene di seguito fatto un controllo sulla tabella login della username e password immessi nel modulo di compilazione; se questi valori non vengono trovati nella tabella (cioè $result è = NULL, quindi nullo, e di conseguenza mysql_num_rows($result) == 0), viene printato SOLO un messaggio all'utente di "Utente sconosciuto". La funzione exit() garantisce la non esecuzione del restante codice, che non avrebbe più senso mostrare.
Nel caso in cui i dati siano corretti, viene memorizzato nel cookie, della durata di 1 h sola, la sola username, attraverso la funzione setcookie();. Successivamente viene incluso nella pagina il file header.php, che printa la parte superiore del codice html della pagina.
La restante porzione di codice html è quello necessario per realizzare la struttura della pagina, creata appunto con una tabella 3x2.
| <?php $utente = $_COOKIE ['user']; if (!isset ($utente)) die ("Non sei autorizzato ad accedere alla pagina!!"); ?> <html> <head> <title><?php echo ($pagename); ?></title> <link rel="stylesheet" href="css/stili.css" type="text/css"> </head> <body leftmargin=10> <TABLE cellSpacing=0 cellPadding=10 width="100%" height=100% align=center border=0 class=bodyline> <TBODY> <TR height=5%> <TD class=row1> <? echo "<span class=gensmall>utente corrente ".$utente."</span><hr>"; ?> </TD> <TD class=row1><CENTER><H4><B>Trouble Tickets</B></H4></CENTER> </TD> </TR> |
Di interesse in questa pagina, vi è solo il controllo fatto sulla presenza o meno di un valore della username sul cookie, e cioè il controllo di accesso all'applicazione; questo viene realizzato usato la variabile vettore globale $_SESSION. La chiave su cui viene fatto il controllo è "user", la stessa impostata come primo parametro nella funzione setcookie(). Infatti, se non è settata la variabile $_COOKIE['user'], il controllo restituisce il messaggio di errore e l'esecuzione del codice termina qui.
Di seguito è riportato il suo codice php-html:
|
<?php $pagename = "Inserimento nuovo utente"; require_once ("header.php"); ?> <TR> <TD width="20%" class=row1 valign=top> <? require_once ("menu.php"); ?> </TD> <TD width="80%" valign=top> <TABLE border=0 cellpadding=0 cellspacing=0 width=100% class=bodyline height=100%> <TR> <TD valign=top> <? $nome = $_POST ["nome"]; $telefono = $_POST ["telefono"]; $indirizzo = $_POST ["indirizzo"]; if($_POST ["nome"]!="" && $_POST ["telefono"]!="" && $_POST ["indirizzo"]!="") { $link = mysql_connect ("localhost", "root", "") or die ("Non mi posso connettere"); mysql_select_db ("trouble_ticket") or die ("Non mi posso connettere al DB"); $sql = "INSERT INTO utenti (nome, telefono, indirizzo) VALUES('$nome','$telefono','$indirizzo')"; $result = mysql_query ($sql,$link) or die ("query non funzionante = $sql"); mysql_close ($link); if ($result) echo "<BR><BR><center><span class=gensmall>Inserimento eseguito con successo!</span></center>"; } else echo("<BR><BR><center><span class=gensmall>Devi inserire tutti i dati nel form.</span></center>"); ?> </TD> </TR> </TABLE> </TD> </TR> <tr height=5%> <td colspan=2 class=row1 align=middle> </td> </TR> </TBODY> </TABLE> </BODY> </HTML> |
La porzione centrale di codice php, dopo aver controllato che siano stati effettivamente immessi (Controllo cioè che non sia stato cliccato INVIA prima ancora di aver compilato tutti i campi richiesti), effettua l'inserimento dei tre campi nome, telefono, indirizzo, i cui valori sono contenuti nell'array globale $_POST.
| <?php $pagename = "Gestione utenti"; require_once ("header.php"); ?> <TR> <TD width="20%" class=row1 valign=top> <? require_once ("menu.php"); ?> </TD> <TD width="80%" valign=top> <TABLE border=0 cellpadding=0 cellspacing=2 width=100% class=bodyline height=100%> <TR> <TD valign=top> <? $link = mysql_connect ("localhost", "root", "") or die ("connessione non riuscita"); mysql_select_db ("trouble_ticket") or die ("Selezione del DB non riuscita: " . mysql_error()); $sql = "SELECT * FROM utenti"; $result = mysql_query ($sql,$link); if (mysql_num_rows($result) == 0) { echo "<BR><BR><center><span class=gensmall>Non ci sono utenti registrati!</span></center> <br>"; exit; } echo "<table width=\"90%\" border=\"0\" cellspacing=\"5\" cellpadding=\"3\" >"; echo "<tr height=30>"; echo("<td align=center class=row1><B>Nome</B></td><td align=center class=row1><B>Telefono</B></td><td align=center class=row1><B>Indirizzo</B></td><td align=center class=row1><B>Modifica</B></td><td align=center class=row1><B>Cancella</B></td><td align=center class=row1><B>Ins. Prob.</B></td></tr>"); while ($row = mysql_fetch_assoc($result)) { echo "<tr height=20>"; echo "<td align=middle>".$row["nome"]."</td>"; echo"<td align=middle>".$row["telefono"]."</td>"; echo"<td align=middle>".$row["indirizzo"]."</td>"; echo("<td align=center><A HREF='mod_ut_form.php?id=".$row["id"]."'><IMG SRC='redigermini.gif' WIDTH=16 HEIGHT=16 BORDER=0 ALT='Modifica utente'></A></td><td align=center><A HREF='del_ut.php?id=".$row["id"]."'><IMG SRC='LOGOUT.GIF' WIDTH='16' HEIGHT='16' BORDER=0 ALT='Cancella utente'></A></td><td align=center>"); ?><input type=button value=Edit onclick="location.href='ins_prob.php?id=<? echo($row["id"]);?>'"> <? echo("</td>"); echo "</tr>"; } echo "</TABLE>"; mysql_free_result($result); mysql_close ($link); ?> </TD> </TR> </TABLE> </TD> </TR> <tr height=5%> <td colspan=2 class=row1 align=middle> </td> </TR> </TBODY> </TABLE> </BODY> </HTML> |
La porzione centrale di codice php, printa la tabella con l'elenco di tutti i clienti ed inoltre printa per ognuno di essi, tre link: uno per la modifica dei suoi dati, uno per la sua eliminazione dal db e l'ultimo per inserire una sua eventuale problematica. Per far ciò dobbiamo recuperare i dati della tabella "utenti" dal db, attraverso una query MySQL. Se quest'ultima non è vuota, viene quindi printata la tabella con i links; vediamo ora in dettaglio come, una volta ottenuti i dati dal db (cioè abbiamo eseguito la query attraverso la funzione mysql_query()) e quindi $result contiene effettivamente qualcosa, come dobbiamo fare per printare una riga della tabella con i vari valori.
Come prima cosa, il formato di $result non è nè una stringa e nè un array, ma è una risorsa numerica, che va quindi trasformata in maniera associativa in un array, proprio attraverso la funzione mysql_fetch_assoc($result). Essa ritorna un array, chiamato $row, proprio perchè esso contiene tutti i valori memorizzati in un record della tabella del db. Ad esempio per la tabella utenti, esso potrebbe essere, per il primo record
Array([id] = 1, [nome] = Andrea Gentili, [telefono] = 06486234, [indirizzo] = Via appia 233) .
A tal punto posso eseguire un ciclo WHILE fino a quando esiste un valore per $row, e cioè fino all'ultimo record della tabella; ad ogni iterazione viene printato il codice html della riga della tabella html con i valori contenuti in $row e i tre links. I primi due links sono realizzati tramite due immagini, mentre l'ultimo tramite un bottoncino, che necessita quindi del codice js per poter eseguire l'azione. A tutti e tre i links, viene accodato all'url di riferimento l'id dell'utente, che ci serve per identificare l'utente su cui poter eseguire poi l'azione richiesta (es. per il cancella : HREF='del_ut.php?id=".$row["id"]."' Ricordatevi sempre di inserire il carattere " ? " prima della copia chiave=valore accodata all'url).
N.B.: ricordatevi di chiudere sempre la connessione a fine pagina o comunque sia prima che venga interrota l'esecuzione del codice tramite un exit.
Di seguito è riportato la porzione del suo codice php-html che interessa il form di modifica dei dati:
|
<? $link = mysql_connect ("localhost", "root", "") or die ("connessione non riuscita"); mysql_select_db ("trouble_ticket") or die ("Selezione del DB non riuscita: " . mysql_error()); $sql = "SELECT * FROM utenti where id=$_GET[id]"; $result = mysql_query ($sql,$link); $row = mysql_fetch_assoc($result); ?> <form action='esegui_modifica.php?id="<? echo($_GET[id]); ?>"' method='post'> <table border=0 cellpadding=0 cellspacing=0 width=60% height=40%> <tr height=10%> <td colspan="2" align=middle valign=middle><BR> <H5><b>Dati utente</b></H5></td> </tr> <tr> <td width="30%" align="left"> Nome e Cognome</td> <td><input type=text name='nome' size=60 value="<? echo($row["nome"]); ?>"> <B>*</B></td> </tr> <tr> <td width="20%" align="left"> Telefono</td> <td><input type=text name='telefono' size=60 value="<? echo($row["telefono"]); ?>"> <B>*</B></td> </tr> <tr> <td width="20%" align="left"> Indirizzo</td> <td><input type=text name='indirizzo' size=60 value="<? echo($row["indirizzo"]); ?>"> <B>*</B></td> </tr> <tr> <td> </td> <td> <input type=submit value='Invia'> <input type=reset value='Cancella'> </td> </tr> </table> </form> |
Quindi la prima porzione di codice php è necessaria per recuperare i dati dell'utente dal db, eseguendo una query con il parametro WHERE. Successivamente vengono printati le varie caselle di testo, i cui value contengono il print dei corrispondenti valori contenuti nell'array associativo $row; così facendo quando si carica il modulo, dovrete vedere nelle caselle di testo i vecchi valori.
I files "esegui_modifica.php" , "del_ut.php" , "esegui_ins_prob.php" , "prob_chiuse.php" e "del_prob.php" sono uguali come struttura ai files già spiegati; cambiano solo le query MySQL che vengono eseguite.
Di seguito è riportato il suo codice php-html:
|
<?php $pagename = "elenco problematiche aperte"; require_once ("header.php"); ?> <TR> <TD width="20%" class=row1 valign=top> <? require_once ("menu.php"); ?> </TD> <TD width="80%" valign=top> <TABLE border=0 cellpadding=0 cellspacing=2 width=100% class=bodyline height=100%> <TR> <TD valign=top> <? $link = mysql_connect ("localhost", "root", "") or die ("connessione non riuscita"); mysql_select_db ("trouble_ticket") or die ("Selezione del DB non riuscita: " . mysql_error()); $sql = "SELECT * FROM tt where stato='aperta'"; $result = mysql_query ($sql,$link); if (mysql_num_rows($result) == 0) { echo "<BR><BR><center><span class=gensmall>Non ci sono problematiche aperte.</span></center> <br>"; exit; } echo "<table width=\"90%\" border=\"0\" cellspacing=\"5\" cellpadding=\"3\" >"; echo "<tr height=30>"; echo("<td align=center class=row1><B>Utente</B></td><td align=center class=row1><B>Descrizione Probl.</B></td><td align=center class=row1><B>Compilatore</B></td><td align=center class=row1><B>Modifica Stato</B></td><td align=center class=row1><B>Data Apertura</B></td></tr>"); while ($row = mysql_fetch_assoc($result)) { $sql2 = "SELECT * FROM utenti where id=".$row["id_utente"]; $result2 = mysql_query ($sql2,$link); $row2 = mysql_fetch_assoc($result2); echo "<tr height=20>"; echo "<td align=middle>".$row2["nome"]."</td><td align=left>".$row["descrizione"]."</td>"; echo"<td align=middle>".$row["solutore"]."</td>"; echo "<td align=middle><A HREF='aggiorna_prob.php?id_prob=".$row["id"]."'><IMG SRC='ARROW.GIF' WIDTH='8' HEIGHT='11' BORDER=0 ALT='Aggiorna a Risolta'></A></td><td align=middle>".$row["data_ap"]."</td>"; echo "</tr>"; } echo "</TABLE>"; mysql_free_result($result); mysql_free_result($result2); mysql_close ($link); ?> </TD> </TR> </TABLE> </TD> </TR> <tr height=5%> <td colspan=2 class=row1 align=middle> </td> </TR> </TBODY> </TABLE> </BODY> </HTML> |
La parte di codice php evidenziata serve per printare la solita tabella con l'elenco stavolta delle problematiche e dei nomi dei clienti corrispondenti alle problematiche aperte; inoltre viene inserito anche un link per aggiornare a risolta la problematica. Per poter distinguere le prob. aperte da quelle chiuse è stato inserito il campo "stato" nella tabella delle problematiche montata sul db; questo può assumere solo i due valori "aperta" (valore di default iniziale) e "risolta". Quindi anche qui la selezione sul db delle sole prob. aperte è resa facile proprio utilizzando tale campo, con una apposita query MySQL con parametro WHERE (where stato='aperta' o where stato='risolta' a seconda delle prob. che si vogliono vedere). Per ottenere dalla problematica l'id dell'utente corrispondente, è stato inserito sempre nella stessa tabella delle prob., un campo chiamato "id_utente", che ci serve per ottenere tramite query MySQL il nome del cliente corrispondente.
Questo ci evidenzia come in una applicazione, indipendentemente dalla sua dimensione e complessità, la struttura del database che gira dietro è fondamentale. Migliore sarà il db, e più facile sarà la gestione dei dati in php.
| <? $link = mysql_connect ("localhost", "root", "") or die ("connessione non riuscita"); mysql_select_db ("trouble_ticket") or die ("Selezione del DB non riuscita: " . mysql_error()); $data=date("F j Y - g:i a"); $sql = "UPDATE tt SET stato='risolta' where id=".$_GET["id_prob"]; $sql2 = "UPDATE tt SET data_chiu='".$data."' where id=".$_GET["id_prob"]; mysql_query ($sql,$link); mysql_query ($sql2,$link); mysql_close ($link); echo("<BR><BR><center><span class=gensmall>Hai segnalato questa Problematica come risolta.</span></center>"); ?> |
Qui semplicemente viene eseguita una query MySQL di UPDATE del campo stato a "risolta".