Bug étrange et très très ennuyant

Fermé
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 - 1 mars 2014 à 15:11
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 - 7 mars 2014 à 17:44
Bonjour,

je reposte encore un problème car cela se passe depuis plusieurs jours. C'est très gênant.

Donc voilà. Sur mon site j'ai un système de commentaires, similaire à Commentcamarche.net pour simplifier l'explication: y'a un Textarea pour entrer le commentaire, et un bouton "Envoyer". Le textarea se nomme "umess" (UserMessage). Tout marche sur ce côté-là, tout est bien affiché.

Ce commentaire est, dès qu'on appuie sur "Envoyer", soumis à une requête POST vers un fichier PHP qui traite le texte et qui le publie ensuite sur la page concernée (via une insertion SQL). Et c'est ici que le bug arrive. En effet, je traite toutes les informations, TOUTES fonctionnent et sont ajoutées à la base de données des commentaires. Sauf une, miraculeusement ignorée.


Voici la liste des données envoyées au fichier PHP et inscrites dans la BDD :

* Date du message en format SQL (Y-m-d);
* Identificateur de l'utilisateur pour obtenir son nom dans le titre du message par la suite;
* Identificateur de la page actuellement visitée (Où ira le commentaire une fois inscrit dans la BDD, puis où l'utilisateur sera redirigé);
* Contenu du message (codé en HTML et avec des slashs ajoutés pour éviter l'injection SQL et l'injection HTML).


C'est là que c'est vraiment flippant: toutes les données sont correctement inscrites, date, utilisateur, identificateur de la page, sauf le contenu du message qui apparaît vide ET dans la page de commentaires, ET dans la BDD. Je n'y comprends rien... Il m'est même arrivé de supprimer le commentaire via PhpMyAdmin, côté BDD, pour le voir miraculeusement réapparaître... Avec le contenu révélé !! O_____o

Je suis complètement ahuri devant ce bug, et vu que je m'y connais en SQL autant qu'en programmation exotique, j'aimerais qu'on puisse me répondre à ce bug autant mystérieux que dérangeant. Si cela nécessite que je publie des morceaux de code, je le ferai volontiers.

Cdt
Matthias

14 réponses

-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
2 mars 2014 à 14:25
Up
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
2 mars 2014 à 14:34
Non ça n'est pas logique.

Mais la suppression devrait supprimer le commentaire, la réapparition n'est elle-même pas possible, ce n'est pas magique non plus.

Il y a moyen d'avoir un exemple de données insérées et qui apparaissent vident?

La seule hypothèse que je vois, c'est qu'il y a une double insertion dans la BDD. Et lorsque la donnée vide est supprimée, c'est la données complète qui apparaît.

Mais ça il faudrait le vérifier dans la log des requêtes SQL exécutées.
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
2 mars 2014 à 15:23
Tu as l'air de t'y connaître mieux que moi. Mais où sont les logs SQL dans le panneau d'administration ? :\

Donc ce seraient des doublons qui seraient publiés et qui se télescoperaient dans la base de données...? Comment faire pour éviter ce genre de bugs? Un "DISTINCT"? Mais ça marche avec INSERT INTO ?! ;P

Pour l'heure, je constate que ça le fait dans 9 cas sur 10. Je vais encore vérifier mes PHP mais j'ignore si ça vient vraiment de là. Veux-tu que je publie les morceaux de code? J'ai peur de mettre mon site sur un forum public, car il est encore en test Bêta xD
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
2 mars 2014 à 15:36
x'D dernières nouvelles, tu sais quoi? Y'a aussi des commentaires qui disparaissent en cours de route. C'est fascinant à quel point ça peut être bizarre comme bug.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
2 mars 2014 à 18:19
Il faudrait activer les logs du serveur MySQL dans sa config.
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
2 mars 2014 à 21:22
Re,

j'ai consulté les tables. Et aucune valeur n'est à NULL par défaut: ça aurait pu être ça. Car si NULL est par défaut, ça aurait justifié le problème. Néanmoins, je vais commencer à croire que cela vient de mon hébergeur.

Les valeurs sont filtrées par PHP: une valeur nulle (donc vide) est normalement refusée! Donc le problème vient bien de SQL! Et je viens de voir le log SQL, déjà il est pas très intéressant (à vrai dire il n'y a que des statistiques au niveau global du serveur, et non au niveau de ma BDD) et en plus PMA est extrêmement mal configuré. La liste des problèmes détectés par PMA est immense.

Tu crois que je devrais changer d'hébergeur? Et que c'est bêtement de là que vient le problème?
0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
3 mars 2014 à 10:56
Pourrais-tu nous donner le code html de ton formulaire ?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
3 mars 2014 à 11:19
Salut,

Contenu du message (codé en HTML et avec des slashs ajoutés pour éviter l'injection SQL et l'injection HTML)

Pour insérer des données en bdd, il faut oublier les fonctions tel que addslash() ou autre.
Pour éviter les injections sql, tu dois utiliser :
- mysql_real_escape_string() si tu utilises l'API MySQL (obsolète)
- mysqli_real_escape_string() si tu utilises l'API MySQLi
- les requêtes préparées ou quote() si tu utilises PDO

Il n'y a aucune raison d'échapper les caractères html avant l'insertion en bdd.

Tu dois échapper les caractères html à l'affichage des données dans ta page, avec l'utilisation de la fonction htmlentities() avec le bon encodage.

Bonne journée
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
3 mars 2014 à 14:21
Salut,

mon problème n'est pas là sauf si tu penses que ça peut influer :\
0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
3 mars 2014 à 14:55
Fait nous voir le code de ton formulaire html !
Si tous tes champs sont pris en compte sauf un, ça peut venir d'un problème à ce niveau là !
0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
3 mars 2014 à 14:56
En plus tu nous dis le faire volontiers :)
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
4 mars 2014 à 01:55
Mdr.

Soit puisque tu le demandes volontiers xD Bref voilà le code, c'est généré via PHP, aucune erreur vu que ce formulaire fonctionne déjà, mais seulement, certaines fois, les messages apparaissent en blanc (c'est-à-dire un cas mineur, environ 9 cas sur 10 ARGLP) :

