Page 1 sur 1

Formulaire d'auto complétion

Posté : 01 juil. 2016, 16:31
par MaxP
Bonjour,

Voici j'ai un petit soucis avec mon formulaire d'auto complétion qui ne comporte aucune erreur mais qui ne m'affiche rien du tout lorsque je commence une saisie...

J'ai du jQuery et jQuery-UI appelé dans mon header et voici le contenu de mon formulaire ainsi que de ma page de récupération de données :

Extrait du formulaire
<input type='text' id='nom' placeholder='Tapez un nom'>
      <script>
      jQuery(document).ready()
        $( '#nom' ).autocomplete({
          source : 'recup_nom.php',
          minLength : 2
        });
      </script>
Page de récupération
<?php require('inc_connexion.php'); ?>
<?php
    $term = filter_input(INPUT_GET, 'term');
    $term = $_GET['term'];
 
    $requete = $mysqli->prepare("SELECT title FROM ma_table WHERE title LIKE CONCAT('%', ?, '%');");
    $requete->bind_param('s', $term);
    $requete->execute();
    $array = array();
     
    while($donnee = $requete->fetch())
    {
        array_push($array, $donnee['title']);
    }
    echo json_encode($array);
?>
Merci à tous :)

Re: Formulaire d'auto complétion

Posté : 02 juil. 2016, 10:58
par MaxP
Et pour info je n'ai aucun retour de requête HXR

Re: Formulaire d'auto complétion

Posté : 04 juil. 2016, 12:26
par moogli
salut
Et pour info je n'ai aucun retour de requête HXR
qu'entends tu pas aucun retour ?

si tu accèdes directement à recup_nom.php dans ton navigateur préféré (ou un client rest) tu devrais voir le tableau JSON correspondant (comme [ "Choice1", "Choice2" ] )

as tu testé la requête SQL ?

Perso j'utiliserais plutôt un objet (comme dans cet exemple) histoire d'utiliser l'id et non le nom dans la suite (plus fiable).

Pour info tu as une affectation de $term en trop, je pense que ce que tu veux est ceci ? :
<?php

require 'inc_connexion.php';
$term = filter_input(INPUT_GET, 'term');

$requete = $mysqli->prepare("SELECT title FROM ma_table WHERE title LIKE CONCAT('%', ?, '%');");
$requete->bind_param('s', $term);
$requete->execute();
$array = array();

while ($donnee = $requete->fetch()) {
    array_push($array, $donnee['title']);
}
echo json_encode($array);
@+

Re: Formulaire d'auto complétion

Posté : 04 juil. 2016, 14:13
par or 1
Il semble qu'il y ait une erreur dans votre requête SQL. Le message ci-bas peut vous aider à en trouver la cause.
ERROR: Ponctuation invalide @ 21
STR: ?,
SQL: SELECT CONCAT('My', ?, 'QL')

SELECT CONCAT( 'My', '?', 'QL' )
ne retourne pas d'erreur.

Re: Formulaire d'auto complétion

Posté : 04 juil. 2016, 17:29
par MaxP
Malheureusement moogli je n'obtiens pas du tout ce résultat grâce à ton code. J'ai []
Et lorsque dans l'url je fais une recherche j'ai : [null]
Pour un mot dont je devrais avoir une réponse...
Peut-être une erreur de requête en effet mais je ne saurais laquelle puisqu'en testant avec un select et un echo tout est ok, je récupère bien la base de données donc j'ai une grosse incompréhension.

Re: Formulaire d'auto complétion

Posté : 05 juil. 2016, 14:57
par MaxP
Je pense avoir un problème de requête ainsi qu'un problème de JS...

Re: Formulaire d'auto complétion

Posté : 05 juil. 2016, 15:14
par moogli
salut,

c'est quoi le code qui te donnes ce null ?

on peu avoir la table et un jeux de données simple pour tester ?

@+

Re: Formulaire d'auto complétion

Posté : 05 juil. 2016, 15:16
par Ryle
@or1, le ? dans la requête est lié à la requête préparée, il sera remplacé par les valeurs transmises en bind lors de l'exécution. Pour autant, j'aurais aussi tendance à préférer éviter le concat() dans la requête et préfère la façon d'écrire suivante :
$requete = $mysqli->prepare("SELECT title FROM ma_table WHERE title LIKE ?");
$requete->bind_param('s', '%' . $term . '%');
A voir également l'encodage de tes pages et fichiers. En ajax, tu es automatiquement en utf8 et si ton titre comporte un accent, j'ai déjà constaté des problèmes de ce genre (on récupère une chaine vide ou nulle). Tu peux tester le code suivant et voir si cela change quelque chose:
while ($donnee = $requete->fetch()) {
    array_push($array, utf8_encode($donnee['title']) );
}

Re: Formulaire d'auto complétion

Posté : 05 juil. 2016, 22:46
par yann18
Attention! la méthode fetch() n'existe plus en php5.4. (cf . fetch).Pour mysqli ta requête est invalide parcequ'ell interprète la fonction concat() pendant la préparation
$term = $term . '%';
$requete = $mysqli->prepare("SELECT title FROM ma_table WHERE title LIKE ?");
$requete->bind_param('s', $term);
$requete->execute();
$res = $requete->get_result();
$array = array();
while ( $donnee= $res->fetch_assoc() ) {
    array_push($array, $donnee['title']);
}