Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau membre du Club
    Notifier à l'utilisateur si on insère une ligne dans la base de données
    Salut,

    Je développe une application PHP avec une base de données Mysql.
    Je voudrais disposer d'un moyen de notifier à l'utilisateur si un nouveau enregistrement est fait dans une table spécifique dans la base de données.

    Merci d'avance pour une solution

  2. #2
    Expert éminent sénior
    Bonjour,

    Ça doit être possible au moyen d'un Trigger qui appelle une UDF qui envoie un message, mais l'utilisateur concerné risque d'être inondé de messages si la table fait l'objet de beaucoup de mises à jour.

  3. #3
    Nouveau membre du Club
    Bonjour,

    Je vois ce que vous voulez dire.En effet, l'application est en client-serveur. Donc Je veux si un utilisateur A donné insère une tuple, un autre utilisateur B qui attaque la même application se voit notifier cette information. En fait votre proposition risque bien sur de gêner. Moi je pense à une icone qui affiche les nouveaux insertions ou un message système comme ceux de windows en bas d’écran. L'icone de notification comme celui de facebook doit être possible.

    Voilà Merci d'une solution

  4. #4
    Expert éminent sénior
    Pour que l'utilisateur soit informé que d'autres utilisateurs ont ajouté ou modifié des lignes, il faut donc un mouchard sur chaque ligne identifiant l'utilisateur de création et de mise à jour ainsi qu'un horodatage de création et de mise à jour (je rappelle qu'il ne faut surtout pas utiliser la colonne auto_increment si présente pour essayer de déduire la séquence d'arrivée).
    A partir de là, il est possible d'identifier toutes les lignes créées depuis la dernière màj de l'utilisateur connecté.
    Si la table concernée est volumineuse, il faut indexer les colonnes mouchard et horodatage.
    Quant à la restitution à l'écran, c'est du ressort de la couche traitement.

  5. #5
    Nouveau membre du Club
    Bonjour,

    En fait j'ai deux comptes : le compte "service" et le service "maintenance".Est-ce possible si le compte "service" fait une insertion ou modification, à distance le compte "maintenance" soit voit notifier cette information sans pour étant être dans un même poste de travail et dans un même lieu ?

    Et j'aimerais savoir comment mettre ben oeuvre les colonnes mouchard et horodatage en mysql ?( je suis pas trop expert).

  6. #6
    Expert éminent sénior
    Salut à tous.

    Ce qui me dérange, c'est l'envoi du message. Sur quel critère allez-vous le faire ?
    L'envoi du message va se faire en php.
    La détection de la modification de votre table va se faire en mysql.
    Cela peut arriver à n'importe quel moment de la journée.

    Sous linux, on utilise la crontab pour lancer périodiquement une tâche.
    Disons que vous le faites une fois par heure.
    Le script va interroger une table dite mouchard, qui va contenir les modifications d'une autre table.
    Cela se fait facilement avec un déclencheur.
    Vous lisez la table mouchard, vous envoyez votre message et vous supprimer le contenu de votre table mouchard.
    Ainsi lors de la prochaine consultation de la table mouchard, vous n'enverrez pas deux fois la même alerte.

    Si maintenant, la période est de l'ordre de la minute, vous risquez de noyez votre utilisateur avec vos alertes.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Nouveau membre du Club
    Bonjour Artemus24,

    Disons que déjà, je travaille sous windows notamment sous wampserver. En fait vous avez raison, l'envoi de messages doit être périodique, c'est ce je préconise même car le secrétaire qui doit traiter les demandes de travail des services(insertion ou modification de la table) ne peut pas être tout le temps devant l’application. Donc une période est nécessaire.
    Pour ce qui l'envoi de messages et la détection d'une d'insertion ou modification de table, je reste sous la proposition d'un exemple car je suis pas expert en la matière.
    Disons je suis à un niveau intermédiaire en Php/MYsql.

    Merci d'avance d'une solution.

  8. #8
    Expert éminent sénior
    Salut

    Voici un exemple de table mouchard :
    Code mysql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    --------------
    START TRANSACTION
    --------------
    
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
    
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `utf8`
            DEFAULT COLLATE       `utf8_general_ci`
    --------------
    
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
    
    --------------
    create table `test`
    (  `id`        integer unsigned not null auto_increment primary key,
       `libelle`   varchar(255)     not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
    
    --------------
    insert into `test` (`libelle`) values
      ('un')
    --------------
    
    --------------
    select * from `test`
    --------------
    
    +----+---------+
    | id | libelle |
    +----+---------+
    |  1 | un      |
    +----+---------+
    --------------
    commit
    --------------
    
    --------------
    DROP TABLE IF EXISTS `mouchard`
    --------------
    
    --------------
    CREATE TABLE `mouchard`
    ( `id`            integer unsigned  NOT NULL,
      `libelle`       varchar(255)      NOT NULL,
      `horodatage`    timestamp(6)      NOT NULL,
      `utilisateur`   varchar(255)      NOT NULL,
      `commentaire`   varchar(255)      NOT NULL,
      `rang`          integer unsigned  NOT NULL auto_increment primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
    
    --------------
    DROP TRIGGER IF EXISTS `ajout`
    --------------
    
    --------------
    CREATE TRIGGER `ajout`
    AFTER INSERT ON `test`
    FOR EACH ROW
    BEGIN
            insert into `mouchard` (`id`,`libelle`,`horodatage`,`utilisateur`,`commentaire`) values
            (new.id, new.libelle, current_timestamp(6), current_user(), "insert");
    END
    --------------
    
    --------------
    DROP TRIGGER IF EXISTS `modif`
    --------------
    
    --------------
    CREATE TRIGGER `modif`
    BEFORE update ON `test`
    FOR EACH ROW
    BEGIN
            insert into `mouchard` (`id`,`libelle`,`horodatage`,`utilisateur`,`commentaire`) values
            (old.id, old.libelle, current_timestamp(6), current_user(), "update");
    END
    --------------
    
    --------------
    DROP TRIGGER IF EXISTS `suppr`
    --------------
    
    --------------
    CREATE TRIGGER `suppr`
    BEFORE delete ON `test`
    FOR EACH ROW
    BEGIN
            insert into `mouchard` (`id`,`libelle`,`horodatage`,`utilisateur`,`commentaire`) values
            (old.id, old.libelle, current_timestamp(6), current_user(), "delete");
    END
    --------------
    
    --------------
    insert into test (libelle) VALUES ('deux'),('trois'),('quatre')
    --------------
    
    --------------
    update test set libelle = 'trente-deux' where libelle like 'deux'
    --------------
    
    --------------
    delete from test where libelle like 'trois'
    --------------
    
    --------------
    insert into test (libelle) VALUES ('cinq')
    --------------
    
    --------------
    select * from test
    --------------
    
    +----+-------------+
    | id | libelle     |
    +----+-------------+
    |  1 | un          |
    |  2 | trente-deux |
    |  4 | quatre      |
    |  5 | cinq        |
    +----+-------------+
    --------------
    select * from mouchard
    --------------
    
    +----+---------+----------------------------+----------------+-------------+------+
    | id | libelle | horodatage                 | utilisateur    | commentaire | rang |
    +----+---------+----------------------------+----------------+-------------+------+
    |  2 | deux    | 2020-09-15 17:43:47.614383 | root@localhost | insert      |    1 |
    |  3 | trois   | 2020-09-15 17:43:47.614383 | root@localhost | insert      |    2 |
    |  4 | quatre  | 2020-09-15 17:43:47.614383 | root@localhost | insert      |    3 |
    |  2 | deux    | 2020-09-15 17:43:47.632446 | root@localhost | update      |    4 |
    |  3 | trois   | 2020-09-15 17:43:47.639779 | root@localhost | delete      |    5 |
    |  5 | cinq    | 2020-09-15 17:43:47.654138 | root@localhost | insert      |    6 |
    +----+---------+----------------------------+----------------+-------------+------+
    --------------
    COMMIT
    --------------
    
    
    Appuyez sur une touche pour continuer...

    A chaque intervention sur la table test, sauf sur le lecture, un trace est faite dans la table mouchard.
    Ainsi on connait l'ancienne valeur du libelle, avant modification, ainsi que la date et l'heure et l'utilisateur qui est intervenu.
    On identifie la ligne qui a été modifié par la colonne "id".
    La colonne "rang" ne sert qu'à rendre chaque ligne de la table mouchard unique.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Nouveau membre du Club
    Bonjour,

    Je comprends bien cet exemple et l’intérêt de la table mouchard.
    Mais si je veux envoyer une notification à un compte d'utilisateur connecté, quelle technique je vais utiliser et comment je vais exploiter la table mouchard ?

  10. #10
    Expert éminent sénior
    Salut madinadiouf.

    Pour ce qui est du php, vous devez vous adresser à un autre forum.
    Celui-ci est consacré exclusivement à mysql et ses aspects techniques.
    Pour envoyer un message, vous pouvez utiliser la fonction "mail()".
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="ISO-8859-1" />
    <title>On test la fonction mail()</title>
    
    <link rel="stylesheet" type="text/css" href="Styles.css" />
    </head>
    
    <body>
    <?php
    
    $to       = "adresse du destinataire";
    $subject  = "Test email !";
    $message  = "Voici un message envoyé depuis un script HTML/PHP avec le paramétrage de php.ini !";
    
    $headers  = "MIME-Version: 1.0\n";
    $headers .= "From: votre adresse email à vous\n";
    $headers .= "X-Mailer: PHP/" . phpversion() . "\n";
    ?>
    
    <h1>Envoi d'un message vers l'adresse E-MAIL : <?php echo $to ?></h1>
    
    <?php
    $envoi = mail($to, $subject, $message, $headers);
    
    if ($envoi == true)	echo "<br /><h1>L'email a été envoyé avec succès.</h1>";
    else			echo "<br /><h1>&eacute;chec de l'envoi d'un email</h1>";
    ?>
    
    </body>
    </html>


    Citation Envoyé par madinadiouf
    Mais si je veux envoyer une notification à un compte d'utilisateur connecté, quelle technique je vais utiliser et comment je vais exploiter la table mouchard ?
    Vous avez configuré, dans crontab ou dans le planificateur de tâche, l'exécution périodique (disons deux fois par jour) de votre script php.
    Ce script php va lire ligne par ligne le contenu de la table mouchard et en constitant votre message.
    Si la table mouchard est vide, vous ne faites aucun envoi de message.
    Inversement, selon le type d'intervention sur votre table, vous introduisez la phrase suivante pour chaque ligne lue :

    --> Ajout par l'utilisateur 'root' de la ligne "id=2" à "2020-09-15 17:43:47".
    --> Modification par l'utilisateur 'root' de la ligne "id=2" à "2020-09-15 17:43:47".
    --> Suppression par l'utilisateur 'root' de la ligne "id=3" à "2020-09-15 17:43:47".

    Le nombre de lignes à introduire dans votre courrier dépend aussi de la fréquence de consultation de la table mouchard.

    La mise en forme du message vous incombe, mais dans mon exemple, je n'ai mis qu'une seule colonne.
    Cette colonne contient l'ancienne valeur avant intervention de l'utilisateur, pour faire soit un update ou un delete.

    Vous pouvez mettre dans mouchard autant de colonnes que vous en avez dans votre table de référence.
    Ces colonnes contiendront les anciennes valeurs avant intervention sur la ligne.
    Ou encore, mettre dans une colonne spéciale, uniquement les colonnes ainsi que les anciennes valeurs qui ont été modifiées.
    Le déclencheur sera un peu plus complexe car vous serez obligés de tester chaque colonne, genre "if NEW.col <> OLD.col ...".

    Après chaque lecture d'une ligne de la table mouchard, vous la supprimez.
    Quand vous aurez envoyé le message, normalement, la table mouchard sera vide.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

###raw>template_hook.ano_emploi###