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 à ma base de données qui empêche l'autocompletion


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut Requête à ma base de données qui empêche l'autocompletion
    Bonjour à tous,

    J'ai découvert et suivi le très bon tuto "d'ajax - une autocomplétion pas à pas".
    J'ai voulu l'adapter à mon application actuelle.
    Je développe en Php/MySQL une page qui va référencer le bottin administratif (donc base de données d'un peu plus de 20.000 entrées !). J'ai deux champs, Nom et Fonction exercée. Je cherche déjà à ce que le champ nom puisse marcher en utilisant l'autocomplétion. Pour cela, dans le fichier options.php qui contient les suggestions, j'effectue avant une requête SQL (me listant tous les noms)et je répertorie tous les noms dans un array. Mais problème, le fait de faire mysql_connect, mysql_query() ralentit le système et la recherche ne marche pas ... Et je suis sûr que le problème vient de là. Ma requête me renvoit 9.000 entrées. Il y a une méthode plus souple ou bien une astuce ?

    Voici mon 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    <?php
    header('Content-Type: text/xml;charset=utf-8');
    echo(utf8_encode("<?xml version='1.0' encoding='UTF-8' ?><options>"));
    if (isset($_GET['debut'])) {
        $debut = utf8_decode($_GET['debut']);
    } else {
        $debut = "";
    }
    $debut = strtolower($debut);
     
    mysql_connect("","","");
    mysql_select_db("");
     
     
     
    			   $reponse = mysql_query("
    					   SELECT distinct
    					   PERSONNE.PER_NOM as 'Nom_de_la_personne'
    					   FROM triplet
     
    					   INNER JOIN PERSONNE on TRIPLET.TRI_PER_CLE=PERSONNE.PER_CLE
    					   INNER JOIN ORGANISME on TRIPLET.TRI_ORG_CLE=ORGANISME.ORG_CLE
    					   INNER JOIN FONCTION on TRIPLET.TRI_FON_CLE=FONCTION.FON_CLE
     
    					   WHERE PERSONNE.PER_NOM <> ''
    					   ORDER BY PERSONNE.PER_NOM ASC");
     
    $listeNom = array();
     
    while ($donnees = mysql_fetch_array($reponse) )
    {
       array_push ($listeNom , $donnees['Nom_de_la_personne']);
    }
    mysql_close();
     
     
     
     
    function generateOptions($debut,$listeNom) {
        $MAX_RETURN = 10;
        $i = 0;
        foreach ($listeNom as $element) {
            if ($i<$MAX_RETURN && substr($element, 0, strlen($debut))==$debut) {
                echo(utf8_encode("<option>".$element."</option>"));
                $i++;
            }
        }
    }
     
    generateOptions($debut,$listeNom);
     
    echo("</options>");
     
     
    ?>
    Je suis sur que ma requête fonctionne, que mon tableau ListeNom est bien rempli et que tous les éléments sont des chaînes de caractères.

    En espérant une réponse ! Merci d'avance .

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    Pourquoi ne pas intégrer :

    à la fin de ta requête, pour limiter le nombre de retours au 30 premiers résultats, voir 10 premiers, puisque la fonction generateOptions(), n'affichera dans cette configuration que 10 résultats.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut
    Merci pour la réponse mais le "problème" venait que j'avais initialement fait les tests en local. Mais j'ai testé ensuite sur notre serveur de prod et les résultats sont quasi-instantanés (hé oui je suis en stage ).

    Maintenant, un autre problème vient se greffer et je ne trouve pas assez de documentation à ce sujet.

    L'autocomplétion fonctionne sur un champ (Nom de la personne). J'ai un autre champ(fonction exercée) où je voudrais qu'il y ait une autre autocomplétion.

    Voici un bout de code de mon fichier index.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
     
    <script type="text/javascript" src="likeGoogleSuggest.js"></script>
    <script type="text/javascript" src="likeGoogleSuggest2.js"></script>
     
     <script type="text/javascript">
    	window.onload = function(){
     
    	initAutoComplete(document.getElementById('form-test'),
    	document.getElementById('champ-texte'),document.getElementById('bouton-submit'));
     
    	initAutoComplete_bis(document.getElementById('test-fct'),
    	document.getElementById('fct'),document.getElementById('bouton-submit'));
    	}
    </script>
    D'après ce que j'ai pu comprendre, deux window.onload() sur la même page ne fonctionnent pas.
    La 1ère fonction initAutoComplete se trouve dans likeGoogleSuggest.js et se charge de l'autocomplétion du champ Nom de la personne.
    La 2nde fonction de l'autocomplétion du champ Fonction exercée et se trouve dans likeGoogleSuggest2.js.

    Avec ce bout de code présent, aucune autocomplétion fonctionne... Si j'en mets une en commentaire, l'autre marche.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    Citation Envoyé par Kev42100
    Avec ce bout de code présent, aucune autocomplétion fonctionne... Si j'en mets une en commentaire, l'autre marche.
    dans tes 2 .js as-tu veillé à ce que les variables (globales), les fonctions etc. n'aient pas les mêmes noms ?
    A ne pas redéclarer des variables globales utilisées dans les 2 fichiers ?

    Rappel : il faut considérer le code de tes deux .JS comme étant tous les deux dans la partie <head> de ta page HTML.

    A+

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut
    Merci pour cette réponse rapide.

    Oui c'est bien placé entre les balises <head></head>.
    Les fichiers ont tout pareil sauf la valeur de la variable : _adresserecherche ="pageEnQuestion.php" .
    Je ne pensais pas que ça pouvait avoir un impact... Il faut donc que je modifie le nom de toutes les fonctions et variables ?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par kev42100 Voir le message
    Oui c'est bien placé entre les balises <head></head>.
    Ce n'est pas ce que je voulais dire (j'avais vu !) : il faut faire comme si le code des deux fichiers était directement dans la page HTML => tu ne peux pas avoir deux fonctions toto() (ni deux var toto).
    Il faut donc que je modifie le nom de toutes les fonctions et variables ?
    Oui
    (sinon, comment différencier l'appel à toto() du 1° .js de l'appel à toto() du 2° fichier ?)

    A+

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 80
    Points : 48
    Points
    48
    Par défaut
    Après avoir abusé et vérifié du Chercher-remplacer avec Notepad, le résultat ne marche pas... Sinon,la valeur d'un champ que l'on peut récupérer (document.X.X.value), quel est le moyen le plus pratique pour l'obtenir dans du code Php ?
    Exemple : 1er formulaire , Nom de la personne :
    -> suivant le nom tapé, requête SQL
    2nd formulaire , Fct exercée : -> Réponses de la requête dans une liste déroulante.

    Est-ce possible sans recharger la page ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    Le mieux pour ce que tu veux faire est d'utiliser le même fichier Javascript pour tes 2 auto completion, en modifiant le code pour accepter plusieurs listes d'auto-completion, donc differents fichiers "options.php" dans l'exemple d'auto complétion que tu as, je l'ai réalisé il y a 1 semaine ou 2, pour quelque chose de similaire.

    Si tu utilise bien le tutoriel d'autocompletion de ce forum, le principe repose sur un div qui est caché ou montré, ce div est configuré pour être sous la barre "input", il faut donc que tu arrives à créer 2 div differents, si tu veux qu'ils puissent être utilisés en meme temps, si on ne peut utiliser qu'une seule autocompletion à un instant t, il te faut juste 2 fichiers php differents et les appeler correctement pour pouvoir créer ce que tu veux.

    Bon courage, il m'a fallut pas mal de tâtonnement pour y arriver.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/02/2015, 15h31
  2. Réponses: 4
    Dernier message: 08/03/2007, 21h00
  3. Réponses: 3
    Dernier message: 01/03/2007, 21h54
  4. Execution de requête sur base de données distante
    Par ~~PriVate JoKe~~ dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/11/2006, 21h59
  5. Requête sur base de données ACCESS
    Par JLamotte dans le forum Access
    Réponses: 1
    Dernier message: 21/11/2005, 10h50

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