<?php
// Extrait de code


// Si le visiteur est connecté on affiche le formulaire via PHP

if (strlen($_SESSION['login']) > 0) {
 echo('<br><form method="post" action="commentaire.php">');
 echo(' <textarea name="umess" id="umess" maxlength=1024>Écrire un commentaire...</textarea><br>');
 echo(' <input type="submit" value="Envoyer">');
 echo('</form><br>');
}
?>

0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
4 mars 2014 à 08:41
Effectivement il est plutôt simple, le bug ne doit pas venir de là.

Si dans ta page commentaire.php tu affiches le $_POST, est-ce que tu le vois bien rempli à chaque fois ? Idem si tu affiches ta requête sql d'insertion ?

Ce qu'il faudrait essayer de déterminer c'est si la donnée n'est pas envoyée par le formulaire (vu ton code ça ne doit pas venir de là), et si elle l'est bien, est-ce qu'elle est insérée en bdd et perdue ensuite, ou est-ce qu'elle n'est même pas insérée.

Détails bête mais j'imagine que tu déjà vérifié que tu utilisais bien $_POST['umess'] tout le temps et que tu n'as pas une faute de frappe à un endroit ?


Sinon quand tu disais que tu as vu le contenu réapparaitre, tu veux dire dans la bdd ?
Est-ce que tu as pensé à vérifier les autres champs de ta ligne, c'était bien exactement la même ?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
4 mars 2014 à 14:07
environ 9 cas sur 10

Il faudrait identifier ce qu'il y a de différents pour le cas qui ne fonctionne pas. Caractères spéciaux ?

Tu peux faire des tests et vérifier l'état de ta variable à chaque étape du traitement :
- à la récupération du message dans $_POST
- après l'échappement des caractères sql avant l'insertion en bdd
- etc..
0
Ok merci les gars, je vais faire une série de tests et voir ce qui en advient. Ca doit venir des accents, une fois j'ai mis du cyrillique dans un post et rien n'est apparu. Mais le plus curieux c'est l'absence de date aussi, parfois. Cependant j'ai déjà vu un membre qui ne rencontrait jamais aucun problème avec les commentaires... Pff, à croire que c'est sélectif ;-D

Je vous tiens au jus de Ricard.
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
4 mars 2014 à 23:59
O_o ça alors, ça vient de l'encodage...

Tous les commentaires avec des accents sont refusés! Systématiquement!

Comment remédier à ce problème sachant que je peux modifier l'encodage des attributs? Lequel mettre, parmi la liste immense qu'il y a? Ou alors, comment encoder en ISO (genre é = é) pour que ça devienne du ANSI brut?

Merci d'avance et merci de vos réponses.


Par contre ça répond pas au fait qu'un commentaire effacé réapparaisse, mais bon j'ai du mal voir après tout...
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
5 mars 2014 à 04:03
Apparemment c'est un problème d'encodage dans les attributs MySQL. Mais comment convertir les messages en codes ISO ou encore faire que les tables veuillent bien accueillir des accents? Et pourquoi c'est TOUT le message qui saute, les caractères sont pas plutôt censés JUSTE bugger ?!

Vous m'avouerez que c'est un peu con...
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
6 mars 2014 à 09:31
Le sgbd gère très bien les accents et l'encodage, à condition d'utiliser les bonnes méthodes.

Si ton échappement de caractère pour l'insertion en bdd est fait avec addslashes() ou de htmlentities, rien ne garanti que ta requête soit syntaxiquement correcte et donc aucune donnée n'est enregistré.

Regarde mon premier message : pour échapper les caractères spéciaux sql il faut utiliser les requêtes préparées ou mysqli_real_escape_string() selon l'api utilisé, et rien d'autre.
Ces fonctions sont les seules à connaitre les caractères spéciaux et l'encodage utilisé par le sgbd.
0
-Shadow- Messages postés 2149 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 17 juin 2023 269
7 mars 2014 à 17:44
Ok merci beaucoup, je vais arranger le code et vous tenir au jus. Faut dire que moi et les SGBDR, ça fait deux xD
0
J'ai l'impression que la base de données de CCM rencontre aussi des soucis. Déjà j'arrive pas à me connecter entre les pages, la session se perd, et mon ancien message était invisible...
0