Problème LIMIT avec requête préparée PDO

Problème LIMIT avec requête préparée PDO - PHP - Programmation

Marsh Posté le 16-06-2010 à 00:05:40    

Bonjour,
Méga débutant en php, je suis en train de me coder un CMS maison pour apprendre. Jusqu'à là, pas trop de problème..Mais la je commence à bosser sur la pagination.
J'utilise PDO pour converser avec ma base, mais j'ai un problème pour l'utilisation du LIMIT en commande préparée pour utiliser avec des variables...
 

Code :
  1. $req=$bdd->prepare('SELECT * FROM blog ORDER BY id DESC LIMIT :mini,:maxi');
  2.  $req->execute(array('mini'=>$premier_article, 'maxi'=>$dernier_article));


Sachant que si je var_dump mes deux variables elles renvoient un int(x) (où x la valeurs que je transmet avec un $_GET)
 
Si je remplace :mini et :maxi directement par des valeurs.. ça marche
 
Mais avec la configuration actuelle, ça ne me renvoit aucun article.
 
Des idées? J'ai pas compris un truc tout con?? Parce que je me chie dessus à relire mon code, je trouve paaas grumpf


---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Marsh Posté le 16-06-2010 à 00:05:40   

Reply

Marsh Posté le 16-06-2010 à 08:19:03    

wizopunker a écrit :

Bonjour,
Méga débutant en php, je suis en train de me coder un CMS maison pour apprendre. Jusqu'à là, pas trop de problème..Mais la je commence à bosser sur la pagination.
J'utilise PDO pour converser avec ma base, mais j'ai un problème pour l'utilisation du LIMIT en commande préparée pour utiliser avec des variables...

 
Code :
  1. $req=$bdd->prepare('SELECT * FROM blog ORDER BY id DESC LIMIT :mini,:maxi');
  2.  $req->execute(array('mini'=>$premier_article, 'maxi'=>$dernier_article));


Sachant que si je var_dump mes deux variables elles renvoient un int(x) (où x la valeurs que je transmet avec un $_GET)

 

Si je remplace :mini et :maxi directement par des valeurs.. ça marche

 

Mais avec la configuration actuelle, ça ne me renvoit aucun article.

 

Des idées? J'ai pas compris un truc tout con?? Parce que je me chie dessus à relire mon code, je trouve paaas grumpf

 

Oh, vous ici !

 


Deja, le chiffre après la virgule du LIMIT est le nombre de reponse que tu souhaites et non "le dernier index" souhaité, enfin, c'est le nom de ta $var qui me fait tilter ça...

 

Après, je n'ai jamais vu cette notation :var...
Si tu as pris soin de bien verifier $premier_article et $dernier_article était bien des int() afin d'éviter le SQL injection, tu peux concaténer ces variables direct dans ta requête...

 
Code :
  1. $req=$bdd->query('SELECT * FROM blog ORDER BY id DESC LIMIT'.$premier_article.', '.$dernier_article);
 

Sinon, plus "propre" (?) :

 
Code :
  1. $req=$bdd->prepare('SELECT * FROM blog ORDER BY id DESC LIMIT ?, ?');
  2. $req->execute(array($premier_article, $dernier_article));



Message édité par abais le 16-06-2010 à 08:23:15

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 16-06-2010 à 13:43:13    

Oui, moi ici :D

 

oui effectivement, j'ai mal géré ma nomenclature de la variable, mais à part ça j'suis ok sur la fonction LIMIT. J'ai pas encore pris de bons automatisme en terme de nomenclature, c'est un peu relou :D

 

Bon à par ça, tes propositions ne marchent pas..Ta concaténation ne passe pas, et la préparation avec les "?" ne marche pas. Au passage cette préparation est quasi la même qu'avec les :var (qui marche très bien sur une requête normale d'ailleurs).

 

Ah et j'en ai profité pour renommer ma variable :D

 

Du coup, j'ai fait un req->errorInfo() :

Code :
  1. Array ( [0] => 42000 [1] => 1064 [2] => Erreur de syntaxe près de ''0', '20'' à la ligne 1 )
 

J'ai testé avec :

 
Code :
  1. $req=$bdd->prepare("SELECT * FROM blog ORDER BY id DESC LIMIT :debut, :nombre" );
  2.  $req->execute(array(':debut'=>$premier_article, ':nombre'=>$nombre_article));
 

et

 
Code :
  1. $req=$bdd->prepare("SELECT * FROM blog ORDER BY id DESC LIMIT :debut, :nombre" );
  2.  $req->bindParam(':debut', $premier_article);
  3.  $req->bindParam(':nombre', $nombre_article);
  4.  $req->execute();
 

Quelqu'un a une idée? Je dois faire un truc tout con, et j'aime pas sa manière de gérer les ' et le " :D


Message édité par wizopunker le 16-06-2010 à 13:44:07

---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Marsh Posté le 16-06-2010 à 17:55:00    

ah, ben j'ai réussis!
En fait la piste à creuser était bien au niveau des guillemets. PDO interprète toute valeur par défaut en string. Il faut donc lui indiquer que c'est un entier:

Code :
  1. $req=$bdd->prepare("SELECT * FROM blog ORDER BY id DESC LIMIT :debut, :nombre" );
  2.  $req->bindParam(':debut', $premier_article, PDO::PARAM_INT);
  3.  $req->bindParam(':nombre', $nombre_article, PDO::PARAM_INT);
  4.  $req->execute();


---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Marsh Posté le 16-06-2010 à 20:15:42    

C'est bon à savoir, je me sert aussi de PDO (depuis peu) , je n'avais jamais eu affaire à ça...
C'est curieux tout de même...


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 16-06-2010 à 21:19:19    

Je viens d'essayer chez moi, j'ai en effet le même problème si je donne les paramètres au moment de l'exécution...
Sinon mon premier code marche, seulement j'ai oublier un espace après le LIMIT...


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 16-06-2010 à 21:37:21    

ouais mais bon concaténer je savais faire, mais je trouve ça un peu illisible à la relecture, je préfère le faire proprement :D


---------------
| .:: www.wizopunk-art.com - Développement web ::. |
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed