Partage
  • Partager sur Facebook
  • Partager sur Twitter

Doublon du POST dans un tchat

Sujet résolu
21 juin 2014 à 16:45:25

Bonjour,

J'ai developper un Tchat ajax, et quelques fois, dans de rare cas, ou selon la personne, le tchat rentre 2x le même message dans la bdd.

Techniquement au vue du code, je ne vois pas de quoi ça peut venir, mais théoriquement je sais comment le contourner.

Faudrait juste que au moment de l'envoi, je vérifie que le message posté n'est pas le même que le dernier qui se trouve dans la base de données

Mais je voulais savoir, si j'étais obligé de refaire une requête de selection pour vérifier, ou si il y avait un moyen plus simple ?

mysql_query("INSERT INTO shootbox VALUES('','".$_SESSION['login']."','".$message."','".time()."')") or die(mysql_error());

Voilà ma requête

Merci

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 10:30:19

Salut,

le problème du doublon ne vient probablement pas de ton code mais plutôt de la personne qui rafraichit sa page alors qu'elle à des données POST en mémoire.

Je te renvoie donc vers ce tuto :

-
Edité par _stoakes 22 juin 2014 à 10:30:49

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 13:33:43

J'ai déjà consulter ce tuto, mais la solution ne me plaît pas (avec les sessions)

Car admettons, une personne poste la même chose, mais à 10 minutes d'interval, il ne pourrait pas.

Et comme c'est de l'ajax le tchat, ce n'est pas avec un refresh qui renvoit les données, c'est bien le formulaire qui poste 2x fois (en appuyant sur entré rapidement, ou en ayant un coup de lag)

Pour cette raison que je voulais vérifier le message posté qui ne soit pas le même que le dernier message de la bdd 

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 19:23:54

Dans ce cas ... il ne reste que la requête. Mais je ne suis pas certain de la valeur ajoutée par ce procédé, un bannissement de chat pour les floodeurs serait plus efficace (car pédagogue) qu'une vérification.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 20:20:50

C'est plus un tchat entre amis, c'est pas du flood, vraiment, c'est juste que comme j'ai dit, dans certains cas, le message se poste 2x (sans même le vouloir)

Je voulais juste éviter ça :/

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 20:36:18

Bonsoir,

Champ du message unique, et gestion des erreurs.

  • Partager sur Facebook
  • Partager sur Twitter
Merci de signaler votre sujet résolu, cela nous évite des pages de lecture inutile pour arriver au bout de 15 réponses sur la dernière qui dit "merci problème résolut!"
22 juin 2014 à 20:49:00

Non, car le message peut-être reposter plus tard.

Je peux pas le rendre unique

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 20:52:53

Ce que Tartanpion52 dit c'est que dans ta base de données ou tu stocke les messages, tu mets le champ Message avec la propriété UNIQUE. Si il y a un doublon, l'insertion sera refusée, ça fera une erreur et tu n’auras plus qu'à gérer cette erreur.

Typiquement :

<?php

mysqli_query($bdd,'Insert into TableMessages ("IdPosteur","Message") values ("21","Ceci est une explication") ') or die('Les doublons sont interdits')



-
Edité par _stoakes 22 juin 2014 à 20:53:16

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 21:06:50

Et je répète ce que j'ai dit, un même message peut tout à fait être posté quelques minutes plus tard, c'est pas le problème, ne serait-ce que de 2 personnes différente.

C'est un mini tchat, un simple "Mdr" par exemple, je peux pas interdire les doublons de ça.

C'est pour ça que je voulais comparé le message posté avec le dernier de la BDD, car comme il y a genre même pas 2s d'écart entre les deux mêmes messages postés, je pourrai juste faire la condition de vérification et l'empêcher.

Mais c'est assez compliqué en faite, j'ai essayer, et j'ignore pourquoi, ça n'a pas marché. :S

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 23:15:27

Coupa1n a écrit:

Mais c'est assez compliqué en faite, j'ai essayer, et j'ignore pourquoi, ça n'a pas marché. :S


Si tu nous montrais du code ça serait plus simple.

Comme tu as des besoins spécifiques, à part une requête je ne vois pas de test. Normalement

 Select count(*) from Table where Message = "'.$_POST['message'].'" and Timestamp < Condition #exemple, Il faudra sécuriser la variable

fonctionne. C'est pas franchement dur.

Vérifie tout de même que la sécurisation sur ce que tu insert et ce que tu teste est la même (htmlentities($message) est différent de mysqli_real_escape_string($bdd,$message) )




  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2014 à 2:39:27

Grosso modo, le code d'enregistrement donne ça : 

$lastMessage = mysql_query('SELECT * FROM shootbox ORDER BY id DESC LIMIT 1') or die(mysql_error());
      $datalastMessage = mysql_fetch_array($lastMessage);
      
      if($message !== $datalastMessage['message'])
        $postMessage = mysql_query("INSERT INTO shootbox VALUES('','".$login."','".$message." ','".time()."')") or die(mysql_error());   


Quand je fais des test, $datalastMessage['message'] contient bien le dernier message de la BDD

Mais ça poste quand meme, alors je comprends rien..

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2014 à 10:51:12

:pirate:

différent de : != pas !==



  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2014 à 15:14:01

Mouarf, cette erreur de débutant xD

Ca fait bien trop longtemps que j'en ai pas fait des différent de, ça m'a perdu faut croire

Merci ^^

  • Partager sur Facebook
  • Partager sur Twitter