Ajax - Mysql - PHP

Résolu
Astolpho Messages postés 72 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 5 mars 2024 - Modifié le 6 janv. 2024 à 17:06
Astolpho Messages postés 72 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 5 mars 2024 - 8 janv. 2024 à 18:33

Bonjour, 

Je n'arrive pas à faire fonctionner l'autocomplétion depuis que j'ai déplacer la requête qui était dans /fetch/items.php:

  if (isset($_POST['search'])) {
    $search = $_POST['search'];
    $query = "SELECT  item as label, id_items, price, item, designation as value 
              FROM items 
              LEFT JOIN customers ON (items.id=customers.id)  
              LEFT JOIN users ON (items.id = users.id)

              WHERE item like'%" . $search . "%' AND users.id = :user_id GROUP by item ";

    try {
      $requete = $bdd->prepare($query);
      $requete->bindParam(':user_id', $_SESSION['user_id'], PDO::PARAM_INT);

      $requete->execute();
      //var_dump($requete);
      $response = $requete->fetchAll(); // on stocke le resultat dans un array

      /*      foreach($response as $row){
        $response[] = array("value"=>$row['id_customers'],"label"=>$row['lastname']);

  }
  */
    } catch (Exception $e) {
      // en cas d'erreur :
      $response = " Erreur ! " . $e->getMessage();
    }
    echo json_encode($response);
    // var_dump($response);
    exit;
  }

dans la classe : 

class AutoCompleteHandler
{
  private $db;

  public function __construct()
  {
    $this->db = $this->getDB();
  }

  private function getDB()
  {
    // Utilisez la fonction getDB existante pour obtenir l'instance PDO
    return getDB();
  }

  public function handleAutoComplete()
  {
    if (isset($_POST['search'])) {
      $search = $_POST['search'];
      $query = "SELECT item as label, id_items, price, item, designation as value 
                      FROM items 
                      LEFT JOIN customers ON (items.id = customers.id)  
                      LEFT JOIN users ON (items.id = users.id)
                      WHERE item LIKE '%" . $search . "%' AND users.id = :user_id GROUP BY item";

      try {
        $requete = $this->db->prepare($query);
        $requete->bindParam(':user_id', $_SESSION['user_id'], PDO::PARAM_INT);
        $requete->execute();
        $response = $requete->fetchAll();
      } catch (Exception $e) {
        $response = "Erreur ! " . $e->getMessage();
      }
      echo json_encode($response);
      exit;
    }
  }

  public function generateAutoCompleteItemScript()
  {

       $this->handleAutoComplete();

    ob_start();
?>

    <script>
      $(function() {
        $("#autocomplete_item").autocomplete({
          source: function(request, response) {
            $.ajax({
              url: "",
              type: 'post',
              dataType: "json",
              data: {
                search: request.term
              },
              success: function(data) {
                response(data);
              }
            });
          },
          select: function(event, ui) {
            $('#autocomplete_item').val(ui.item.label);
            $('#id_items').val(ui.item.id_items);
            $('#item').val(ui.item.item);
            $('#designation').val(ui.item.value);
            $('#price').val(ui.item.price);
            return false;
          }
        });
      });
    </script>

  <?php
    return ob_get_clean();
  }

sur cette ligne : 

 url: "",

quand je met le chemin qui pointe vers le fichier ou il y à la requête ça fonctionne :

 url: "../fetch/items.php",

l'appel de la méthode : 

            <?php
                    // Exemple d'utilisation
                    $autoCompleteHandler = new AutoCompleteHandler();
                    $autoCompleteScript = $autoCompleteHandler->generateAutoCompleteItemScript();
                    var_dump($autoCompleteScript );
                    ?>
                    <!-- jQuery UI -->
                    <script src='../fetch/jquery-ui/jquery-3.1.1.min.js' type='text/javascript'></script>
                    <link href='../fetch/jquery-ui/jquery-ui.min.css' rel='stylesheet' type='text/css'>
                    <script src='../fetch/jquery-ui/jquery-ui.min.js' type='text/javascript'></script>
                    <?php echo $autoCompleteScript; ?>

je n'ai pas de message d'erreur, ni rien dans la console.

2 réponses

jordane45 Messages postés 38149 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
Modifié le 6 janv. 2024 à 20:52

Bonjour,

Lorsque tu appeles la page ( l'url = "" ) .. ton code ne retourne pas seulement le résultat du echo json_encode...  l'entièreté de ta page.

(il suffit d'ouvrir la console de ton navigateur (de préférence FIREFOX dès qu'on fait de l'ajax...), de bien cocher la case de debug XHR  et de regarder ce qui s'affiche... )

Pour contourner ton souci, je pense qu'en modifiant le constructeur de ta class ainsi ça devrait marcher

 public function __construct()
  {
    $this->db = $this->getDB();
    if(!empty($_POST['search'])){
      $this->handleAutoComplete();
    }
  }

Par contre, à titre perso, je préfère largement laisser mes appels ajax (les fichiers appelés via la variable URL ) séparés du reste du code et je fais UN fichier spécifique par ajax... mais chacun ses gouts.


0
Astolpho Messages postés 72 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 5 mars 2024
8 janv. 2024 à 18:33

Bonjour Jordan,

Je vais, utiliser un fichier séparer j'ai d'autres requêtes d'autocomplétions que je vais mutualiser dedans.

Merci

0