IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

PHP & Base de données Discussion :

Bug Impossible (à moins d'avoir un serveur quantique)


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Par défaut Bug Impossible (à moins d'avoir un serveur quantique)
    Bonjour à tous !

    Je suis webmaster d'un jeu en ligne (depuis, pfiou, 6 ans je crois) et je suis récemment tombé sur un bug incroyable. Il s'agit de stocker un événement effectué par un joueur. $taba est un tableau contenant les données de l'attaquant, et $tabd, celles du défenseur. Une "squadd" est une équipe. Voici le code :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	$evenement = "Le ".date("d/m/y  H:i").", ".$taba["perso"]." a frappé ".$tabd["perso"]." et lui a infligé des pertes s'élevant à ".$deg." Points de Vie.";
    	if($territoire == $taba["squadd"]){
    		$sql = mysql_query("SELECT id, nom, color FROM squadd WHERE id='$territoire'");
    		$squadd = mysql_fetch_array($sql);
    		$squadd_link = "<a href='lisquadd.php?affsq=".$squadd["id"]."' target='_self' style='color:".$squadd["color"].";'>".$squadd["nom"]."</a>";		
    		$evenement .= "<br />".$tabd["perso"]." ne devrait pas traîner sur le territoire de la S-Quadd ".$squadd_link;
    	}
    	$evenement = addslashes($evenement);
    	mysql_query("INSERT INTO evenements VALUES('1','".$taba["id"]."','1','".$tabd["id"]."','".$tabd["abs"]."','".$tabd["ord"]."','".$tabd["carte"]."','$date','1','$evenement')");
    Ce code n'est compris dans aucune boucle ni aucune fonction. C'est important pour la suite. Vous conviendrez aisément qu'avec un tel code, un seul événement va se mettre en base de donnée. Et c'est le cas. Le problème c'est le contenu étonnant de cet événement ( $evenement ) en base de données :

    Le 25/06/09 à 10:19, Gandalf a frappé Scorpion #078 PNJ et lui a infligé des pertes s'élevant à 160 Points de Vie.
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd La Mission du Donjon
    La ligne qui se répète ne peut pas se répéter, c'est strictement impossible de mon point de vue. Donc si quelqu'un avait une idée, je lui en serait Monstrueusement reconnaissant !

    Merci !

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Etrange.
    Et si tu mets mysql_real_escape_string() au lieu de addslahes() ?
    Fais un echo de ta chaîne "INSERT INTO evenements..."

    Les seules fois où j'ai été témoins de phénomènes paranormaux, c'était toujours en codant
    Bon, à chaque fois, il y avait une explication rationelle... finalement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 122
    Par défaut
    Salut.

    Bon dans le code je ne vois rien d'anormal, surtout si tu dis qu'il n'y a pas de boucle.
    Question un peu con mais est-ce que tu as vérifié dans ta base s'il y a des doublons? (on sait jamais)

  4. #4
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Par défaut
    Étrange en effet , tu as pas le reste du code par hasard ?
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Par défaut
    Le code faisant quelques milliers de lignes, ainsi que quelques inclusions, vous livrer le total du code me semble relativement complexe.


    Et si tu mets mysql_real_escape_string() au lieu de addslahes() ?
    Fais un echo de ta chaîne "INSERT INTO evenements..."
    En fait la variable événement contient déjà le problème (j'ai fait un echo dessus) avant l'addslashes et l'INSERT.
    Donc... voilà.


    Il n'y a aucun doublon dans la base. Et de toutes façons, si c'était le cas, on obtiendrait ça normalement :

    Le 25/06/09 à 10:19, Gandalf a frappé Scorpion #078 PNJ et lui a infligé des pertes s'élevant à 160 Points de Vie.
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd La Mission du Donjon
    Le 25/06/09 à 10:19, Gandalf a frappé Scorpion #078 PNJ et lui a infligé des pertes s'élevant à 160 Points de Vie.
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd La Mission du Donjon
    Le 25/06/09 à 10:19, Gandalf a frappé Scorpion #078 PNJ et lui a infligé des pertes s'élevant à 160 Points de Vie.
    Scorpion #078 PNJ ne devrait pas traîner sur le territoire de la S-Quadd La Mission du Donjon
    Et encore faudrait-il qu'un seul echo puisse afficher plusieurs lignes de BDD en une seule fois, avec un seul mysql_fetch_array dans une seule variable !


    Par contre j'ai découvert une chose qui n'explique pas tout. Il s'agit du script de combat, et il est donc possible qu'il soit appelé deux fois lors d'une attaque (du genre attaque / contre-attaque). MAIS, ça n'explique pas pourquoi la phrase se répète 5 fois, ni pourquoi il ne s'agit que d'une phrase au beau milieu de l'événement, alors que la première ligne du code efface tout événement précédent en lui substituant le nouveau.

    Ce code existe depuis longtemps et n'a jamais posé problème jusqu'à récemment. Il me semble que ça pourrait coïncider avec une mise à jour de PHP qui n'a pas fonctionné (parce que ma version de Debian est trop vieille et sa version de PHP est déjà la plus récente pour que le tout reste stable). Mais si rien n'a été mis à jour, ça ne devrait rien changer normalement.
    Du coup que faire ? Mettre à jour la distribution (paquets introuvables, dommage) ? Faire rebooter le serveur ?

    Bref, je n'avance pas, mais au moins on se marre pas mal

  6. #6
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Virre tout, renomme tes variables et recommence de manière incrémentale.
    Je ne sais pas quoi dire d'autre...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 6
    Par défaut
    Dans ce cas, je vais attendre de voir si une mise à jour ne résoudrait pas le problème.
    Parce que me retaper plusieurs scripts de plusieurs centaines de lignes, ça fait mal au cucu...

  8. #8
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Non mais commence très localement, c'est à dire la portion de code que tu nous as montré. Commence par virrer les call à mysql etc.

    Remarque, je suppose que tu as déjà procédé ainsi.. auquel cas, remonte graduellement dans la call stack, essai d'utiliser un debugger pour tracker les variables etc

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/03/2006, 16h07
  2. [eclipse raccourci] impossible de trouver le rac serveur
    Par chouchou93 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 03/03/2006, 09h10
  3. Pb outlook : impossible de se connecter au serveur
    Par teshub dans le forum Outlook
    Réponses: 5
    Dernier message: 10/10/2005, 16h44
  4. [Debutant]Impossible de se connecter au serveur local
    Par Kenji dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/04/2005, 19h55
  5. base de donné sans avoir un serveur!!
    Par Sawbo dans le forum Bases de données
    Réponses: 7
    Dernier message: 30/07/2004, 09h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo