Formulaire d'auto complétion

Petit nouveau ! | 8 Messages

01 juil. 2016, 16:31

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

Petit nouveau ! | 8 Messages

02 juil. 2016, 10:58

Et pour info je n'ai aucun retour de requête HXR

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 juil. 2016, 12:26

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);
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2703 Messages

04 juil. 2016, 14:13

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.

Petit nouveau ! | 8 Messages

04 juil. 2016, 17:29

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.

Petit nouveau ! | 8 Messages

05 juil. 2016, 14:57

Je pense avoir un problème de requête ainsi qu'un problème de JS...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 juil. 2016, 15:14

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 ?

@+
Il en faut peu pour être heureux ......

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 juil. 2016, 15:16

@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']) );
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 571 Messages

05 juil. 2016, 22:46

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']);
}