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

Langage PHP Discussion :

Barre de recherche interne


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de BROADSIDER
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 65
    Par défaut Barre de recherche interne
    Bonjour,
    Je m’entraîne actuellement sur un système d'autocompletion qui me permettrais de me proposer différentes villes lorsque je tape une ou plusieurs lettre dans la barre de recherche, mais lorsque je test le site mon php ne trouve pas la variable s, et je ne comprend pas pourquoi...(je ne met pas le script car lui fonctionne et n'est pas la source de mon problème).

    Voici mon php avec les explications:
    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
     
    <?php
     
    	$data = unserialize(file_get_contents('towns.txt')); // Récupération de la liste complète des villes
    	$dataLen = count($data);
     
    	sort($data); // On trie les villes dans l'ordre alphabétique
     
    	$results = array(); // Le tableau où seront stockés les résultats de la recherche
     
    	for ($i = 0 ; $i < $dataLen && count($results) < 10 ; $i++) {
    	    if(stripos($data[$i], $_GET["s"]) === 0) { // Si la valeur commence par les mêmes caractères que la recherche
     
    	        array_push($results, $data[$i]); // On ajoute alors le résultat à la liste à retourner
     
    	    }
    	}
     
    	echo implode('|', $results); // Et on affiche les résultats séparés par une barre verticale |
     
    	?>
    et voici une petite partie de la linéarisation de mon tableau:

    a:305:{i:0;s:5:"Paris";i:1;s:12:"Franconville";i:2;s:9:"Marseille";i:3;s:6:"Lievin";i:4;s:4:"Lyon";i:5;s:24:"Conflans-Sainte-Honorine";i:6;s:8:"Toulouse"

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par BROADSIDER Voir le message
    ...(je ne met pas le script car lui fonctionne et n'est pas la source de mon problème)...
    Si tu le dis...

    Tiens, je ne mets pas ma correction non plus, puisqu'elle fonctionne :

    N.B. Pour des chaines multi-octets, il faut utiliser les fonction mb_ (mb_stripos,...)

  3. #3
    Membre confirmé Avatar de BROADSIDER
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 65
    Par défaut
    Mort de rire c'etait juste pour simplifier le travail 😅

    Mais voici la fonction! (Avec les explications ;-) )

    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
    112
    113
    114
    115
    116
    117
     
    (function() {
     
    	var searchElement = document.getElementById('search'),
    	    results = document.getElementById('results'),
    	    selectedResult = -1, // Permet de savoir quel résultat est sélectionné : -1 signifie "aucune sélection"
    	    previousRequest, // On stocke notre précédente requête dans cette variable
        	previousValue = searchElement.value; // On fait de même avec la précédente valeur
     
     
     
    	function getResults(keywords) { // Effectue une requête et récupère les résultats
     
    	    var xhr = new XMLHttpRequest();
    	    xhr.open('GET', './search.php?s='+ encodeURIComponent(keywords));
     
        	xhr.addEventListener('readystatechange', function() {
            	if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
     
    	            displayResults(xhr.responseText);
     
            	}
    	    });
     
    	    xhr.send(null);
     
    	    return xhr;
     
    	}
     
    	function displayResults(response) { // Affiche les résultats d'une requête
     
        	results.style.display = response.length ? 'block' : 'none'; // On cache le conteneur si on n'a pas de résultats
     
    	    if (response.length) { // On ne modifie les résultats que si on en a obtenu
     
    	        response = response.split('|');
    	        var responseLen = response.length;
     
    	        results.innerHTML = ''; // On vide les résultats
     
    	        for (var i = 0, div ; i < responseLen ; i++) {
     
                	div = results.appendChild(document.createElement('div'));
                	div.innerHTML = response[i];
     
                	div.addEventListener('click', function(e) {
                    	chooseResult(e.target);
    	            });
     
    	        }
     
    	    }
     
    	}
     
    	function chooseResult(result) { // Choisi un des résultats d'une requête et gère tout ce qui y est attaché
     
    	    searchElement.value = previousValue = result.innerHTML; // On change le contenu du champ de recherche et on enregistre en tant que précédente valeur
    	    results.style.display = 'none'; // On cache les résultats
    	    result.className = ''; // On supprime l'effet de focus
    	    selectedResult = -1; // On remet la sélection à "zéro"
    	    searchElement.focus(); // Si le résultat a été choisi par le biais d'un clique alors le focus est perdu, donc on le réattribue
     
    	}
     
     
     
    	searchElement.addEventListener('keyup', function(e) {
     
        	var divs = results.getElementsByTagName('div');
     
    	    if (e.keyCode == 38 && selectedResult > -1) { // Si la touche pressée est la flèche "haut"
     
    	        divs[selectedResult--].className = '';
     
    	        if (selectedResult > -1) { // Cette condition évite une modification de childNodes[-1], qui n'existe pas, bien entendu
    	            divs[selectedResult].className = 'result_focus';
    	        }
     
    	    }
     
    	    else if (e.keyCode == 40 && selectedResult < divs.length - 1) { // Si la touche pressée est la flèche "bas"
     
            	results.style.display = 'block'; // On affiche les résultats
     
    	        if (selectedResult > -1) { // Cette condition évite une modification de childNodes[-1], qui n'existe pas, bien entendu
                	divs[selectedResult].className = '';
    	        }
     
            	divs[++selectedResult].className = 'result_focus';
     
    	    }
     
    	    else if (e.keyCode == 13 && selectedResult > -1) { // Si la touche pressée est "Entrée"
     
    	        chooseResult(divs[selectedResult]);
     
    	    }
     
        	else if (searchElement.value != previousValue) { // Si le contenu du champ de recherche a changé
     
    	        previousValue = searchElement.value;
     
    	        if (previousRequest && previousRequest.readyState < XMLHttpRequest.DONE) {
    	            previousRequest.abort(); // Si on a toujours une requête en cours, on l'arrête
            	}
     
    	        previousRequest = getResults(previousValue); // On stocke la nouvelle requête
     
    	        selectedResult = -1; // On remet la sélection à "zéro" à chaque caractère écrit
     
        	}
     
    	});
     
    })();
    Ainsi que le message d'erreur:

    Notice: Undefined index: s on line 23 (qui correspond ici a la ligne 12 de mon code php dans le premier message).

  4. #4
    Invité
    Invité(e)
    Par défaut
    1- Tu seras d'accord pour dire que le minimum était de montrer cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	    xhr.open('GET', './search.php?s='+ encodeURIComponent(keywords));
    On est donc bien en GET, et le paramètre s'appelle bien "s".

    2- Sinon, as-tu vérifié ce que contient encodeURIComponent(keywords)) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log( encodeURIComponent(keywords)) );
    3- As-tu testé le fichier search.php directement dans la barre d'adresse, en lui donnant un paramètre bidon ?
    • http....../search.php?s=pa

    On devrait trouver : Paris, Palaiseau,...

    4- Il suffit aussi de faire un débogage de base :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo $_GET["s"];
    var_dump( $data );
    ...
    5-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(stripos($data[$i], $_GET["s"]) === 0) {
    Si ne ne me trompe, cela signifie que les noms des villes sont écrites en TOUT DEBUT de chaque ligne.
    Est-ce bien le cas ? *

    * Montre un extrait de var_dump( $data );.

  5. #5
    Membre confirmé Avatar de BROADSIDER
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 65
    Par défaut
    Des que j'aurais mon ordi sous la main je test tout ca et vous tiens au courant!

  6. #6
    Membre confirmé Avatar de BROADSIDER
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 65
    Par défaut
    C'est bon ! J'ai mit mon php dans le dossier search.php et tout fonctionne merci beaucoup de m'avoir permis de trouver cette erreur de debutant ! 😉

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

Discussions similaires

  1. Barre de recherche IE7 pour Developpez.com ?
    Par vodevil dans le forum Evolutions du club
    Réponses: 7
    Dernier message: 11/02/2007, 20h03
  2. [Conception] Recherche interne+résultats
    Par Angelik dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/08/2006, 12h43
  3. Moteur de recherche interne avec zope/python
    Par tunix dans le forum Zope
    Réponses: 3
    Dernier message: 01/05/2006, 15h45
  4. barre de recherche dans les fonctions php pour firefox
    Par titoumimi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 03/02/2006, 10h16
  5. Un moteur de recherche interne
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/02/2005, 18h47

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