Vi è mai capitato che il vostro cliente faccia – per sbaglio – una modifica al sito e vi chieda di riportarlo com’era prima?
Un sito ben strutturato limita al minimo gli errori in lato codice (per esempio, la cancellazione di una categoria se questa contiene ancora elementi), ma dagli “errori umani” non c’è script che tenga. In questo campo ricadono, per esempio, le cancellazione di utenti registrati al sito, che diventano di fatto irrecuperabili – a meno che non abbiate un backup del database.
Il più delle volte il cliente sa di non dover coinvolgere il programmatore, visto che l’errore è esclusivamente suo, ma se trovate qualche personaggio ostico o con cui avete rapporti particolari vi potrebbe essere utile poter recuperare il record cancellato e riportarlo al suo posto.
Ecco quindi che una funzione di report farà al caso vostro.
Nel concreto, in questo articolo vedremo una semplice funzione da richiamare sotto ogni query “di modifica” (vi rientrano quindi update
, insert
e delete
, ma non le comuni select, che non vanno a intaccare il database). Lo script si occuperà di salvare la query intera, con qualche informazioni in più a vostra discrezione. Io consiglio di tenere traccia per lo meno di queste informazioni:
– eventuale id dell’utente che ha effettuato la modifica (questo solo in caso che ci sia una fase di login)
– id del record modificato/cancellato/inserito
– la query completa
– la data dell’operazione
– un campo note da compilare per capire quale area del sito l’operazione ha coinvolto
Questi saranno, di fatto, i campi che andranno a formare la nostra tabella report
nel database. Nello script ho aggiunto anche il campo tabella
, per avere direttamente sottomano la tabella coinvolta dall’operazione.
Una nota: la funzione è predisposta per accettare anche report che non siano inerenti a query lanciate, cioè è predisposta per accettare semplici messaggi di “promemoria” (un esempio: se inviate email periodiche, potete compilare solo il campo data con la descrizione che l’email è stata inviata). In questo caso è sufficiente lasciare vuoti i campi della tabella non necessari.
Per la comprensione dello script basta una conoscenza di base del php e del mysql.
Download script
Il database e la funzione report
Eseguite questa query nel vostro database, che creerà la struttura della tabella report
:
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE IF NOT EXISTS `report` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_utente` int(11) NOT NULL, `tabella` varchar(255) NOT NULL, `id_record` int(11) NOT NULL, `query` varchar(500) NOT NULL, `note` text NOT NULL, `data` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; |
Passiamo adesso sul lato della programmazione.
La funzione report
che ho messo qui sotto ha diversi parametri, che formeranno poi la base per il salvataggio nella tabella creata sopra.
Una breve spiegazione dei parametri:
– $idutente
è l’id dell’utente che ha generato il report
– $tabella
è la tabella di riferimento nel database (se vuoto, non si riferisce a nessuna tabella)
– $id_record
è l’id del record modificato o inserito nella tabella (se 0, non si riferisce a nessun record)
– $query_report
è la query eseguita (può essere lasciata vuota)
– $note
è l’eventuale commento associato al report
– $data
è la data e ora di creazione del report (se non specificata prende l’attuale)
Si può inserire qualsiasi tipo di record (es: che non sia una query), anche lasciando vuoti tabella
, id_record
e query_report
.
1 2 3 4 5 6 7 8 9 |
function report($id_utente, $note="", $data="", $tabella="", $id_record=0, $query_report=""){ if($data=="") $data=date("Y-m-d H:i:s"); $q="INSERT INTO report (id_utente, tabella, id_record, query, note, data) VALUES (".$id_utente.", '".$tabella."', '".$id_record."', '".addslashes($query_report)."', '".addslashes($note)."', '".$data."')"; $query=mysql_query($q, $db); } |
Un esempio d’uso della funzione
Come si usa la funzione qui sopra?
Poniamo il caso che abbiate nel database una tabella chiamata “categorie” e che il suo indice autoincrementale sia dato dal campo “id” (non ha importanza quali altri campi abbia la tabella).
Mettiamo, inoltre, di essere un utente loggato il cui id nel database (salvato in un’ipotetica tabella “utenti”) sia 3. L’utente in questione clicca sul pulsante di eliminazione della categoria, il cui id sarà quindi passato nella variabile $_POST['canc']
.
In questo esempio, la funzione report
che abbiamo definito sopra sarà richiamata subito dopo l’esecuzione della query, così da immagazzinare il suo risultato.
1 2 3 4 5 6 7 8 9 |
//eliminazione categoria if(isset($_POST['canc'])){ $query="DELETE FROM categorie WHERE id=".$_POST['canc']; $result=mysql_query($query, DB); //salvataggio del report nel database report(3, "Eliminata la categoria con ID ".$_POST['canc'], "", "categorie", $_POST['canc'], $query); unset($_POST['canc']); } |