Problème moteur de recherche auto-complétion

Premier résultat systèmatiquement troqué

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,
j'ai un bug qui subsiste depuis un moment sur un moteur de recherche (pour chercher un membre), principalement l’auto complétion, je m'explique:
si je marque ma, et qu'il y a dans la bdd (dans cet ordre) "Mattis" "Mathis" "MathisHey", il devrait me mettre les trois pseudos. Le problème est que le premier pseudo dans la bdd commençant par ces lettres (dans ce cas là "Mattis", n'est pas affiché.
Voici le code:

 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
$(document).ready(function() {

    $results = $('#results');
    $search = $('#browse');

    $search.focus(function(){

    if ($search.val().length > 0 ){
        $results.show(200); }

    $(this).css('background-color', 'rgba(255,255,255,.3)');

    });
    $search.blur(function() {

        if ($search.val().length > 0) {
            $(this).css('background-color', 'rgba(255,255,255,.3)');
        }

        else {
            $(this).css('background-color', 'rgba(255,255,255,.1)');
        }

    });

    $search.keyup(function(){

        if ( $(this).val().length > 1 ) {

        $.get('http://1day-online.fr/ajax/search?string=' + $search.val(), function(data) {
            $results.empty();
            $users = data.split('|');
            $count = 0;

            if ($users[0] != "") {

                $.each($users,function(){
                    if (this != "") {
                        /^\{(.+)\}\[(.+)\]$/.exec(this);
                        $name = RegExp.$1;

                        /*if($name.charAt(0) == "#")

                        {

                            $url = RegExp.$2.substring(1, RegExp.$2.length);

                            $results.append($('<div class="block-results">')



                                .append('<a href="http://1day-online.fr/tag/' + $url + '">' + $name + '</a>'))



                                .append('</div>');

                        }

                        else

                        { */

                            $results.append($('<div class="block-results" onclick="openProfil(\'' + RegExp.$2 + '\');">')
                                .append('<p>' + $name + '</p>'))
                                .append('</div>');

                        //}
                        $results.show();
                    }

                });

            }

            else {
                $results.append('<div class="block-results"><p>Aucun résultat</p></div>')
            }
        });

    }

        else {
            $('#results').hide(200);
    }

    });
});
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public function search()
    {
        $params['string']   = $_GET['string'];
        $params['limit']    = 15000;

        $req = $this->loadModel('userModel', getSearch, $params);
        $req2 = $this->loadModel('pageModel', searchTag, $params);

        foreach ( $req as $r) {
            echo '{' . htmlspecialchars($r['pseudo']) . '}';
            echo '[' . $r['id'] . ']';
            echo '|'; }

        foreach ( $req2 as $r2) {
            preg_match('#\#' . $params["string"] . '[a-zA-Z0-9]+ #i', $r2['content'], $tag);
            echo '{' . $tag[0] . '}';
            echo '[' . $tag[0] . ']';
            echo '|'; }
    }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public function getSearch($params)
    {
        $this->connect();

        $pre = $this->bdd->prepare("SELECT * FROM users WHERE pseudo REGEXP'^" . $params['string'] . "' LIMIT 0, " . $params['limit']);
        $pre->execute(array(''));

        return $pre->fetchAll();

    }

Merci d'avance!

Staff

Cette réponse a aidé l'auteur du sujet

Déjà ligne 30 pense à utiliser encodeURIComponent si tu veux t'éviter des tracas à l'avenir.

Ensuite regarde par exemple dans ton if ligne 38 ce qu'il se passe pour chaque valeur.

P.S. : Pense à bien instancier tes variables (avec var) si tu ne veux pas avoir des surprises, parce que là tu utilises des variables globales partout, c'est très dangereux.

Auteur du sujet

Bonjour,
je n'avais pas eu le temps de faire des tests, mais là je viens de me replonger dans ce bug.
- J'ai bien mis encodeURIComponent
- Je ne sais pas par contre comment voir ce qui se passe dans mon if avec firebug :/ ni n'ai trop d'idée pour tester avec d'autres moyens
- Comme je l'avais déjà dis, le pseudo qui ne s'affiche pas est bien renvoyé par le php, mais il y a un caractère spécial (que je ne connais pas) qui est rajouté devant, ce qui renvoi par exemple: {mattis25}[2] (ça ne vient pas de firebug, j'ai testé avec un simple alert($users[0]) et ça m'affiche bien ça devant mattis: )
Merci d'avance!

EDIT: Ce caractère ne passe pas, le voici en capture:
bug_search

Édité par mattis25

Auteur du sujet

Merci!
C'est bon j'ai réussi à me débrouiller, mais je me retrouve maintenant avec un gros bloc de json:

1
{"pseudo":"mattis25","0":"mattis25","id":"2","1":"2"}{"pseudo":"mathis69mattis","0":"mathis69mattis","id":"195","1":"195"}{"pseudo":"Mattis","0":"Mattis","id":"100","1":"100"}

Avant je marquais "alert($users[0]);" ça m'affichait le premier, mais maintenant, comment faire? Une fois que j'aurai pu séparer les différents "blocs", je pourrais convertir un objet js et ça ne sera pas compliquer, mais là pour le moment… Désolé je ne suis pas à l'aise avec le JSON :/

Édité par mattis25

Staff

Cette réponse a aidé l'auteur du sujet

C'est plutôt une bouillie de JSON collés ensemble, là…

Le bon format serait plutôt comme ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[
    {
        "pseudo": "mattis25",
        "id":"2"
    },
    {
        "pseudo": "mathis69mattis",
        "id":"195"
    }
]

Avec ou sans la mise en forme, évidemment, mais dans l'idée c'est ça.

Et derrière utilise console.log(variable) pour voir ce que contient une variable dans Firebug ou les DevTools. En l'occurence tu devrais obtenir un tableau d'objets

Édité par viki53

Auteur du sujet

Bonjour,
j'ai tout mis en JSON, mais j'ai toujours ce caractère inconnu qui s'affiche devant.
J'ai essayé de changer la requête sql (j'ai remplacé REGEXP par LIKE), rien n'y fait, ça me ressort toujours ce caractère…
Merci pour le json_encode directement, ça me sort déjà un truc un peu plus joli ;)
EDIT: ça ne vient pas du js car quand je vais voir directement ce que ça le retourne en php, j'ai bien le caractère spécial (qui ne s'affiche pas sur la page, mais qu'on voit quand on fait "afficher le code source")

Édité par mattis25

Auteur du sujet

Merci de ta réponse
Non ce caractère n'est pas dans la bdd, car il y en a qu'un pour tous les résultats d'une requête (j'ai également vérifié, il ne s'y trouve pas)
Oui après je pourrais supprimer le regex, mais je préfère d'abord trouver la solution à de problème, je pourrais peut être supprimer le premier caractère (ça doit sûrement être possible), mais ce n'est pas garanti que ça fonctionnerait, et ça ne serait pas très propre…

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte