Erreur d'analyse XML

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'ai besoin de votre aide pour résoudre une erreur parce que je tourne en rond depuis un moment et je ne vois pas l'origine.

À travers une requête AJAX, je souhaite récupérer les meilleurs scores dans un document XML, que le PHP se charge de faire. Or, si c'est bien un document XML (cf. résultat alert 1) et que le contenu est bon (cf. résultat alert 2), je n'arrive pas à traiter le contenu avec des getElementsByTagName("") -> undefined, mais le code me semble bon. De plus, en me rendant sur ma page php, j'ai ce qui suit :

Les alert m'affichent respectivement :

  • [object XMLDocument]

  • <!DOCTYPE html><html><head><title>Memory</title>meta charset="utf8"/></head><body> <!– Les differentes requêtes :// req = 1 : récupérer les meilleurs scores en fonction de la taille choisie // req = 2 : –> <?xml version="1.0"?> <SCORES><SCORE><CLASSEMENT>1</CLASSEMENT><PSEUDO>toto</PSEUDO><ESSAIS>5</ESSAIS><TEMPS>225.5</TEMPS></SCORE><SCORE><CLASSEMENT>2</CLASSEMENT><PSEUDO>toto2</PSEUDO><ESSAIS>6</ESSAIS><TEMPS>325.5</TEMPS></SCORE><SCORE><CLASSEMENT>3</CLASSEMENT><PSEUDO>toto</PSEUDO><ESSAIS>7</ESSAIS><TEMPS>525.5</TEMPS></SCORE></SCORES></body> </html>

Le code js en question :

 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
// Fonction pour récupérer les meilleurs scores en fonction de la taille (voire et du thème) choisie
function recupereScores() {
    // on récupère la taille choisie
    var taillePourScore = Math.pow(document.getElementById("idChoixTaille").value.split("*")[0], 2)
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            // Traitement réception
            alert(xmlhttp.responseXML)
            alert(xmlhttp.responseText)
            var affichage = "...";
            a = xmlhttp.responseXML;
            b = a.getElementsByTagName("SCORE");
            for (i = 0; i < b.length; i++) {
                affichage += b[i].getElementsByTagName("CLASSEMENT")[0].textContent;
                affichage += b[i].getElementsByTagName("PSEUDO")[0].textContent;
                affichage += b[i].getElementsByTagName("ESSAI")[0].textContent;
                affichage += b[i].getElementsByTagName("TEMPS")[0].textContent;
                affichage += "<br>";
            }
            alert(affichage);
        }
    }
    xmlhttp.open("GET", "http://localhost/Memory/memory.php?req=1&taille="+taillePourScore, true);
    xmlhttp.send();
}

Le code php en question :

 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
      <?php
            if (isset($_GET['req'])) {
                if ($_GET['req'] == '1' && isset($_GET['taille'])) {
                    mysql_connect("localhost", "root", "") or die("Connexion Impossible");
                    mysql_select_db("tmtc");
                    $result = mysql_query("SELECT fk_id_classement, pseudo, nb_essais, temps FROM memory_scores WHERE fk_id_taille = ".$_GET['taille'].";");
                    $doc = new DOMDocument("1.0");
                    $root = $doc->createElement("SCORES");
                    $root = $doc->appendChild($root);
                    while($row = mysql_fetch_array($result, MYSQL_NUM)) {
                        $child = $doc->createElement("SCORE");
                        $child = $root->appendChild($child);

                        $classement = $doc->createElement("CLASSEMENT", $row[0]);
                        $classement = $child->appendChild($classement);

                        $pseudo = $doc->createElement("PSEUDO", $row[1]);
                        $pseudo = $child->appendChild($pseudo);

                        $nb_essais = $doc->createElement("ESSAIS", $row[2]);
                        $nb_essais = $child->appendChild($nb_essais);

                        $temps = $doc->createElement("TEMPS", $row[3]);
                        $temps = $child->appendChild($temps);
                    }
                    $xml_string = $doc->saveXML();
                    header("Content-type:text/xml");
                    echo $xml_string;
                    mysql_free_result($result);
                }
            } else {
                echo "Pas de résultats trouvés";
            }
        ?>

Merci bien !

Édité par Smokiev

T'as quoi en regardant sa source ?

Visiblement, il y a quelque chose (les blancs avant ta <?php ?) avant la déclaration <?xml version="1.0"?>.

PS : tu sais que tu as une injection SQL ?

Édité par vibrice

+0 -0
Auteur du sujet

Salut,

Merci pour ta réponse :-)

Tu veux dire quoi par en regardant sa source ? En tout cas, l'erreur me dit que c'est juste avant le "<" de "<?php", pourtant j'ai juste des espaces (comme tu dis) avant ainsi que la structure basique d'une page html (<!DOCTYPE html><html><head><title>Memory</title><meta charset="utf8"/></head><body>). J'ai donc essayé de supprimer les blancs et de réécrire le "<?php" mais ça n'a rien changé.

J'ai une injection SQL ? Peux-tu m'expliquer ? De toute façon, le memory ne sera pas mis sur internet, mais ça serait intéressant de savoir s'en protéger.

Édité par Smokiev

Cette réponse a aidé l'auteur du sujet

Tu veux dire quoi par en regardant sa source ?

Sur cette page (erreur d'analyse) : clic droit > afficher la source.

ainsi que la structure basique d'une page html

Je n'avais même pas vu : pourquoi tu colles un DOCTYPE et autres balises HTML à un document XML ?!?

J'ai une injection SQL ? Peux-tu m'expliquer ?

Je ne vais pas répéter ce qu'on peut aisément trouver à ce sujet avec un moteur de recherche (et ce sera certainement mieux expliqué) donc je te laisse le soin d'effectuer cette tâche ;)

Édité par vibrice

+1 -0
Auteur du sujet

Sur cette page (erreur d'analyse) : clic droit > afficher la source.

D'accord

Je n'avais même pas vu : pourquoi tu colles un DOCTYPE et autres balises HTML à un document XML ?!?

Ahaha x). L'erreur venait en effet de là ! C'est dû à une erreur de compréhension de ma part. Je pensais que comme le document XML est généré dans le PHP et qu'on l'envoi, les balises ne seraient pas prises en compte. Mais en fait toute la page devient un document XML (donc les balises y compris et/ou ne se retrouvent pas à la bonne place vu qu'elles sont avant le <?xml…), c'est ça ?

Je ne vais pas répéter ce qu'on peut aisément trouver à ce sujet avec un moteur de recherche (et ce sera certainement mieux expliqué) donc je te laisse le soin d'effectuer cette tâche ;)

Pas de soucis ;)

Merci, sujet résolu !

Édité par Smokiev

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte