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
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    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
    Quand une tête pense seule, elle devient folle.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    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
    Quand une tête pense seule, elle devient folle.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    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
    Quand une tête pense seule, elle devient folle.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    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
    Quand une tête pense seule, elle devient folle.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    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
    Quand une tête pense seule, elle devient folle.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 61
    Points : 26
    Points
    26
    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