LIMIT AVEC PARAMETRES

Signaler
Messages postés
14
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
16 juin 2021
-
Messages postés
32975
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
-
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

Messages postés
32975
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
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.

.
Cordialement,
Jordane
Messages postés
14
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
16 juin 2021

ça marche pas, je sais pas pourquoi?
Messages postés
32975
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
ç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://www.commentcamarche.net/faq/46512-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 ?