Page 1 sur 2

enregistrement des actions

Posté : 03 mars 2012, 13:09
par piotrowski-s
Bonjour, je rencontres certains soucis dans al réalisation d'un script.

j'ai un système ou mes utilisateurs se loguent ... j'aimerais créer une page historique qui répercute toutes les actions effectuées.... le soucis est que je travail avec ajax pour pouvoir faire des modifications sur la même page. je me retrouves donc avec cette problématique:

l'idée serais qu'il y est une table avec comme
entrée :
user <-- qui a fait? exemple jejerome7826
action <-- cas t'il fait? exemple DELETE FROM message WHERE id= 16
donnees_avant <--la donnée avant l'action exemple donnees= coucou s'est moi
date <-- quand l'a t'il fait? exemple 42 mars 2012


donc en gros il me faut une table qui enregistre les commandes SQL des autres table.

et une page qui affiche cette table (mais ça c'est le moins embétant....

Etant donné qu'il y a plusieurs pages, les actions seront nombreuses, mais elles restent assez répétitives...

je ne sais pas comment procéder.... si quelqu'un aurait des pistes à me proposer ?


Par avance merci.


cordialement,

SP.

Re: enregistrement des actions

Posté : 03 mars 2012, 14:10
par Ryle
Il faudrait centraliser l'exécution de tes requêtes... ainsi lorsqu'un utilisateur exécute une action, tu peux, avant de véritablement exécuter celle-ci, consigner les informations correspondantes.

Tu dois pouvoir récupérer les infos sur l'utilisateur dans ta session, la date et heure avec la fonction date() en php ou now() en sql, la requête qu'il veut exécuter devrait donc logiquement être spécifiée en paramètre.

La difficulté consisterai alors juste à récupérer les données avant modification/suppression, mais tu dois pouvoir analyser la requête exécutée pour savoir si c'est un update ou un delete et identifier les éléments concernés (après le WHERE) pour faire une copie des données avant d'exécuter la requête :)

Re: enregistrement des actions

Posté : 03 mars 2012, 14:13
par piotrowski-s
comment centraliser l'exécution de requêtes?

Re: enregistrement des actions

Posté : 03 mars 2012, 14:18
par Ryle
Il faut pour cela que tu crées une fonction qui fera les mysql_query() - ou execute() si tu utilises pdo :)

En gros, quand dans ton code l'utilisateur fait un update ou un delete, au lieu de l'exécuter la requête immédiatement, tu appelles ta fonction en lui passant les éléments nécessaires (par exemple la requête à exécuter). Ta fonction va alors pouvoir enregistrer les infos (utilisateur, action ...) au préalable et fera l'exécution de la requête ensuite :)

Re: enregistrement des actions

Posté : 03 mars 2012, 14:35
par piotrowski-s
je ne comprends pas trop. aurais tu un exemple stp?

Re: enregistrement des actions

Posté : 03 mars 2012, 15:00
par moogli
salut,


En gros il faut ajouter l'utilisation d'une fonction dans toute tes actions.
en gros
<?php
mysql_query('update truc set machin=\'chose\'');
?>
devient
<?php
log($user, $action, $valeur);
mysql_query('update truc set machin=\'chose\'');
?>
et la fonction log fait appel à la db pour le stockage.

perso j'utiliserais plutot une classe pour le logger.

au début du script tu instancie la classe et avant chaque action à utiliser : $log->addLog( .... );

a toi de bien définir les info que tu souhaite sauvegarder.

Pense que ta classe ne doit utiliser directement les super globale (ça permet la réutilisabilitée de la classe).

j'allais oublier : a mon sens cette classe doit être in singleton, et pourquoi pas totalement dé corrélée du système globale (pourquoi en utilisant sqlite).

@+

Re: enregistrement des actions

Posté : 03 mars 2012, 17:17
par piotrowski-s
mais le fait que ça soit du ajax ça peut fonctionner? et comment faire avec les sessions?

