Problème moteur de recherche auto-complétion

Premier résultat systèmatiquement troqué

a marqué ce sujet comme résolu.

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!

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.

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

+0 -0

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 :/

+0 -0

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

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")

+0 -0

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…

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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