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
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?
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
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.