{"id":1437,"date":"2012-09-13T06:30:17","date_gmt":"2012-09-13T04:30:17","guid":{"rendered":"http:\/\/www.manuelmarangoni.it\/sir-bit\/?p=1437"},"modified":"2016-02-12T11:51:09","modified_gmt":"2016-02-12T10:51:09","slug":"creare-un-report-di-salvataggio-per-tutte-le-azioni-del-sito","status":"publish","type":"post","link":"https:\/\/www.manuelmarangoni.it\/sir-bit\/1437\/creare-un-report-di-salvataggio-per-tutte-le-azioni-del-sito\/","title":{"rendered":"Creare un report di salvataggio per tutte le azioni del sito"},"content":{"rendered":"<p>Vi \u00e8 mai capitato che il vostro cliente faccia &#8211; per sbaglio &#8211; una modifica al sito e vi chieda di riportarlo com&#8217;era prima?<br \/>\nUn 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 &#8220;errori umani&#8221; non c&#8217;\u00e8 script che tenga. In questo campo ricadono, per esempio, le cancellazione di utenti registrati al sito, che diventano di fatto irrecuperabili &#8211; a meno che non abbiate un backup del database.<\/p>\n<p>Il pi\u00f9 delle volte il cliente sa di non dover coinvolgere il programmatore, visto che l&#8217;errore \u00e8 esclusivamente suo, ma se trovate qualche personaggio ostico o con cui avete rapporti particolari vi potrebbe <strong>essere utile poter recuperare il record cancellato<\/strong> e riportarlo al suo posto.<br \/>\nEcco quindi che una funzione di report far\u00e0 al caso vostro.<\/p>\n<p>Nel concreto, in questo articolo vedremo una semplice funzione da richiamare sotto ogni query &#8220;di modifica&#8221; (vi rientrano quindi <code>update<\/code>, <code>insert<\/code> e <code>delete<\/code>, ma non le comuni select, che non vanno a intaccare il database). Lo script si occuper\u00e0 di salvare la query intera, con qualche informazioni in pi\u00f9 a vostra discrezione. Io consiglio di <strong>tenere traccia per lo meno di queste informazioni<\/strong>:<br \/>\n&#8211; eventuale id dell&#8217;utente che ha effettuato la modifica (questo solo in caso che ci sia una fase di login)<br \/>\n&#8211; id del record modificato\/cancellato\/inserito<br \/>\n&#8211; la query completa<br \/>\n&#8211; la data dell&#8217;operazione<br \/>\n&#8211; un campo note da compilare per capire quale area del sito l&#8217;operazione ha coinvolto<\/p>\n<p>Questi saranno, di fatto, i campi che andranno a formare la nostra tabella <code>report<\/code> nel database. Nello script ho aggiunto anche il campo <code>tabella<\/code>, per avere direttamente sottomano la tabella coinvolta dall&#8217;operazione.<br \/>\n<em>Una nota<\/em>: la funzione \u00e8 predisposta per accettare anche report che non siano inerenti a query lanciate, cio\u00e8 <strong>\u00e8 predisposta per accettare semplici messaggi di &#8220;promemoria&#8221;<\/strong> (un esempio: se inviate email periodiche, potete compilare solo il campo data con la descrizione che l&#8217;email \u00e8 stata inviata). In questo caso \u00e8 sufficiente lasciare vuoti i campi della tabella non necessari.<\/p>\n<p>Per la comprensione dello script basta una conoscenza di base del php e del mysql.<\/p>\n<p><!--more--><\/p>\n\n        <h2>Download script<\/h2>\n        <div style=\"float:left; width:100%; margin-top:60px; margin-bottom:40px;\">\n        <div style=\"float:left; width:100px;\"><img decoding=\"async\" title=\"[PHP, MYSQL] Creare report per monitoraggio errori\" src=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/themes\/sirbit\/images\/redirect_icon.png\" alt=\"[PHP, MYSQL] Creare report per monitoraggio errori\" \/><\/div>\n        <div style=\"float:left; width:350px; padding-top:30px; font-size:14px;\"><strong><a title=\"[PHP, MYSQL] Creare report per monitoraggio errori\" href=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/code\/php-mysql-creare-report-per-monitoraggio-errori\/\">Pagina diretta alla scheda e al download del codice<\/a><\/strong><\/div>\n        <\/div>\n        <div style=\"clear:both;\"> <\/div>\n<h2>Il database e la funzione report<\/h2>\n<p>Eseguite questa query nel vostro database, che creer\u00e0 la struttura della tabella <code>report<\/code>:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"mysql\" style=\"font-family: monospace;\"><span style=\"color: #990099; font-weight: bold;\">CREATE<\/span> <span style=\"color: #990099; font-weight: bold;\">TABLE<\/span> <span style=\"color: #990099; font-weight: bold;\"><span style=\"color: #009900;\">IF<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> EXISTS<\/span> <span style=\"color: #008000;\">`report`<\/span> <span style=\"color: #ff00ff;\">(<\/span>\r\n  <span style=\"color: #008000;\">`id`<\/span> <span style=\"color: #999900; font-weight: bold;\">int<\/span><span style=\"color: #ff00ff;\">(<\/span><span style=\"color: #008080;\">11<\/span><span style=\"color: #ff00ff;\">)<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span> <span style=\"color: #ff9900; font-weight: bold;\">AUTO_INCREMENT<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #008000;\">`id<span style=\"color: #008080; font-weight: bold;\">_<\/span>utente`<\/span> <span style=\"color: #999900; font-weight: bold;\">int<\/span><span style=\"color: #ff00ff;\">(<\/span><span style=\"color: #008080;\">11<\/span><span style=\"color: #ff00ff;\">)<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #008000;\">`tabella`<\/span> <span style=\"color: #999900; font-weight: bold;\">varchar<\/span><span style=\"color: #ff00ff;\">(<\/span><span style=\"color: #008080;\">255<\/span><span style=\"color: #ff00ff;\">)<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #008000;\">`id<span style=\"color: #008080; font-weight: bold;\">_<\/span>record`<\/span> <span style=\"color: #999900; font-weight: bold;\">int<\/span><span style=\"color: #ff00ff;\">(<\/span><span style=\"color: #008080;\">11<\/span><span style=\"color: #ff00ff;\">)<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #008000;\">`query`<\/span> <span style=\"color: #999900; font-weight: bold;\">varchar<\/span><span style=\"color: #ff00ff;\">(<\/span><span style=\"color: #008080;\">500<\/span><span style=\"color: #ff00ff;\">)<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #008000;\">`note`<\/span> <span style=\"color: #999900; font-weight: bold;\">text<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #008000;\">`data`<\/span> <span style=\"color: #999900; font-weight: bold;\">datetime<\/span> <span style=\"color: #cc0099; font-weight: bold;\">NOT<\/span> <span style=\"color: #9900ff; font-weight: bold;\">NULL<\/span><span style=\"color: #000033;\">,<\/span>\r\n  <span style=\"color: #990099; font-weight: bold;\">PRIMARY KEY<\/span> <span style=\"color: #ff00ff;\">(<\/span><span style=\"color: #008000;\">`id`<\/span><span style=\"color: #ff00ff;\">)<\/span>\r\n<span style=\"color: #ff00ff;\">)<\/span> <span style=\"color: #990099; font-weight: bold;\">ENGINE<\/span><span style=\"color: #cc0099;\">=<\/span><span style=\"color: #990099; font-weight: bold;\">InnoDB<\/span>  <span style=\"color: #990099; font-weight: bold;\">DEFAULT<\/span> <span style=\"color: #ff9900; font-weight: bold;\">CHARSET<\/span><span style=\"color: #cc0099;\">=<\/span>latin1 <span style=\"color: #ff9900; font-weight: bold;\">AUTO_INCREMENT<\/span><span style=\"color: #cc0099;\">=<\/span><span style=\"color: #008080;\">1<\/span> <span style=\"color: #000033;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Passiamo adesso sul lato della programmazione.<br \/>\nLa funzione <code>report<\/code> che ho messo qui sotto ha diversi parametri, che formeranno poi la base per il salvataggio nella tabella creata sopra.<\/p>\n<p><strong>Una breve spiegazione dei parametri<\/strong>:<br \/>\n&#8211; <code>$idutente<\/code> \u00e8 l&#8217;id dell&#8217;utente che ha generato il report<br \/>\n&#8211; <code>$tabella<\/code> \u00e8 la tabella di riferimento nel database (se vuoto, non si riferisce a nessuna tabella)<br \/>\n&#8211; <code>$id_record<\/code> \u00e8 l&#8217;id del record modificato o inserito nella tabella (se 0, non si riferisce a nessun record)<br \/>\n&#8211; <code>$query_report<\/code> \u00e8 la query eseguita (pu\u00f2 essere lasciata vuota)<br \/>\n&#8211; <code>$note<\/code> \u00e8 l&#8217;eventuale commento associato al report<br \/>\n&#8211; <code>$data<\/code> \u00e8 la data e ora di creazione del report (se non specificata prende l&#8217;attuale)<\/p>\n<p>Si pu\u00f2 inserire qualsiasi tipo di record (es: che non sia una query), anche lasciando vuoti <code>tabella<\/code>, <code>id_record<\/code> e <code>query_report<\/code>.<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">function<\/span> report<span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$id_utente<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$note<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"\"<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$data<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"\"<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$tabella<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"\"<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$id_record<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #cc66cc;\">0<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$query_report<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"\"<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\r\n\t<span style=\"color: #b1b100;\">if<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$data<\/span><span style=\"color: #339933;\">==<\/span><span style=\"color: #0000ff;\">\"\"<\/span><span style=\"color: #009900;\">)<\/span>\r\n\t\t<span style=\"color: #000088;\">$data<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #990000;\">date<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #0000ff;\">\"Y-m-d H:i:s\"<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\r\n\t<span style=\"color: #000088;\">$q<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"INSERT INTO report (id_utente, tabella, id_record, query, note, data) VALUES (\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #000088;\">$id_utente<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #0000ff;\">\", '\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #000088;\">$tabella<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #0000ff;\">\"', '\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #000088;\">$id_record<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #0000ff;\">\"', '\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #990000;\">addslashes<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$query_report<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #0000ff;\">\"', '\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #990000;\">addslashes<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$note<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #0000ff;\">\"', '\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #000088;\">$data<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #0000ff;\">\"')\"<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #000088;\">$query<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #990000;\">mysql_query<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$q<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$db<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\r\n<span style=\"color: #009900;\">}<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>Un esempio d&#8217;uso della funzione<\/h2>\n\n<p>Come si usa la funzione qui sopra?<br \/>\nPoniamo il caso che abbiate nel database una tabella chiamata &#8220;categorie&#8221; e che il suo indice autoincrementale sia dato dal campo &#8220;id&#8221; (non ha importanza quali altri campi abbia la tabella).<br \/>\nMettiamo, inoltre, di essere un utente loggato il cui id nel database (salvato in un&#8217;ipotetica tabella &#8220;utenti&#8221;) sia 3. L&#8217;utente in questione clicca sul pulsante di eliminazione della categoria, il cui id sar\u00e0 quindi passato nella variabile <code>$_POST['canc']<\/code>.<\/p>\n<p>In questo esempio, la funzione <code>report<\/code> che abbiamo definito sopra <strong>sar\u00e0 richiamata subito dopo l&#8217;esecuzione della query<\/strong>, cos\u00ec da immagazzinare il suo risultato.<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #666666; font-style: italic;\">\/\/eliminazione categoria<\/span>\r\n<span style=\"color: #b1b100;\">if<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #990000;\">isset<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'canc'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t<span style=\"color: #000088;\">$query<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"DELETE FROM categorie WHERE id=\"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'canc'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #000088;\">$result<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #990000;\">mysql_query<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$query<\/span><span style=\"color: #339933;\">,<\/span> DB<span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\r\n\t<span style=\"color: #666666; font-style: italic;\">\/\/salvataggio del report nel database<\/span>\r\n\treport<span style=\"color: #009900;\">(<\/span><span style=\"color: #cc66cc;\">3<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #0000ff;\">\"Eliminata la categoria con ID \"<\/span><span style=\"color: #339933;\">.<\/span><span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'canc'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #0000ff;\">\"\"<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #0000ff;\">\"categorie\"<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'canc'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #000088;\">$query<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #990000;\">unset<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$_POST<\/span><span style=\"color: #009900;\">[<\/span><span style=\"color: #0000ff;\">'canc'<\/span><span style=\"color: #009900;\">]<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #009900;\">}<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Uno script liberamente scaricabile per creare un report di salvataggio di qualsiasi azione nel sito che vada a intaccare il database. Utile per un ripristino.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78],"tags":[32,4,6],"class_list":["post-1437","post","type-post","status-publish","format-standard","hentry","category-php-mysql","tag-mysql","tag-php","tag-script","cat-78-id"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1437"}],"collection":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/comments?post=1437"}],"version-history":[{"count":18,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1437\/revisions"}],"predecessor-version":[{"id":2392,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1437\/revisions\/2392"}],"wp:attachment":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/media?parent=1437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/categories?post=1437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/tags?post=1437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}