Partage
  • Partager sur Facebook
  • Partager sur Twitter

Moteur de recherche avec left join

    16 octobre 2021 à 18:27:33

    Bonjour,

    Je tente désespéramment à faire un moteur de recherche . Le script fonctionne très bien mais dès que je tente de faire un left joint ça me fait une une erreur :

    Fatal error: Uncaught Error: Call to a member function rowCount() on bool in C:\xampp\htdocs\panel\Recherche.php:11 Stack trace: #0 {main} thrown in C:\xampp\htdocs\panel\Recherche.php on line 11


    	<meta charset="utf-8" />
    <?php
     
    $bdd = new PDO('mysql:host=127.0.0.1;dbname=panel;charset=utf8','root','');
     
    $articles = $bdd->query('SELECT f_name, l_name, id, numero, GROUP_CONCAT(`surnom`) AS surnoms FROM customers LEFT JOIN surnom ON customers.id = surnom.id_customers GROUP BY id DESC');
    
    if(isset($_GET['q']) AND !empty($_GET['q'])) {
       $q = htmlspecialchars($_GET['q']);
       $articles = $bdd->query('SELECT * FROM customers,surnom WHERE numero LIKE "%'.$q.'%" ORDER BY id DESC');
       if($articles->rowCount() == 0) {
          $articles = $bdd->query('SELECT * FROM customers,surnom GROUP_CONCAT(`surnom`) AS surnoms FROM customers LEFT JOIN surnom ON customers.id = surnom.id_customers WHERE CONCAT(numero, f_name,l_name, surnoms) LIKE "%'.$q.'%" ORDER BY id DESC');
       }
    }
    ?>
    <form method="GET">
       <input type="search" name="q" placeholder="Recherche..." />
       <input type="submit" value="Valider" />
    </form>
    <?php if($articles->rowCount() > 0) { ?>
       <ul>
       <?php while($a = $articles->fetch()) { ?>
          <li><?= $a['numero'] ?> / <?= $a['f_name'] ?> / <?= $a['l_name'] ?> / <?= $a['surnoms'] ?></li>
       <?php } ?>
       </ul>
    <?php } else { ?>
    Aucun résultat pour: <?= $q ?>...
    <?php } ?>



    En vous remerciant d'avance.



    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2021 à 18:36:09

      Active les erreurs PDO/SQL pour voir que ta requête n'est pas bonne, il doit déjà manquer quelque chose entre surnom GROUP_CONCAT.

      Pourquoi les requêtes ne sont pas préparées ?!? En plus, htmlspecialchars, tu ne le mets pas où il faut, du coup tu cumules injections SQL et XSS !

      -
      Edité par julp 16 octobre 2021 à 18:38:41

      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2021 à 18:48:47

        Voici le nouveau message d'erreur :

        Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GROUP_CONCAT(`surnom`) AS surnoms FROM customers LEFT JOIN surnom ON customer...' at line 1 in C:\xampp\htdocs\panel\Recherche.php:12 Stack trace: #0 C:\xampp\htdocs\panel\Recherche.php(12): PDO->query('SELECT * FROM c...') #1 {main} thrown in C:\xampp\htdocs\panel\Recherche.php on line 12


        J'ai récupérer se script sur un site, mon niveau est encore moyen en php. Donc tout ce qui contournement d'injection SQL c'est encore complique pour moi.

        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2021 à 19:02:29

          > il doit déjà manquer quelque chose entre surnom GROUP_CONCAT

          Il manque une , entre surnom et GROUP_CONCAT ?

          • Partager sur Facebook
          • Partager sur Twitter
            16 octobre 2021 à 19:05:49

            J'ai toujours la même erreur
            • Partager sur Facebook
            • Partager sur Twitter
              16 octobre 2021 à 22:33:52

              Strictement ? Après quelle modification ? (ie quel est ton code actuel ?)

              • Partager sur Facebook
              • Partager sur Twitter
                16 octobre 2021 à 23:04:14

                Oui j'ai exactement le meme message d'erreur que j'ai posté. J'ai ajouté la virgule entre surnom et GROUP_CONCAT.

                Voici mon code :

                	<meta charset="utf-8" />
                <?php
                 
                $bdd = new PDO('mysql:host=localhost;dbname=panel;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                 
                $articles = $bdd->query('SELECT f_name, l_name, ugc, id, numero, GROUP_CONCAT(`surnom`) AS surnoms FROM customers LEFT JOIN surnom ON customers.id = surnom.id_customers GROUP BY id DESC');
                
                if(isset($_GET['q']) AND !empty($_GET['q'])) {
                   $q = htmlspecialchars($_GET['q']);
                   $articles = $bdd->query('SELECT * FROM customers WHERE numero LIKE "%'.$q.'%" ORDER BY id DESC');
                   if($articles->rowCount() == 0) {
                      $articles = $bdd->query('SELECT * FROM customers,surnom, GROUP_CONCAT(`surnom`) AS surnoms FROM customers LEFT JOIN surnom ON customers.id = surnom.id_customers WHERE CONCAT(numero, f_name,l_name, surnoms) LIKE "%'.$q.'%" ORDER BY id DESC');
                   }
                }
                ?>
                <form method="GET">
                   <input type="search" name="q" placeholder="Recherche..." />
                   <input type="submit" value="Valider" />
                </form>
                <?php if($articles->rowCount() > 0) { ?>
                   <ul>
                   <?php while($a = $articles->fetch()) { ?>
                      <li><?= $a['numero'] ?> / <?= $a['f_name'] ?> / <?= $a['l_name'] ?> / <?= $a['surnoms'] ?></li>
                   <?php } ?>
                   </ul>
                <?php } else { ?>
                Aucun résultat pour: <?= $q ?>...
                <?php } ?>



                • Partager sur Facebook
                • Partager sur Twitter
                  16 octobre 2021 à 23:58:09

                  Pourquoi il y a 2 clauses FROM dans ta requête ? * FROM customers, ne serait pas trop des fois ? Tu as testé tes requêtes dans pma avant ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 octobre 2021 à 12:46:55

                    J'ai mis 2 clauses dans from car j'ai besoin de faire une recherche dans 2 tables. ( customers et surnom).

                    Je ne sais pas pourquoi il y'a 2 requetes, si je retire la première requetes, j'ai toutes mes lignes qui s'affichent de ma table customers.

                    C'est quoi pma ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 octobre 2021 à 13:31:53

                      > J'ai mis 2 clauses dans from

                      Non, relis ta 3e requête, tu as vraiment 2 clauses FROM quand une requête ne peut en avoir qu'une = erreur de syntaxe (c'est FROM la clause, pas ce que tu y mets).

                      > C'est quoi pma ?

                      PHPMyAdmin bien que n'importe quel client mysql ferait l'affaire. Le tout étant de tester sa requête SQL seule, indépendamment d'un quelconque code PHP (ou peu importe d'ailleurs).

                      -
                      Edité par julp 17 octobre 2021 à 13:36:38

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 octobre 2021 à 13:48:09

                        J'ai retiré le premier from. Merci pour cet oublie mais j'ai toujours la même erreur.

                        J'ai testé cette requete dans pma :

                        SELECT f_name, l_name, numero, GROUP_CONCAT(`surnom`) AS surnoms FROM customers LEFT JOIN surnom ON customers.id = surnom.id_customers WHERE CONCAT(numero, f_name,l_name, surnoms) LIKE James ORDER BY id DESC

                        Voici l'erreur :

                        #1054 - Champ 'surnoms' inconnu dans where clause

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 octobre 2021 à 14:03:17

                          Tu ne peux pas utiliser surnoms, résultat de ton agrégation, en clause WHERE

                          Il manque des quotes autour de James.

                          -
                          Edité par julp 17 octobre 2021 à 14:04:45

                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 octobre 2021 à 14:04:49

                            Sauf que j'ai besoin de récupérer le surnom d'une personne via une recherche :/
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 octobre 2021 à 14:09:10

                              Si tu as utilisé GROUP_CONCAT c'est que quelqu'un peut en avoir plusieurs.

                              Structures des tables ? C'est la colonne d'origine de ton "surnom" que tu dois utiliser en WHERE.

                              (c'est plus une question SQL pur que PHP)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 octobre 2021 à 15:02:09

                                Voici la structure de ma bdd :

                                Customers : id, f_name, l_name

                                surnom : id_surnom, id_customers, surnom

                                En gros que je rentre un surnom et bien j’attribue l'id de la personne

                                Ex : Dans la table surnom : id_customers = 1 ; id = 1 corresponds à Patrick dans la table customers

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 octobre 2021 à 15:55:37

                                  Je suppose que si tu mets ta colonne, surnom, au lieu du résultat de l'aggrégation, surnoms, dans le CONCAT, ça n'est pas ce que tu attends parce que tu n'aurais pas tous les surnoms de l'utilisateur trouvé mais que ceux pour lesquels la clause WHERE trouve une correspondance ? Et dans ce cas, ça impliquerait de le faire avec une requête de ce genre :

                                  SELECT f_name, l_name, GROUP_CONCAT(surnom) AS surnoms
                                  FROM (
                                      SELECT f_name, l_name, surnom/*, numero*/
                                      FROM customers
                                      LEFT JOIN surnom ON customers.id = surnom.id_customers
                                      WHERE CONCAT(/*numero, */f_name, l_name, surnom) LIKE 'James'
                                      ORDER BY id DESC
                                  ) t
                                  GROUP BY f_name, l_name/*, numero*/
                                  ;
                                  

                                  (à moins de faire l'équivalent en PHP)

                                  Correct ?

                                  -
                                  Edité par julp 17 octobre 2021 à 16:16:57

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 octobre 2021 à 16:08:35

                                    pma m'indique ce message d'erreur :

                                    #1054 - Champ 'surnom' inconnu dans field list

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 octobre 2021 à 16:18:32

                                      édité, désolé, j'avais fait des tests sur sqlfiddle mais j'ai repris une mauvaise version de la requête

                                      -
                                      Edité par julp 17 octobre 2021 à 16:20:12

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 octobre 2021 à 16:23:39

                                        Cette fois je n'ai pas d'erreur mais j'ai juste cette réponse, pourtant l'une des lignes dans ma table surnom contient bien James:

                                        MySQL a retourné un résultat vide (c'est à dire aucune ligne). (traitement en 0,0050 seconde(s).)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          17 octobre 2021 à 16:26:34

                                          > pourtant l'une des lignes dans ma table surnom contient bien James

                                          Sauf que ta requête (et la mienne aussi) c'est dont la concaténation des colonnes f_name, l_name et surnom vaut 'James'. Si tu veux contient c'est '%James%'.

                                          (j'avais juste repris l'exemple que tu m'as donné plus haut)

                                          -
                                          Edité par julp 17 octobre 2021 à 16:32:56

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            17 octobre 2021 à 16:36:55

                                            Merci pour ton aide Julp ! j'ai juste un soucie avec la colonne numero (présent dans la table customers) qui ne fonctionne pas :/ En gros quand la personne n'a pas de surnom et bien le moteur de recherche ne met aucun résultat :/

                                            -
                                            Edité par Z2V 17 octobre 2021 à 18:24:27

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 octobre 2021 à 21:16:18

                                              Pas vu ton edit.

                                              Essaie de remplacer CONCAT(/*numero, */f_name, l_name, surnom) par CONCAT(/*numero, */f_name, l_name, COALESCE(surnom, '')) (en décommentant numero chez toi ?) car chez MySQL (mais pas PostgreSQL), CONCAT avec une valeur NULL (du fait du LEFT JOIN quand il n'y a aucun surnom) renvoie NULL.

                                              Ou alors utiliser CONCAT_WS à CONCAT.

                                              -
                                              Edité par julp 20 octobre 2021 à 21:19:00

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                20 octobre 2021 à 22:14:01

                                                Merci beaucoup pour ton aide Julp. Le CONCAT_WS a résolu mon problème. Encore merci pour ton aide.
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Moteur de recherche avec left join

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown