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 } ?>
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.
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).
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
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*/
;
> 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)
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 :/
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.
Merci beaucoup pour ton aide Julp. Le CONCAT_WS a résolu mon problème. Encore merci pour ton aide.
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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli