Generazione Log Modifiche Database

di il
8 risposte

Generazione Log Modifiche Database

Ciao a tutti,

volevo chiedervi una mano... io ho una pagina molto semplice che si appoggia ad un db così strutturato:

Id | Barcode | CodiceArticolo | Descrizione |

che serve sostanzialmente per la ricerca di articoli tramite codice a barre. Ci sono poi altre tre pagine "Inserisci articoli" - "Modifica Articoli" - e "Elimina Articoli" .

Ora quello che volevo fare era strutturare una una tabella per gestire il log delle modifiche apportate al db , quindi quando qualcuno ha inserito , modificato o eliminato un articolo.

Per il login degli utenti uso le sessioni.

Ho cercato in giro ma non trovo nulla di esauriente ... o che comunque faccia al caso mio..

Mi date qualche spunto ???

Grazie mille in anticipo

8 Risposte

  • Re: Generazione Log Modifiche Database

    Crea una tabella log, ed a ogni inserimento o modifica ci scriverai dentro i relativi dati.
    come vedi piuttosto banale.
    memorizza data e ora, IP sorgente, utente del programma (se c'è), dati inseriti o modificati.
  • Re: Generazione Log Modifiche Database

    Ciao +m2+ ,

    grazie per la risposta.

    Si piuttosto banale....se hai gli strumenti .... ma a me evidentemente mancano, nel senso che pur avendo chiaro il concetto....poi mi manca la parte di "scrittura" del codice necessario.

    ad esempio io ho le seguenti query , rispettivamente per l'inserimento e la modifica degli articoli ..... ma non so come "agganciarci il pezzo di codice per la generazione dei log:
    if(isset($_POST['inserisci'])){ 
        header("Cache-Control: no-cache"); 
        header("Expires: -1");  
    
    $HOST = 'localhost';
     $USER = '';
     $PASSWORD = '';
    mysql_connect("$HOST","$USER","$PASSWORD");
    
    mysql_select_db("my_");
    
    $id= 'NULL';
    $barcode = $_POST['barcode'];
    $codice = $_POST['codice'];
    $descrizione = $_POST['descrizione'];
    
    
    $toinsert = "INSERT INTO `Db`
    		(id, barcode, codice, descrizione, )
    			VALUES
    			('$id',
    		 	 '$barcode',
    			 '$codice',
    			 '$descrizione'
    			)";
    
    
    $res = mysql_query($toinsert);
    if($res){
    	
    
    		echo("INSERITO");
    
    header("location: inserisci_articoli.php");
    	
    	} 
    
    else
    	{
    	echo("ERRORE '$id',
    		 	 '$barcode'
    			 '$codice'
    			 '$descrizione'
    			 '");
    e
    <?php
    
    if(isset($_POST['cerca'])){
    
    include("connectDB.php");
    
    mysql_select_db("my_web1105");
    
    $id = $_POST['id'];
    
    $sql = "SELECT * FROM `DbTcpos` WHERE id = '".$id."'";
    
    $result = mysql_query($sql);
    
    while($r = mysql_fetch_array($result)) {
    
    $id=$r['id'];
    $barcode=$r['barcode'];
    $codice=$r['codice'];
    $descrizione= $r['descrizione'];
    
    
    echo "<table align='center' cellspacing='50px' style='
    								                      margin-left: 356px;
    					                                  font-size: 50px;
    								   
    			                                          '>
    	<tr>
    		<td>ID</td>
    		<td>BARCODE</td>
    		<td>CODICE</td>
    		<td>DESCRIZIONE</td>
    		
    	</tr>	
    	<tr>
    	   <td><input name='id' readonly='readonly' size='6' value='".$id."'style='text-align:center; height: 40px'>
          <td><input name='barcode'  size='20' type='text' value='".$barcode."'style='text-align:center; height: 40px'></td>
    	  <td><input name='codice' size='10' type='text' value='".$codice."'style='text-align:center; height: 40px'></td>
    	   <td><input name='descrizione' size='50' value='".$descrizione."'style='text-align:center; height: 40px'>
    	   
    	</tr>
    	<tr>
    		<td align='center'; colspan='4'><button type='submit' name='salva' value='SALVA' style='margin-top:60px; margin-bottom: 60px;'>S A L V A</button>                               
    	   </td>
    	</tr>
       </table>
       </form>";
       
    
    }
    }
    
    
    if(isset($_POST['salva'])){ 
        header("Cache-Control: no-cache"); 
        header("Expires: -1");  
    
        
     include("connectDB.php");
     
     mysql_select_db("my_");
    
    $id = $_POST['id'];
    $barcode = $_POST['barcode'];
    $codice = $_POST['codice'];
    $descrizione = $_POST['descrizione'];
    
    
    
    $toinsert = "UPDATE `DbTcpos` SET
    		barcode='$barcode', codice='$codice', descrizione='$descrizione'
    		
    		 WHERE id = '".$id."'";
    
    
    $res = mysql_query($toinsert);
    if($res){
    	
    
    		echo("INSERITO");
    
    header("location: modifica_articoli.php");
    	
    	} 
    
    else
    	{
    	echo("ERRORE ");
    
    mysql_close($connessione);
    }
    }
    ?>
    
    Puoi darmi una mano ?
  • Re: Generazione Log Modifiche Database

    Ti serve una funzione tipo questa
    
    function registra($i_azione,$i_utente,$i_id,$i_idlinkpadre,$i_tipo,$i_blobbone)
    {
    	$gf_tabella=DB_NAME.'.registro';
    	try 
    	{
    		$conn = new PDO(DB_DSN,DB_USER,DB_PASSWORD);
    	} 
    		
    	catch (PDOException $e) 
    	{
    		return -1;
    		exit;
    	}
    	try
    	{
    			$statement = $conn->prepare("INSERT INTO ".$gf_tabella."
    				(data,ora,azione,utente,id,idlinkpadre,tipo,blobbone,richiesta,computer)   
    				VALUES 
    				(now(),now(),:azione,:utente,:id,:idlinkpadre,:tipo,:blobbone,:richiesta,:computer)");
    	}
    	catch (PDOException $e) 
    	{
    		return -2;
    		exit;
    	}
    
    	
    		$statement->bindParam(':azione', $i_azione);
    		$statement->bindParam(':utente', $i_utente);
    		$statement->bindParam(':id', $i_id);
    		$statement->bindParam(':idlinkpadre', $i_idlinkpadre);
    		$statement->bindParam(':tipo', $i_tipo);
    		$statement->bindParam(':blobbone', $i_blobbone);
    		$statement->bindParam(':richiesta', $_SERVER['REMOTE_ADDR']);
    		$miocomputer=gethostbyaddr($_SERVER['REMOTE_ADDR']);
    		$statement->bindParam(':computer', $miocomputer);
    
    		try
    		{
    			$statement->execute();
    		}
    		catch (PDOException $e) 
    		{
    			return -3;
    			exit;
    		}
    }	
    
    per il resto noto che utilizzi metodi davvero "bruti" (e rischiosissimi, se esposti su internet) per operare sul database.
    switcha a PDO e statement preparati (come misura minima).
    In sostanza
    
    $toinsert = "UPDATE `DbTcpos` SET
          barcode='$barcode', codice='$codice', descrizione='$descrizione'
                 WHERE id = '".$id."'";
    [/quote]
    è "terribile", ma lasciando stare questo aspetto mettersti prima di
    
    [quote]
    $res = mysql_query($toinsert);
    [/quote]
    un bel registra(tantibeiparametri)
  • Re: Generazione Log Modifiche Database

    Hai sicuramente ragione su tutta la la linea, ..... ma sono mooolto neofita ed autodidatta , sto cercando di impadronirmi pian piano della materia ... mi ci vuole tempo....

    Comunque grazie per il codice , cerco di plasmarlo in base alla mia esigenza e .... se ho capito bene ....lo inserisco dopo la query e prima di $res= .

    Vediamo cosa ne tiro fuori ... ti faccio sapere
  • Re: Generazione Log Modifiche Database

    Ricapitolando.

    Scrivi una funzione globale cui passi come parametri tante belle cose, in particolare cosa stai per fare, e chi lo farà
    Questa funzione, autonomamente, scriverà in una tabella mysql i parametri che le arrivano (o se preferisci su un file di testo, vedi te)

    Nei tuoi vari script php, a un certo punto, ti troverai tra l'aver predisposto il comando SQL e l'eseguirlo.
    In "mezzo" metti la chiamata alla funzione di registrazione.

    Ci sono alternative: una è quella di fare dei trigger sulle tabelle (una sorta di miniprogrammi MYSQL) i quali vengono attivati autonomamente dalla tua applicazione, prima o dopo certi eventi (tipicamente aggiungi e modifica)
    In questi programmelli puoi fare la stessa cosa: registrare le operazioni.

    Il vantaggio è che funzionano ovunque, indipendentemente dal programma (in sostanza non devi cambiare il sorgente).
    Lo svantaggio è che non conoscono "tutto", in particolare CHI (quale utente) sta facendo una certa operazione sul database.
    A meno che tu non utilizzi un metodo hokuto, ovvero mappare ogni utente dell'applicazione in un utente mysql (si può fare anche questo, ma tipicamente solo se gli utenti sono pochi e rimangono sostanzialmente statici,non mutano nel tempo)

    Concludo col suggerirti, di nuovo, di abbandonare il prima possibile
    
    
    $toinsert = "INSERT INTO `Db`
          (id, barcode, codice, descrizione, )
             VALUES
             ('$id',
               '$barcode',
              '$codice',
              '$descrizione'
             )";
    questo genere di approccio all'interazione dol database, perchè è assolutamente insicuro e deprecabile all'inverosimile.
    Con quella insert potrei prendere il controllo di tutto il tuo sistema e cancellarti le tabelle o qualsiasi altra cosa in pochi secondi.

    Quindi, ricapitolando, invece di scrivere codice su codice che poi BUTTERAI VIA parti già col piede giusto e studia come usare la libreria PDO, con mysql in questo caso, coi relativi statement preparati.
  • Re: Generazione Log Modifiche Database

    Ok accetto il tuo consiglio e passero a PDO...... ma come è possibile intercettare il codice e spazzolarmi le tabelle ???... ......non che non ci creda....ma mi hai allo stesso tempo stupito ed affascinato
  • Re: Generazione Log Modifiche Database

    Alex@1983 ha scritto:


    Ok accetto il tuo consiglio e passero a PDO...... ma come è possibile intercettare il codice e spazzolarmi le tabelle ???... ......non che non ci creda....ma mi hai allo stesso tempo stupito ed affascinato
    Si chiamano trigger, esistono da tanto su mysql (non tantissimissimo, ma tanto, a memoria dalla versione 4)

    Ti suggerisco una ricerca google per "trigger mysql", o iniziare direttamente da qui
    https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

    l'elemento più "disturbante" (e ridicolo) in assoluto è il delimitatore di fine statement, che devi cambiare dallo standard ;
    fai anche attenzione che per mysql (mariadb) l'esecuzione è per EACH ROW, cioè tendenzialmente lenta, nel senso che viene elaborata ogni riga.
    Nel tuo caso non credo sia una limitazione sensibile.

    Infine, se sei proprio "malato", puoi attivare anche il log binario (in realtà in formato testo) per vedere esattamente cosa fa il server.
    Chiaramente questo rallenta abbastanza, perchè i comandi vengono accodati a (grosso modo) un file di testo o poco più (da cui potrai estrarli successivamente)
  • Re: Generazione Log Modifiche Database

    Ciao +m2+,

    OK .... dopo qualche prova .... alla fine ho messo in piedi il sistemino di log , grazie anche alle tue dritte .

    Dato poi che ... l'appetito vien mangiando ... ho messo dentro la tabella anche altri campi che servono per tracciare UTENTE | IP | BROWSER | TIPO DI CLIENT | .....

    Sono davvero soddisfatto !!!!!

    Ora che tuttto funzia ..... mi studio TRIGGER e PDO .... e rimetto tutto in piedi in maniera piu sicura.

    Grazie ancora per le info !!
Devi accedere o registrarti per scrivere nel forum
8 risposte