LIMIT AVEC PARAMETRES

Bonjour,
J'ai essayé de coder une application avec pagination (Numéros de pages) de billets existants dans une table nomée billets en utilisant LIMIT avec deux paramètres à remplacer pour afficher chaque cinq billets dans une page et ainsi de suite voici le code :
$req = $bdd-> prepare('SELECT id,titre,contenu,DATE(date_creation) AS dat,TIME(date_creation) AS tim FROM billets ORDER BY date_creation LIMIT "$limitinfer","$limitsuper" ');
$req->execute(array(':limitinf'=>$limitinfer,':limitsup'=>$limitsuper));

et ç'a donné le message suivant :

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 '"$limitinfer","$limitsuper"' at line 1 in C:\MAMP\htdocs\TP-OP_CLASS\Blog_index_3_2.php:42 Stack trace: #0 C:\MAMP\htdocs\TP-OP_CLASS\Blog_index_3_2.php(42): PDOStatement->execute(Array) #1 {main} thrown in C:\MAMP\htdocs\TP-OP_CLASS\Blog_index_3_2.php on line 42

j'ai cherché la solution dans des forums una des solutions est ce code :
$req = $bdd-> prepare('SELECT id,titre,contenu,DATE(date_creation) AS dat,TIME(date_creation) AS tim FROM billets ORDER BY date_creation LIMIT '.$limitinfer.','.$limitsuper.' ');

le résultat est page vide.
Je ne comprend pas ou est le problème.
Merci de bien me répondre.

2 réponses

  1. ça marche pas, je sais pas pourquoi?
  2. Modérateur
    Bonjour,

    Pour les "limit" et "offset" tu ne peux pas les passer directement dans le execute.
    Il faut utiliser du BIND
    $sql = "SELECT id,titre,contenu,DATE(date_creation) AS dat,TIME(date_creation) AS tim 
                  FROM billets 
                   ORDER BY date_creation 
                   LIMIT :limit , :offset ";
    $stmt = $bdd->prepare($sql);
    $stmt->bindValue('limit', $limitinfer, PDO::PARAM_INT);
    $stmt->bindValue('offset', $limitsuper, PDO::PARAM_INT);
    $stmt->execute();
    


    et si tu veux les passer dans ta requête sans "sécurité", tu aurais pu faire :
    $sql = "SELECT id,titre,contenu,DATE(date_creation) AS dat,TIME(date_creation) AS tim 
                  FROM billets 
                   ORDER BY date_creation 
                   LIMIT $limitinfer , $limitsuper ";
    $stmt = $bdd->prepare($sql);
    $stmt->execute();
    

    Mais je serai toi, je resterai sur la première proposition.

    NB:
    Si tu n'obtiens pas de résultats, fais un echo de la variable $sql ainsi que des variables $limitinfer et $limitsuper ... et teste la requête DIRECTEMENT en bdd ( via phpmyadmin par exemple ) pour voir ce qu'elle te retourne.