Partage
  • Partager sur Facebook
  • Partager sur Twitter

problèmes listes déroulantes liées avec AJAX

    20 juillet 2010 à 16:25:23

    Bonjour à tous,

    J'ai un gros problème de liaison entre deux listes déroulantes. Je n'arrive pas à les faire communiquer bien que j'ai suivi le tutoriel sur ce sujet.

    Quelqu'un peut-il m'aider?

    Voici mes codes :

    Page d'accueil :

    <?php
    	include('../config.php');			
    ?>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    	<head>
    		<title>Suppression des images</title>
    		<script type="text/javascript">
    			function getXMLHttpRequest() {
    				var xhr = null;
    	
    				if (window.XMLHttpRequest || window.ActiveXObject) {
    					if (window.ActiveXObject) {
    						try {
    							xhr = new ActiveXObject("Msxml2.XMLHTTP");
    						} catch(e) {
    							xhr = new ActiveXObject("Microsoft.XMLHTTP");
    						}
    					} 
    					else {
    						xhr = new XMLHttpRequest(); 
    					}
    				} else {
    					alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
    					return null;
    				}
    	
    				return xhr;
    			}
    			
    			function readData(oData) {
    				var nodes   = oData.getElementsByTagName("item");
    				var oSelect = document.getElementById("liste2");
    				var oOption, oInner;
    				alert(nodes.length);
    		
    				oSelect.innerHTML = "";
    				for (var i=0, c=nodes.length; i<c; i++) {
    					oOption = document.createElement("option");
    					oInner  = document.createTextNode(nodes[i].getAttribute("nom"));
    					oOption.value = nodes[i].getAttribute("id");
    		
    					oOption.appendChild(oInner);
    					oSelect.appendChild(oOption);
    				}
    			}
    			
    			function request(oSelect){
    				var value = oSelect.options[oSelect.selectedIndex].value;
    				var xhr = getXMLHttpRequest();
    	
    				xhr.onreadystatechange = function() {
    					if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
    						readData(xhr.responseXML);
    						document.getElementById("loader").style.display = "none";
    						
    					} else if (xhr.readyState < 4) {
    						document.getElementById("loader").style.display = "inline";
    						
    					}
    					alert(xhr.readyState);
    				};
    	
    				xhr.open("POST", "ajax.php", true);
    				xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    				xhr.send("categorie="+value);
    			}
    		</script>
    	</head>
    	<body>
    		<p align="center">Bonjour, monsieur Ternisien,</p>
    		
    		<form name="form" method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
    			<select id="liste "name="liste" size="1" onchange="request(this);">
    				<option value="none"></option>
    				<option value="Chaudierefioul">Chaudières fioul/gaz à condensation</option>
    				<option value="Compesair">Pompes à chaleur air/eau ou eau/eau</option>
    				<option value="Chaudieresbois">Chaudières/Poêles à bois/à granulés de bois</option>
    				<option value="Climatisation">Climatisation</option>
    				<option value="Solaire thermique">Solaire thermique</option>
    				<option value="Photovoltaique">Photovoltaïque</option>
    				<option value="Sanitaires">Sanitaires</option>
    			</select><br/><br/>
    			<span id="loader" style="display: none;"><img src="../Images/loader.gif" alt="loading" /></span>
    			<select id="liste2"></select>
    			
    			<input type="submit" value="Supprimer" />
    		</form>
    	</body>
    </html>
    


    Ma page de traitement :

    <?php
    		include("../config.php");
    	header("Content-Type: text/xml");
    
    	echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"."\n";
    	echo "<list>";
    	$idEditor = (isset($_POST["categorie"])) ? htmlentities($_POST["categorie"]) : NULL;
    	if ($idEditor) {		
    		$reponse=$bdd->prepare("SELECT * FROM images WHERE categorie=:categorie") ;
    		$reponse->execute(array(
    			'categorie' => $idEditor
    		));
    		while ($reponse->fetch()) {
    			echo "<item id=\"" . $reponse["id"] . "\" name=\"" . $reponse["nom"] . "\" />";
    		}
    	}
    
    	echo "</list>";
    
    ?>
    


    Page de configuration :

    <?php
    	$host="localhost";
    	$dbname="csc_confort";
    	$user="root";
    	$mdp="";
    	try{
    		$bdd = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $mdp);	
    	}
     
    	catch(Exception $e){
            echo 'Erreur : '.$e->getMessage().'<br />';
        }
    ?>
    


    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2010 à 23:52:22

      Comme ça l'erreur ne saute pas aux yeux que dit la console d'erreur (CTRL+MAJ+J sous chrome et ff) ?
      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2010 à 8:27:18

        Sous Chrome, il me marque cette erreur :

        Uncaught TypeError: Cannot call method 'getElementsByTagName' of null

        En gros, Il n'y a aucun item créé alors que ma base de données contient un enregistrement.

        On dirait que ma variable $_POST n'est pas envoyée via AJAX
        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2010 à 13:12:44

          Ce n'est pas ce qui est envoyé qui pose problème, c'est ce qui est reçu. Visiblement c'est xhr.responseXML qui est NULL.
          À la place de la ligne 55, met un alert(xhr.responseText) et dis nous ce que ça donne.
          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2010 à 13:49:14

            Juste un truc : le header doit pas etre mis avant le include?

            Et un autre petit truc juste pour la lisibilité : c'est nettement mieux d'alterner entre ' ' et " " par exemple :

            <?php
            echo '<?xml version="1.0" encoding="ISO-8859-1"?>'."\n";
            


            Édité suivant les prescriptions de LCaba :p
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2010 à 14:27:02

              Ca me met ce que je veux c'est à dire le fichier XML mais sous forme de texte :

              <?xml version="1.0" encoding="ISO-8859-1"?>
              <list>
              <item..../>
              <item..../>
              </list>
              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2010 à 16:47:48

                @miclebowski : c'est mieux de mettre le header avant en effet car si tu laisse trainer un retour à la ligne après ?> ça plantera.
                En revanche '\n' n'entraine pas un retour à la ligne (en guillemet simple il n'y aucun caractère spécial - à part le guillemet simple). Un retour à la ligne se fait en faisant un vrai retour à la ligne.


                <?xml... doit être situé en tout début de fichier (aucun caractère blanc, retour à la ligne etc...).
                En testant, j'ai bien le même message d'erreur si je mets un retour à la ligne au début ou si j'encode en UTF-8 avec BOM
                • Partager sur Facebook
                • Partager sur Twitter
                  21 juillet 2010 à 17:25:29

                  Alors en gros je dois faire quoi? c'est quand même bizarre que ça marche en texte mais pas en XML
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 juillet 2010 à 17:35:20

                    Non c'est tout à fait normal. La réponse est bien reçue, mais c'est un fichier xml invalide. Donc inutilisable par la methode getElementsByTagName.

                    Ce que tu dois faire, je te l'ai dis plus haut : aucun espace blanc avant <?xml ... et encodage sans BOM si tu es en UTF-8

                    Il peux s'agir d'une autre erreur.

                    Utilise la console d'erreur de FF tu auras plus de détail sur l'erreur xml.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juillet 2010 à 20:48:22

                      D'accord. Mais je ne comprends pas cette histoire de blanc avant <?xml... parce qu'il n'y en a pas, de plus mon encodage est iso-8859-1.

                      Firefox marque :

                      Erreur : instruction de traitement XML ou texte pas au début d'une entité externe
                      Fichier Source : http://localhost/csc/admin/ajax.php
                      Ligne : 1, Colonne : 2
                      Code Source :
                      <?xml version="1.0" encoding="ISO-8859-1"?><list><item id="6" name="IMG_1390.jpg" /><item id="5" name="FIOUL.JPG" /><item id="4" name="fioul condens vies.jpg" /></list>
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 juillet 2010 à 23:47:02

                        Tu es sur que l'encodage du fichier est en iso aussi ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 juillet 2010 à 8:27:11

                          Oui je l'ai modifié hier et ça ne change rien. Je ne comprends rien...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 juillet 2010 à 9:14:01

                            Citation : gawel



                            Erreur : instruction de traitement XML ou texte pas au début d'une entité externe
                            Fichier Source : http://localhost/csc/admin/ajax.php
                            Ligne : 1, Colonne : 2



                            Effectivement l'erreur te dit qu'il y a un espace avant l'entête XML (sans doute un espace dans l'include, essaye de le déplacer comme conseillé précédemment ^^ ). Essaye de le supprimer et ca devrait mieux marcher :) (j'ai testé sans include ca marche parfaitement :waw: ).
                            • Partager sur Facebook
                            • Partager sur Twitter

                            problèmes listes déroulantes liées avec AJAX

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown