Partage
  • Partager sur Facebook
  • Partager sur Twitter

SAjax et problème tableau js

Sujet résolu
    9 mars 2010 à 17:02:50

    Bonjour,
    J'ai un petit problème concernant le remplissage d'une liste, en SAjax.
    Il s'agit en fait qu'une fonction php renvoie la liste des employés d'une base de données.
    Elle la renvoie donc sous forme de tableau de ce genre:
    ADAMS
    ALLEN
    etc...
    Mon but est d'afficher les différents éléments de ce tableau dans une liste déroulante.
    Mon code est le suivant. Je commence par vider la liste, puis je veux parcourir mon tableau et insérer
    mes éléments dans ma liste.

    <script>
    	<? Sajax_show_javascript(); ?>
    	function do_renvoyer_emp_cb(valeur){
    	var lstemp = document.getElementById("lstemp")
    	var i = valeur.length
    	alert(i)
    	
    	for (j = lstemp.options.length -1; j >= 0; j--)
          	lstemp.options[j] = null	
    
    		for (j=0;j < i;j++)
    		{
    		lstemp.options[lstemp.options.length] = new Option(valeur[j]);
    		}
    	}
    
    	function do_renvoyer_emp(){
    	var valeur;
    	valeur = document.getElementById("jtf_recherche").value;
    	x_renvoyer_emp(valeur, do_renvoyer_emp_cb);
    	}
    	</script>
    


    Or il se trouve que l'alert, devant normalement renvoyer la longueur du tableau (qui est de 14) renvoie
    "undefined". Du coup, impossible de faire fonctionner mon code.
    Or si je remplace i par la constante 14, tout fonctionne.
    Impossible de trouver d'où vient le problème !

    Si vous pouvez m'aider, merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      9 mars 2010 à 17:57:12

      comment est appelé ta fonction do_renvoyer_emp_cb ? et surtout comment est créer la variable qui est donné en paramètre.

      car si valeur est un objet (générique) au lieu d'être un Array le .length va retourner undefined.

      Avec ce code comme exemple:
      var tab=[1,2,3,4,5];
      var obj={0:1,1:2,2:3,3:4,4:5};
      alert(tab.length+" "+obj.length);
      alert(tab[0]+" "+obj[0]);
      
      on peut facilement confondre un objet avec un tableau
      • Partager sur Facebook
      • Partager sur Twitter
        9 mars 2010 à 18:24:08

        Voilà la fonction qui renvoie normalement un tableau.
        Ce qui est étrange c'est que si j'écris valeur[0] dans le javascript, il m'affiche bien le premier élément de mon tableau.

        <?php
        require("Sajax.php");
        	function renvoyer_emp($valeur)
        	{
        	$erreur = False;
        	include_once "oracle.php";
        	$conn = connexion("hehret", "hehret", "oragrive");
        	$tabres = array();
        	$compteur = 0;
        	if (!$erreur)
        	{
        	$requete = "select ename from emp order by 1";
        	$stmt = execution($conn, $requete);
        	}
        		if (!$erreur)
        		{
        			while (oci_fetch($stmt))
        			{
        			 //$tabres[compteur] = oci_result($stmt, "ENAME");
        			$tabres[$compteur] = oci_result($stmt, "ENAME");
        			 $compteur++;
        			//return oci_result($stmt, "ENAME");
        			}
        		}
        	
        	return $tabres;
        	}
        Sajax_init();
        Sajax_export("renvoyer_emp");
        Sajax_handle_client_request();
        ?>
        
        • Partager sur Facebook
        • Partager sur Twitter
          9 mars 2010 à 19:23:36

          Pour avoir la longueur du tableau, au lieu d'utiliser .length utilise ceci:

          var taille=0; //la taille du tableau
          var j=0;
          while(valeur[j]!=null)
          {
          taille++; j++;
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            9 mars 2010 à 19:37:29

            j'ai peut-être raté quelque chose mais je ne vois pas où est appelée la fonction do_renvoyer_emp_cb dans ce code...

            Le problème quand on mélange PHP et javascript c'est qu'on est jamais sûr de ce à quoi ressemble réellement le javascript. Le mieux est de montrer le code généré par PHP (seulement la partie qui nous intéresse car je pense que le code doit être très gros)

            Le fait que valeur[0] retourne une valeur ne prouve pas que c'est un tableau (regarde le code que j'ai mis, l'objet retourne la même valeur que le tableau). Si tu veux vérifier s'il s'agit d'un tableau il faut que tu fasses (valeur instanceof Array) et cela va retourner true si c'est le cas false sinon
            Malheureusement on ne peut pas connaître l'origine de son instance facilement (il n'y a pas de fonction qui retourne l'instance) et typeof retournera Object car les tableaux sont des objets (l'inverse n'est pas forcement vrai)

            EDIT: la fonction de Elektrica89 peut être acceptable (le principe est juste de regarder si le membre valeur[j] existe)
            par contre le !=null est inutile et même trompeur car si valeur[j] vaut 0 ou "" (chaine vide) il s'arrêtera.
            donc il vaut mieux faire: while(valeur[j] || valeur[j]==="" || valeur[j]===0)

            • Partager sur Facebook
            • Partager sur Twitter
              9 mars 2010 à 19:41:28

              Euh restimel, je crois que 0!=null et ""!=null aussi non ? ;)

              EDIT : Et undefined==null donc c'est tout bon ?
              • Partager sur Facebook
              • Partager sur Twitter
                9 mars 2010 à 19:49:19

                ha oui t'as raison!
                je pensais que 0,"",null,undefined était convertit de la même manière mais en fait non!
                je confirme que 0=="", null==undefined, et que 0!=null

                j'ai barré la phrase litigieuse.
                par contre côté performance c'est un peu mieux (dans le cas où "" et 0 sont peu fréquente) :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mars 2010 à 19:50:43

                  Aussi dans ton php :
                  Un compteur n'est pas nécessaire pour remplir ton tableau, c'est même probable qu'au lieu d'avoir toutes les réponses dans ton tableau, tu en es qu'une.
                  <?php
                  while (oci_fetch($stmt))
                  {
                  $tabres[$compteur] = oci_result($stmt, "ENAME");
                  $compteur++;
                  //return oci_result($stmt, "ENAME");
                  }?>
                  

                  Essaye donc ça :
                  <?php
                  while (oci_fetch($stmt)) 
                  $tabres[]=oci_result($stmt,"ENAME");
                  }?>
                  


                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 mars 2010 à 23:50:39

                    Effectivement, la fonction pour calculer la taille marche nickel Elektrica89 ! Merci.
                    Du coup je n'ai plus aucun problème...
                    Pourquoi le .length ne fonctionnait pas, mystère demeure en tous cas.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    SAjax et problème tableau js

                    × 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