Homepage -> Guida PHP



CREARE UN SITO IN PHP



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) ( ).


  1. Pannello di controllo riservato all'operatore
    • Gestione utenti
    • Inserimento nuova problematica
    • Risoluzione di una problematica aperta
    • Visualizzazione di problematiche chiuse, ed eventuale loro cancellazione




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:




Pagina "login.php"

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.


File "header.php"


<?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.



Pagina "esegui_inserisci.php"


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.


Pagina "elenco_utenti.php"

<?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.

Pagina "mod_ut_form.php"


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.

Pagina "prob_aperte.php"


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.


Pagina "aggiorna_prob.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".