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

JavaScript Discussion :

Requ�te Access via PHP/XML


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut Requ�te Access via PHP/XML
    Yop,

    je suis en train de faire une petite api pour g�rer un stock l� o� je travaille, et j'ai un petit soucis lors de l'appel � la BDD.
    En fait tout fonctionne bien. Pour vous expliquer voici le code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    35
     
    function ajax(num, arg)
    {
        var xhr=null;
     
        if (window.XMLHttpRequest) { 
            xhr = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) 
        {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
     
        var ii = [];
        xhr.onreadystatechange = function() { 
            if (xhr.readyState==4) 
            {
    	        var	docX = xhr.responseXML;
    	        var items = docX.getElementsByTagName("rep");
    	        if (items.length != 0){
    		        for (i=0;i<items.length;i++)
    		      	{
    			      	ii[i] = items[i].getAttribute("ii");
    		      	}
    	        }
    		    else
    		        {alert("rien trouvé");}
            }
        };
        xhr.open("GET", "requete_mysql_xml.php?num=" + num + "&arg=" + arg, true);
        xhr.send(null);
        var i = 0;
    //	while (ii.length == 0) {}
        return ii;
    }
    En gros tout � la fin vous pouvez voir que j'ai mis un "while", et ce parce que sinon le code continue � s'ex�cuter sans que xhr.readystate soit � 4, et par cons�quence sans que mes donn�es soient r�cup�r�es depuis la bdd.
    Le probl�me l� dedans c'est que �a fait bugger le navigateur, et l� en particulier il me demande � chaque fois si je veux arr�ter le script gourmand.

    Donc voil�, j'aurais aim� savoir si vous connaissiez une parade � �a

    Merci d'avance
    A+
    saipas

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    D�tails du profil
    Informations personnelles :
    �ge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par d�faut
    Salut,

    Ton code est correct, et ta requ�te AJAX est asynchrone, d'o� la continuit� d'ex�cution, et la fonction de rappel onreadystatechange. Ton souci c'est que ta variable ii est locale � ta fonction . Plut�t ce code::
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
     
    var ii = [];
    function ajax(num, arg)
    {
        var xhr=null;
     
        if (window.XMLHttpRequest) { 
            xhr = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) 
        {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
     
        xhr.onreadystatechange = function() { 
            if (xhr.readyState==4) 
            {
    	        var	docX = xhr.responseXML;
    	        var items = docX.getElementsByTagName("rep");
    	        if (items.length != 0){
    		        for (i=0;i<items.length;i++)
    		      	{
    			      	ii[i] = items[i].getAttribute("ii");
    		      	}
    	        }
    		    else
    		        {alert("rien trouvé");}
            }
        };
        xhr.open("GET", "requete_mysql_xml.php?num=" + num + "&arg=" + arg, true);
        xhr.send(null);
    }
    d�s que ta requ�te AJAX a fini et r�cup�r� ses donn�es, alors ton tableau ii est accessible.

    ERE

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut
    Salut Emmanuel,

    merci pour ta r�ponse.
    Je crois que ton astuce ne convient pas tout � fait au reste de mon code. En gros la fonction ajax (renomm�e fetchSQL depuis :p) se trouve dans un .js, et est appel�e directement par la page (comme tu t'en doutes) avec un truc du genre :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    	var rslt = fetchSQL(num, arg);
        for (i=0;i<rslt.length;i++)
      	{
          	nv = new Option(rslt[i]);
          	document.getElementById('selectObj').options[document.getElementById('selectObj').length] = nv;
      	}
    Donc voil�, si j'utilise une variable globale ii ne vais-je pas avoir du mal pour la suite de l'ex�cution, qui affiche le r�sultat de la requ�te sur ma page?

    Encore merci pour ton aide

  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    D�tails du profil
    Informations personnelles :
    �ge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par d�faut
    Re,

    Ce n'est pas une "astuce" mais la d�marche normale dans le cadre d'un appel asynchrone: tu ne peux pas acc�der de suite aux donn�es car ton script ne bloque pas le navigateur le temps de l'appel AJAX. D'o� la fonction de rappel

    Si tu souhaites faire ce que tu inscris, alors le code ressemblera - de base - � cela:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    //fctn est la fonction qui recevra le tableau des lignes r�cup�r�es
    function fetchSQL(num, arg, fctn)
    {
        var xhr=null;
        if (window.XMLHttpRequest) { 
            xhr = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) 
        {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
     
        xhr.onreadystatechange = function() { 
            if (xhr.readyState==4) 
            {
    	        var	docX = xhr.responseXML;
                    var ii = [];
    	        var items = docX.getElementsByTagName("rep");
    	        if (items.length != 0){
    		        for (i=0;i<items.length;i++)
    		      	{
    			      	ii[i] = items[i].getAttribute("ii");
    		      	}
                            if (fctn) fctn(ii);
    	        }
    		    else
    		        {alert("rien trouv�");}
            }
        };
        xhr.open("GET", "requete_mysql_xml.php?num=" + num + "&arg=" + arg, true);
        xhr.send(null);
    }
    Et tu appelles ta fonction ainsi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
     fetchSQL(num, arg, function(rslt ){
           for (var i=0;i<rslt.length;i++)
      	    {
          	     nv = new Option(rslt[i]);
      	     document.getElementById('selectObj').options[   document.getElementById('selectObj').length ] = nv;
      	}
        });
    Et bien s�r si ta fonction fetchSQL n'a pas besoin de ce caract�re "g�n�rique", alors tu int�gres directement le code de la fonction de traitement au sein de fetchSQL.

    ERE

  5. #5
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut
    Wow, je t'avouerais que je ne comprends pas tout (voire rien) � ce que tu as fait, mais en tous cas �a marche nickel

    Merci pour l'aide!!

  6. #6
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut
    Lol, je reviens � l'attaque...
    En fait j'utilise pas mal la fonction fetchSQL dans l'api (� chaque fois que je fais une requ�te vers la base) et j'aurais bien aim� avoir un appel � la fonction du style funct(param). C'est possible?

    J'ai essay� de reconstruire un autre tableau � partir de l'autre mais �a fonctionne pas.. je suppose que c'est d� au fait que je ne comprends pas ce que fait ta fonction
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    //marche pas
    function fetchSQL2(num, arg)
    {
    	var rslt2 = [];
    	fetchSQL(num, arg, function(rslt) {
    	    for (i=0;i<rslt.length;i++)
    	  	{
    	      	rslt2[i] = rslt[i];
    	  	}
    	});
    	return rslt2;
    }
     
    function fillin(num, arg){
    	var rslt = fetchSQL2(num, arg);
        for (i=0;i<rslt.length;i++)
      	{
          	nv = new Option(rslt[i]);
          	document.getElementById('selectObj').options[document.getElementById('selectObj').length] = nv;
      	}
    }

  7. #7
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    D�tails du profil
    Informations personnelles :
    �ge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par d�faut
    Non, c'est toujours le m�me souci, le fait que la requ�te AJAX est asynchrone. Tu ne peux donc pas faire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    	var rslt2 = [];
    	fetchSQL(num, arg, function(rslt) {
    	    for (i=0;i<rslt.length;i++)
    	  	{
    	      	rslt2[i] = rslt[i];
    	  	}
    	});
    	return rslt2;
    Sur le principe c'est ok, sauf que le return a lieu alors que la requete AJAX n'est pas finie...

    Et cela ne t'apporte pas grand chose... plut�t faire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function fillin(num, arg){
    	fetchSQL(num, arg, function(rslt) {
               for (i=0;i<rslt.length;i++)
      	      {
          	      nv = new Option(rslt[i]);
          document.getElementById('selectObj').options[document.getElementById('selectObj').length] = nv;
      	      }
           }
    }
    Je ne suis pas convaincu de l'int�r�t (ou de l'avantage) de cr�er une telle focntion mais c'est la d�marche.

    ERE

  8. #8
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut
    Ok merci pour la r�ponse.

    Je fais �a parce qu'� c�t� j'ai un appel � la fonction fillin depuis un bouton. L� en l'occurence c'est une page test donc effectivement c'est pas folichon mais sur mes autres pages �a va chercher des valeurs de textbox puis fait une recherche dans la base.

    Voili voilou, merci encore

  9. #9
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    D�tails du profil
    Informations personnelles :
    �ge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par d�faut
    Citation Envoy� par saipas Voir le message
    Ok merci pour la r�ponse.

    Je fais �a parce qu'� c�t� j'ai un appel � la fonction fillin depuis un bouton. L� en l'occurence c'est une page test donc effectivement c'est pas folichon mais sur mes autres pages �a va chercher des valeurs de textbox puis fait une recherche dans la base.

    Voili voilou, merci encore
    OK, je comprends un peu mieux, ce sera effectivement plus clair ainsi

    Bon dev,

    ERE

  10. #10
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut
    Petite pr�cision : j'ai d� modifier �a dans la fonction fetchSQL, sinon quand il n'y avait pas de r�sultat � la requ�te �a ne renvoyait rien du tout...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    		    else
    		    {
    		        ii[0] = "Rien trouvé";
    		        fctn(ii);
    		    }
    A+

  11. #11
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    D�tails du profil
    Informations personnelles :
    �ge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par d�faut
    Plut�t:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var ii = [ "Rien trouvé" ];
    if (items.length > 0){
      for (i=0;i<items.length;i++)
      {
         ii[i] = items[i].getAttribute("ii");
      }
    }
    fctn(ii);


    ERE

  12. #12
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    61
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Par d�faut
    Adjug� vendu!

Discussions similaires

  1. [AC-2003] Pilotage access via PHP
    Par Nheil dans le forum Access
    R�ponses: 4
    Dernier message: 15/04/2010, 11h33
  2. Requ�te Access via Delphi
    Par zemeilleurofgreg dans le forum Bases de donn�es
    R�ponses: 6
    Dernier message: 30/09/2008, 17h36
  3. [ODBC] Formulaire de recherche dans base ACCESS via PHP
    Par bib.13 dans le forum PHP & Base de donn�es
    R�ponses: 9
    Dernier message: 02/06/2008, 14h06
  4. update dans ACCESS via php et odbc
    Par maraly dans le forum Langage SQL
    R�ponses: 2
    Dernier message: 29/01/2007, 14h54
  5. [MySQL][Access][PHP]Exportation MySQL->Access via PHP en interne
    Par Space Cowboy dans le forum SQL Proc�dural
    R�ponses: 3
    Dernier message: 14/06/2006, 17h29

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