LIMIT AVEC PARAMETRES

Fermé
zakri-04 Messages postés 23 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 9 août 2023 - 1 juin 2021 à 15:59
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 16 juin 2021 à 17:38
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

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié le 1 juin 2021 à 16:11
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.

0
zakri-04 Messages postés 23 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 9 août 2023 2
16 juin 2021 à 16:52
ça marche pas, je sais pas pourquoi?
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
16 juin 2021 à 17:38
ça ne marche pas... c 'est à dire ...???
Quel code as tu utilisé ?
As tu des messages d'erreur ?
As tu activé l'affichage des erreurs PDO ? ( voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs)

As tu fais un ECHO de ta variable $sql pour voir ce qu'elle contient ?
Idem pour tes variables php : $limitinfer et $limitsuper ?
0