Bonjour,
J'ai une Erreur sur un query dans mon code.
Voici mon code :

$liba = $db->query('SELECT * FROM library');

if (isset($_GET['sp']) && !empty($_GET['sp'])) {
	$recherche = htmlspecialchars($_GET['sp']);
	
	$liba = $db->query('SELECT * FROM library WHERE `name`,`description` LIKE %' $recherche);
	
};


Et voici l'erreur retournée :
Parse error: syntax error, unexpected '$recherche' (T_VARIABLE), expecting ',' or ')' in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\library\index.php on line 20


Merci d'avance,
Modérateur
Salut,

Il manque le point pour la concaténation :

$liba = $db->query('SELECT * FROM library WHERE `name`,`description` LIKE %'. $recherche);
Euhh dans mon code j'ai une erreur 1064
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 MySQL server version for the right syntax to use near '`description` LIKE %Minecraft' at line 1 in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\library\index.php:20 Stack trace: #0 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\library\index.php(20): PDO->query('SELECT * FROM l...') #1 {main} thrown in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\library\index.php on line 20
normal. En plus de mettre le "." permettant la concaténation, il faut aussi mettre des "quotes" car la data attendu est surement de type string (varchar). donc là tu as

WHERE... LIKE %ok%

au lieu de

WHERE... LIKE '%ok%'
et en vrai, il y a plusieurs problème dans ta requêtes :

+Il y a une erreur de syntaxe dans la clause WHERE. Il manque une condition de comparaison pour les champs name et description. Il devrait être : WHERE name LIKE '%$recherche%' OR description LIKE '%$recherche%'
+Il n'y a pas de protection contre les injections SQL. Il est recommandé d'utiliser des préparations de requêtes pour éviter les risques d'injection SQL.
+Il n'y a pas de limite à la requête, ce qui pourrait causer des problèmes de performance si la table "library" contient un grand nombre d'enregistrements. Il est recommandé d'utiliser une clause LIMIT pour limiter le nombre de résultats renvoyés.
Voici une version correcte de la requête :

$stmt = $db->prepare('SELECT * FROM library WHERE name LIKE ? OR description LIKE ? LIMIT ?');
$stmt->bind_param('ssi', '%' . $recherche . '%', '%' . $recherche . '%', $limit);
$stmt->execute();
$liba = $stmt->get_result();

Ici on utilise une préparation de requête, on bind les valeurs de recherche et de limite à la requête pour éviter les risques d'injection SQL.
Meilleure solution
Alors j'ai un peu modifier le code :
$liba = $db->prepare('SELECT * FROM library WHERE name LIKE ? OR description LIKE ?');
	$liba->execute(array('%' . $recherche . '%', '%' . $recherche . '%'));

Et voila, plus de problème !
Modifié par BurgerKingKong (24 Jan 2023 - 17:54)