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


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
Auteur

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

Bonsoir
Remplacez les griffes du like par des quotes

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.

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