Problème SQL Filtre PHP

Par bigdata, il y a 10 ans


Bonsoir,
J'essais de crée un système de filtre sur mon site ..
J'ai un problème avec ma page de traitement j'ai une erreur SQL ..

Ce que je fais c'est que je compose ma requète SQL suivant les variables qui existent ..

Voici le code PHP

try { $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host='.$HOST.';charset=utf8;dbname='.$DATABASE_NAME, $DB_LOGIN, $DB_PASSWORD, $pdo_options); // PAGINATION if(isset($_GET['page'])) { if($_GET['page'] != NULL) { $pagination_page_moins1=$_GET['page'] - 1; $pagination_page_min=$pagination_page_moins1 * 25; $req_page='LIMIT ' .$pagination_page_min. ', 25'; } } else { $req_page='LIMIT 0, 25'; } // SEARCH if(isset($_GET['search'])) { $req_search='AND (artistes.artiste LIKE "%' .htmlspecialchars($_GET['search']).'%" OR collections.notes LIKE "%'.$_GET['search']. '%")'; } // ITEM if(isset($_GET['item'])) { $req_item='AND (collections.categorie LIKE "%' .htmlspecialchars($_GET['item']).'%")'; } // ORDRES if(isset($_GET['ordres'])) { if($_GET['ordres'] == "DESC_TIME") { $req_ordres='ORDER BY artistes.id_artiste DESC'; } elseif($_GET['ordres'] == "ASC_TIME") { $req_ordres='ORDER BY artistes.id_artiste ASC'; } elseif($_GET['ordres'] == "ASC_ALPHA") { $req_ordres='ORDER BY artistes.artiste ASC'; } elseif($_GET['ordres'] == "DESC_ALPHA") { $req_ordres='ORDER BY artistes.artiste DESC'; } elseif($_GET['ordres'] == "STAR") { $req_ordres='ORDER BY collections.stats_cliques DESC'; } } else { $req_ordres='ORDER BY artistes.id_artiste DESC'; } // REQUETE COMPOSEE $reponse = $bdd->query('SELECT * FROM artistes INNER JOIN collections ON artistes.id_artiste = collections.id_artiste WHERE artistes.id_user=' .htmlspecialchars($_SESSION['id_user']). ' ' .htmlspecialchars($req_item). ' ' .htmlspecialchars($req_search). ' ' .htmlspecialchars($req_page). ' ' .htmlspecialchars($req_ordres)); $compteur=0; while ($donnees = $reponse->fetch()) { // J'AFFICHE LES DONNEES (JE METS PAS TOUS LE CODE VOLONTAIREMENT) $compteur++; } $reponse->closeCursor(); // Termine le traitement de la requête } catch(Exception $e) { // En cas d'erreur précédemment, on affiche un message et on arrête tout die('Erreur : '.$e->getMessage()); }

J'ai fais un echo pour voir ce que ma request me renvoyait :
SELECT * FROM artistes INNER JOIN collections ON artistes.id_artiste = collections.id_artiste WHERE artistes.id_user=1 AND (collections.categorie LIKE "%Illustration%") AND (artistes.artiste LIKE "%mike%" OR collections.notes LIKE "%mike%") LIMIT 0, 25 ORDER BY artistes.id_artiste DESC

L'erreur SQL:
Erreur : 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 '"%Illustration%") AND (artistes.artiste LIKE "%mike%" OR col' at line 1

Merci d'avance

5 réponses

Reg, il y a 10 ans

Bonjour, ça peut paraître tout bête, mais si vous mettez LIMIT 0,25 à la fin de la requête au lieu de la clause ORDER?

bigdata, il y a 10 ans

Merci mais ça ne fonctionne toujours pas

SELECT * FROM artistes INNER JOIN collections ON artistes.id_artiste = collections.id_artiste WHERE artistes.id_user=1 AND collections.categorie LIKE "%test%" AND (artistes.artiste LIKE "%test%" OR collections.notes LIKE "%test%") LIMIT 0, 25

Je crois que c'est le fait d'avoir plusieurs LIKE

Balbert, il y a 10 ans

Bonsoir
Remplacez les griffes du like par des quotes

connected, il y a 10 ans

Bonjour,

l'erreur vient du fait que l'instruction LIMIT doit être placée tout à la fin de ta requête :

Si tu lances la requête suivante cela devrait fonctionner.

SELECT * FROM artistes INNER JOIN collections ON artistes.id_artiste = collections.id_artiste WHERE artistes.id_user=1 AND (collections.categorie LIKE "%Illustration%") AND (artistes.artiste LIKE "%mike%" OR collections.notes LIKE "%mike%") ORDER BY artistes.id_artiste DESC LIMIT 0, 25

Du coup à toi de réordonner la génération de ta requête.

Si non autre conseil, dans ton try/catch tu ne devrais laisser que la connexion à la base de données et enlever les autres blocks de code du try.

Bon courage.

Lartak, il y a 10 ans

Pour information, pour ordres, j'aurais utilisé un switch à ta place.