Re: enregistrement des actions

Posté : 03 mars 2012, 17:31
par xTG
Ton script Ajax il appelle de toute façon un script PHP non ?
Donc ajax ou pas ajax n'est pas le problème. ;)

Les sessions ? Elles viennent faire quoi là dedans ?
Le fait d'identifier tes utilisateurs via session ?
Dans ce cas dans l'exemple de moogli c'est juste que $user est à remplacer par une variable de session identifiant l'utilisateur.

Re: enregistrement des actions

Posté : 03 mars 2012, 17:35
par moogli
voilà c'est ça tu fait comme tu veux sur le serveur et doit penser a prévoir les cas erreur et il faut que tu le traite correctement en ajax (et donc afficher une belle dans ce cas ;) )


@+

Re: enregistrement des actions

Posté : 03 mars 2012, 17:44
par piotrowski-s
bon maintenant je vois comment faire... A moi d'oeuvrer... ma fois, ça me parait bien difficile tout cela.
merci pour vos réponses

Re: enregistrement des actions

Posté : 04 mars 2012, 01:55
par moogli
aller tiens je viens de faire un exemple fonctionnel, bien entendu a adapter a ce que tu veux :)

logger.class.php : la classe logger qui permet les logs
log.class.php : la classe log, décrit un log (une ligne de log)
logger.sqlite3 : le fichier de base de données sqlite
testlog.php : Le fichier de test qui te montre comment on peux utiliser la chose.

ATTENTION : nécessite php5.3 mini (sinon faut que tu vire l'utilisation des espaces de noms

@+

Re: enregistrement des actions

Posté : 05 mars 2012, 00:59
par piotrowski-s
merci beaucoup ... je vais tenter :) je m'étais lancé dans la création de doubles requêtes... je ne sais pas si ca vaut mieux ?
<?php
if (isset ($_POST['NOUVEAU_NUM_DE_TELEPHONE'])
 {
   // On modifie le num' de téléphone du membre.
   $MAJ_BDD = $bdd->prepare('UPDATE Membres SET telephone = :TEL');
   $MAJ_BDD = $bdd->execute(array('TEL' => $_POST['NOUVEAU_NUM_DE_TELEPHONE']));

   // On ajoute une ligne dans la table 'activites' pour voir que l'utilisateur a modifié son pseudo.
   $MAJ_ACTIVITE = $bdd->prepare('INSERT INTO activites(id, activite, date) VALUES (:id, :activite, :date)');
   $MAJ_ACTIVITE = $bdd->execute(array('id' => 'id du membre',
                                       'activite' => 'Numero de téléphone modifié en'. $_POST['NOUVEAU_NUM_DE_TELEPHONE'] .'.',
                                       'date' => 'xx:xx');
 }
?>

Re: enregistrement des actions

Posté : 05 mars 2012, 10:33
par moogli
oui oui ça fonctionne, le seul problème c'est que tu doit faire ça pour chaque action à logguer.

alors qu'avec une classe tu a juste ajouter l'instanciantion de la classe et une méthode pour l'insertion.

de plus tu ajoute un niveau d'application : tu masque complètement le fonctionnement du log ce qui te permet de changer facilement et a un seul endroit en cas de modif (la si tu a 50 fichiers c'est 50 modif le nombre de fois où tu utilise le log ;)

j'ai corrigé deux trois âneries de fin de nuit + ajout d'une méthode pour l'initialisation de la base sqlite.
j'ai virer la clef primaire en double de la table users et fait fonctionner l'init des tables ;)


@+

Re: enregistrement des actions

Posté : 05 mars 2012, 14:49
par piotrowski-s
je vais tester tout cela, merci beaucoup pour votre aide.

Re: enregistrement des actions

Posté : 05 mars 2012, 18:29
par moogli
de rien , si tu a encore des questions (sur ton code a toi ;) ) hésite pas.

le miens est surement plus que perfectible ;)

@+