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 :

[AJAX] Afficher résultat sql à la volée


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [AJAX] Afficher résultat sql à la volée
    Bonjour

    J'essaye d'afficher les résultats d'une requête SQL ligne par ligne (au fur et à mesure de l'exécution de ma requête), sans avoir à rafraîchir ma page.


    Voici mon code qui appelle la fonction js ShowUser (simplifié) - fichier geocode.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <p>
    <div id="719"><b>719 - Usersss info will be listed here.</b></div>
    </p>
     
    <p>
    <div id="727"><b>727-User info will be listed here.</b></div>
    </p>
     
    <script type="text/javascript" >showUser(719)</script> 
    <script type="text/javascript" >showUser(727)</script>
    Voici le code JS - fichier select.js
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    var xmlHttp
    var ID
     
     
    function showUser(str)
    { 
    xmlHttp=GetXmlHttpObject()
    if (xmlHttp==null)
     {
     alert ("Browser does not support HTTP Request")
     return
     }
     
    var url="getcoord.php"
    url=url+"?nrID="+str
    url=url+"&sid="+Math.random()
    ID=str
    xmlHttp.open("GET",url,true)
    xmlHttp.onreadystatechange=stateChanged
    xmlHttp.send(null)
    }
     
    function stateChanged() 
    { 
    //prompt("NO",ID)
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
     { 
    //prompt("YES",ID)
     document.getElementById(ID).innerHTML=xmlHttp.responseText 
     } 
    }
     
     
     
     
    function GetXmlHttpObject()
    {
    var xmlHttp=null;
    try
     {
     // Firefox, Opera 8.0+, Safari
     xmlHttp=new XMLHttpRequest();
     }
    catch (e)
     {
     //Internet Explorer
     try
      {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      }
     catch (e)
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
     }
    return xmlHttp;
    }


    La requête sql qui recupère les infos à afficher (simplifiée) - fichier getcoord.php:
    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
     
    echo "<table border='1'>
    ...
     
    while ($row = @mysql_fetch_assoc($result)) {
    .....
    			  $geocode_pending = false;
    			  echo "<tr>";
    			  echo "<td>" . $row['id'] . " </td>";
    			  echo "<td>" . $row['name'] . " </td>";
     			  echo "<td>" . $row['address'] . " </td>";
    			  echo "<td>" . $row['zip'] . " </td>";
    			  echo "<td>" . $row['city'] . " </td>";
    			  echo "<td>" . $row['state'] . "TEST </td>";
    			  echo "<td>" . $row['country'] . " </td>";
     			  echo "<td>" . $status . " = failed to geocoded</td>";
    			  echo "</tr>";
    			}
     
     
    echo "</table>";
    Si je ne mets pas des alert dans le js, seul le dernier enregistrement de la requête s'affiche.
    Si je mets des alert, tous les enregistrements sont affichés

    J'ai modifié le code js de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    xmlHttp.open("GET",url,false)
    xmlHttp.onreadystatechange=stateChanged
    xmlHttp.send(null)
    }
    
    function stateChanged() ....
    Aucun résultat n'est affiché

    Comment faire pour attendre que la fin de l'exécution du premier appel de la fonction js avant de passer à la suivante (est-ce la solution ?) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <script type="text/javascript" >showUser(719)</script> 
    <script type="text/javascript" >showUser(727)</script>
    Merci d'avance pour votre aide
    Patrice

  2. #2
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    As-tu pensé à grouper les deux appels ajax en un seul, en passant un tableau de paramètres plutôt qu'un paramètre isolé ?
    Tu adapterais le traitement côté serveur en renvoyant une chaine de résultats séparés par un simple caractère de convention, que tu redécouperais en javascript à l'arrivée pour appliquer les contenus reçus aux éléments...

    Et heu... juste par curiosité : c'est normal que la première ligne de ton extrait php n'ait pas son ";" final ?

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse
    Il y a bien une ; dans mon code original (mauvais copier coller).

    en fait il n'y a pas que deux appels. Je génère la ligne d'appel à la fonction js dans une boucle à partir du fichier geocode.php


    Je ne connais par avance le nombre d'appels que je vais effectuer. Tout dépend du résultat rendu par la première sql (je ne l'avais pas montré dans mon premier post dans un but de simplification).
    Voici le code contenant la boucle (fichier geocode.php)
    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
    36
    37
     
     
    // Opens a connection to a MySQL server
    $connection = mysql_connect($host, $username, $password);
    if (!$connection) {
      die("Not connected : " . mysql_error());
    }
     
    // Set the active MySQL database
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
      die("Can\'t use db : " . mysql_error());
    }
     
    // Select all the rows in the markers table
    $query = "SELECT * FROM markers WHERE lat=0";
    $result = mysql_query($query);
    if (!$result) {
      die("Invalid query: " . mysql_error());
    }
     
     
    // Iterate through the rows, geocoding each address
    while ($row = @mysql_fetch_assoc($result)) {
    ?> 
    <div id=<? echo $row['id']; ?>><b>Result of sql will be listed here after JS execution.</b></div>
    <script type="text/javascript" >showUser(<? echo $row['id']; ?>)</script>
     
     
     
     
     
    <?
      }
     
     
    ?>
    Ton idée peut-elle marcher avec cette nouvelle donnée ?

    Merci
    Patrice

  4. #4
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    D'accord je n'avais pas compris que le nombre de liens était calculé, mais :

    Pourquoi alors ne pas directement faire les requêtes vers geocode (que tu voulais effectuer avec ajax après chargement de la page) quand tu construis celle-ci ?

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    La requete que j'appelle après chargement de la page geocode.php effectue une géolocalisation basée sur l'API de googlemap. Chaque recherche d'adresse prend environ 1s à 2s (requete dans getcoord.php).

    Si je lance cette requete dans geocode.php, l'utilisateur peut attendre plusieurs minutes (en fonction du fichier d'adresses) sans que rien ne semble se dérouler.

    Pour cette raison, je désire afficher le résultat de la géolocalisation après le traitement de chaque adresse sans avoir à recharger la page geocode.php pour chaque adresse traitée.

    Patrice

  6. #6
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Quelqu'un pourrait me donner quelques tuyaux pour résoudre mon petit souci ?

    Merci d'avance
    patrice

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Solution trouvée

    geocode.php
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    <script language="javascript" type="text/javascript" src="select.js"></script>
     
     
     
    <?
    require '.....dbinfo.php';
    // Opens a connection to a MySQL server
    $connection = mysql_connect($host, $username, $password);
    if (!$connection) {
      die("Not connected : " . mysql_error());
    }
     
    // Set the active MySQL database
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
      die("Can\'t use db : " . mysql_error());
    }
     
    // Select all the rows in the markers table
    $query = "SELECT * FROM markers WHERE lat=0";
    $result = mysql_query($query);
    if (!$result) {
      die("Invalid query: " . mysql_error());
    }
     
     
    // Iterate through the rows, geocoding each address
    while ($row = @mysql_fetch_assoc($result)) {
    ?> 
    <script type="text/javascript" >ajaxFunction(<? echo $row['id']; ?>)</script>
    <p>
    <div id="<? echo $row['id']; ?>"<b><? echo $row['id']; ?>-User info will be listed here.</b></div>
    </p>
     
     
     
     
    <?
      }
     
     
    ?>
     
    </body>
    </html>

    select.js

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    function ajaxFunction(ID){
     var ajaxRequest;  // The variable that makes Ajax possible!
     var ID;
     
     try{
       // Opera 8.0+, Firefox, Safari
       ajaxRequest = new XMLHttpRequest();
     }catch (e){
       // Internet Explorer Browsers
       try{
          ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
       }catch (e) {
          try{
             ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
          }catch (e){
             // Something went wrong
             alert("Your browser broke!");
             return false;
          }
       }
     }
     // Create a function that will receive data
     // sent from the server and will update
     // div section in the same page.
     ajaxRequest.onreadystatechange = function(){
       if(ajaxRequest.readyState == 4){
       	  //prompt (ajaxRequest.responseText,ID);
          document.getElementById(ID).innerHTML=ajaxRequest.responseText;
    	  //var ajaxDisplay = document.getElementById(ajaxdiv);
          //ajaxDisplay.value = ajaxRequest.responseText;
       }
     }
     // Now get the value from user and pass it to
     // server script.
     
     
    var str = ID;
    var url="getcoord.php"
    url=url+"?nrID="+str
    url=url+"&sid="+Math.random()
    ajaxRequest.open("GET", url , true);
    ajaxRequest.send(null);
    }


    getcoord.php (gere la sql qui interroge la bdd et l'api de GoogleMaps)

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    <?php
    require '....dbinfo.php';
     
     
    define("MAPS_HOST", "maps.google.com");
    define("KEY", "PUT YOUR KEY HERE");
     
    $nrID=$_GET["nrID"];
     
     
    // Opens a connection to a MySQL server
    $connection = mysql_connect($host, $username, $password);
    if (!$connection) {
      die("Not connected : " . mysql_error());
    }
     
    // Set the active MySQL database
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
      die("Can\'t use db : " . mysql_error());
    }
     
    // Select all the rows in the markers table
    $query = "SELECT * FROM markers WHERE id=".$nrID;
    $result = mysql_query($query);
    if (!$result) {
      die("Invalid query: " . mysql_error());
    }
     
    // Initialize delay in geocode speed
    $delay = 0;
    $base_url = "http://" . MAPS_HOST . "/maps/geo?output=csv&key=" . KEY;
     
     
    echo "<table border='1'>
    <tr>
    <th>ID</th>
    <th>Company</th>
    <th>Address</th>
    <th>Zip</th>
    <th>City</th>
    <th>State</th>
    <th>Country</th>
    <th>Status</th>
    </tr>";
     
     
    // Iterate through the rows, geocoding each address
    while ($row = @mysql_fetch_assoc($result)) {
      $geocode_pending = true;
     
      while ($geocode_pending) {
            $company = $row["name"];
            $address = $row["address"] . "," . $row["zip"] . "," . $row["city"] . "," . $row["state"] . "," . $row["country"];
        $id = $row["id"];
        $request_url = $base_url . "&q=" . urlencode($address);
        $csv = file_get_contents($request_url) or die("url not loading");
     
        $csvSplit = split(",", $csv);
        $status = $csvSplit[0];
        $lat = $csvSplit[2];
        $lng = $csvSplit[3];
        if (strcmp($status, "200") == 0) {
          // successful geocode
          $geocode_pending = false;
          $lat = $csvSplit[2];
          $lng = $csvSplit[3];
              
              //echo "The company " . $company. " " . $address . " was correctly geocoded. ";
          //echo "         ---->    Received lat and long = " . $lat . ";" . $lng . "\n <br>";
     
          $query = sprintf("UPDATE markers " .
                 " SET lat = '%s', lng = '%s' " .
                 " WHERE id = %s LIMIT 1;",
                 mysql_real_escape_string($lat),
                 mysql_real_escape_string($lng),
                 mysql_real_escape_string($id));
          $update_result = mysql_query($query);
          if (!$update_result) {
            die("Invalid query: " . mysql_error());
          }
        
              } else if (strcmp($status, "620") == 0) {
          // sent geocodes too fast
          $delay += 100000;
        } 
            
            else {
          
                              // failure to geocode
                              $geocode_pending = false;
                              echo "<tr>";
                              echo "<td>" . $row['id'] . " </td>";
                              echo "<td>" . $row['name'] . " </td>";
                              echo "<td>" . $row['address'] . " </td>";
                              echo "<td>" . $row['zip'] . " </td>";
                              echo "<td>" . $row['city'] . " </td>";
                              echo "<td>" . $row['state'] . "TEST </td>";
                              echo "<td>" . $row['country'] . " </td>";
                              echo "<td>" . $status . " = failed to geocoded</td>";
                              echo "</tr>";
                            }
                            
        }
        usleep($delay);
            
      }
     
    echo "</table>";
    ?>

    en espérant que cette solution serve à d'autres
    patrice

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher résultat sql dans un formulaire
    Par Salsaboy60 dans le forum IHM
    Réponses: 2
    Dernier message: 15/01/2014, 18h34
  2. [AJAX] Afficher résultat requête SQL avec ajax
    Par Kevfou dans le forum AJAX
    Réponses: 2
    Dernier message: 01/11/2011, 16h54
  3. [AJAX] Afficher le résultat d'une requête après un onChange
    Par baggie dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 15/05/2008, 13h56
  4. [MySQL] Afficher un résultat sql qui comprends une partie de ma variable
    Par math210788 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/05/2008, 09h12
  5. [AJAX] Afficher résultat Ajax dans la source d'une page
    Par PoMdaPiMp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/05/2008, 17h22

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