| Auteur | |
|---|---|
| jQz | # 13 Jul 2009 - 14:50:13 |
| 364 Posts |
Bonjour à tous et à toutes, Depuis hier, j'essaie de faire fonctionner correctement un script qui empêcherait les messages doubles (doublons) dans un minichat. Le code du minichat est basé sur ce tutoriel. J'ai effectué quelques petites modifications dessus, ce qui donne ce code : Malheureusement, c'est ce bout de code qui paraît coincer : Explication de ce que je cherche à faire : C'est simple que tout, je cherche à empêcher les doublons. J'ai connaissance de ce tutoriel mais je ne veux pas l'utiliser, car il faut savoir manier les session et d'autres choses que je n'ai pas encore appris. Je préfère donc me tourner vers une solution efficace mais plus simple : Le problème, c'est que actuellement, mon script anti-doublons bloque tout, il m'est impossible de poster un quelconque message. je vous expose mon raisonnement, que j'ai bâtie avant de commencer à coder : Minichat, empêcher les doublons : 1. On fait une requête SQL qui va se charger de récupérer le dernier message posté. 2. On utilise les instructions conditionnelles afin de poser des conditions : 2.a Si le message est identique en tout point par rapport au dernier message posté alors on bloque l'envoie et on affiche un message d'alerte. 2.b Sinon si le message est différent par rapport au dernier alors on envoie le message. Pour ceux qui voudrais tester ce script en local: Créez une nouvelle base de donnée que vous nommerez 'test'. Dans cette même BDD, créez une table nommée 'minichat' qui doit contenir quatre champs. Un premier champ nommé ID de type INT(11) en auto_increment, action primaire. Un second champ nommé pseudo de type VARCHAR(15) Interclassement latin1_swedish_ci. Un troisième champ nommé message de type VARCHAR(255) Interclassement latin1_swedish_ci. En enfin, un dernier champ nommé date de type BIGINT(20). Et voilà .En espérant que quelqu'un pourra éclaircir ma lanterne, parce que là, je sèche. Modifié par jQz (13 Jul 2009 - 22:57) |
| marcv | # 13 Jul 2009 - 18:57:41 |
| 599 Posts |
Salut,a écrit :Ne te manquerait-il pas, entre ces deux lignes, un truc de ce style : ? |
| jQz | # 13 Jul 2009 - 19:19:00 |
| 364 Posts |
Bonsoir marcv et merci de m'avoir répondu. Peut-être bien que si mais je n'en suis pas sûr. J'ai quand même testé ton petit bout de code et voilà le résultat. Admettons que j'écrive un message de test sans ton code, par exemple je rentre comme pseudo : jQz et comme message Test. Il m'affiche bien jQz et Test. J'inclue ton petit bout de code dans le miens, et je réécris un autre message avec le même pseudo mais un contenu différent du précèdent, par exemple : Hello. J'envoie ce message et voilà ce qu'il m'affiche : Pseudo : jQz Message : Test. au lieu de Hello. En bref, il reprend le contenu du message précèdent. Néanmoins, si dans le champ message, j'écris Test., le script anti-doublons fonctionne. En conclusion, je suis paumé . Modifié par jQz (13 Jul 2009 - 19:24) |
| kurt11 | # 13 Jul 2009 - 20:18:11 |
| 101 Posts |
Il faut que tu modifies cette ligne pour que le nouveau message soit inséré. Modifié par kurt11 (13 Jul 2009 - 20:19) Burn IE6, burn! |
| jQz | # 13 Jul 2009 - 20:27:37 |
| 364 Posts |
Bonsoir kurt11, quand j'ai inséré ta ligne de code modifiée, j'ai obtenu l'erreur suivante : Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\wamp\www\minichat\minichat.php on line 45. |
| kurt11 | # 13 Jul 2009 - 20:56:17 |
| 101 Posts |
Au temps pour moi, on a pas besoin des " \' ". Modifié par kurt11 (13 Jul 2009 - 21:43) Burn IE6, burn! |
| jQz | # 13 Jul 2009 - 21:36:41 |
| 364 Posts |
Toujours la même erreur. Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\wamp\www\minichat\minichat.php on line 45 Je pense que ce sont les [ ] qui posent problème. |
| kurt11 | # 13 Jul 2009 - 21:42:17 |
| 101 Posts |
Arf j'avais testé avec ce code et ça fonctionnait bien sur mon serveur. Dans c'est cas là, essaie ceci.Burn IE6, burn! |
| marcv | # 13 Jul 2009 - 21:44:06 |
| 599 Posts |
ou ceci :jQz, avec la correction de kurt plus la mienne, ça devrait fonctionner. Je comprends que tu es en train d'apprendre, donc il est peut-être inutile d'optimiser ; mais à tout hasard, tu pourrais toujours améliorer ton code ainsi :- tester aussi le pseudo, car si deux personnes différentes disent "Salut", ça bloquera le deuxième - la variable $message est inutile, $row[0] suffit - ton elseif ($_POST['message'] != $message) est inutile, un simple else suffit Modifié par marcv (13 Jul 2009 - 21:44) |
| jQz | # 13 Jul 2009 - 22:26:10 |
| 364 Posts |
Merci à vous deux. Voilà le code modifié : Ça marche à merveille .Néanmoins, es-ce quelqu'un pourrait m'expliquer ces deux lignes que je ne comprends pas bien : Comme l'a dit marcv : Je suis en plein apprentissage du PHP. |
| marcv | # 13 Jul 2009 - 22:49:33 |
| 599 Posts |
De manière légèrement simplifiée : mysql_query() te renvoit toujours l'intégralité des résultats demandés, sous la forme d'une variable de type ressource. Dans ton cas, c'est $verification_doublons qui contient, une fois la requête effectuée, toutes les lignes de ta table (et il peut y en avoir beaucoup), et chacune de ces lignes contenant les deux champs demandés.Note : tu pourrais utiliser LIMIT 1 pour ne récupérer que la première ligne. Les autres sont inutiles. Tu ne peux pas utiliser directement une ressource, tu dois extraire les informations qu'elle contient. Avec mysql_fetch_array(), tu extrais une ligne de la ressource dans un tableau (nommé $row, ici). Le prochain appel à mysql_fetch_array() extraiera la seconde ligne, et ainsi de suite.Note : mysql_fetch_array() n'est qu'un moyen parmi d'autres d'extraire les données d'une ressource (cf doc PHP) $row est un tableau PHP contenant les différents champs (colonnes) de la ligne récupérée. Le champ message étant le premier sur la liste de ton SELECT, on le récupère avec $row[0].Note : telle qu'utilisée ici, mysql_fetch_array() te permet également de récupérer le champ par son nom, plutôt que par son index, à savoir $message = $row["message"]; Voilà, arrivé à ce niveau, $message contient la valeur du champ message de la première ligne retournée par ta requête. |
| jQz | # 13 Jul 2009 - 22:56:37 |
| 364 Posts |
Clair, net et précis, que demander de plus, merci beaucoup. Encore merci à vous deux pour votre aide . |