Comment puis-je utiliser pdo de l'instruction préparée pour order by et limit clauses?
Je veux utiliser une instruction préparée dans lequel le passé-les paramètres sont pour la ORDER BY
et LIMIT
clauses, comme suit:
$sql = 'SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
'sort' => $_GET['sort'],
'dir' => $_GET['dir'],
'start' => $_GET['start'],
'results' => $_GET['results'],
)
);
Mais $stmt->fetchAll(PDO::FETCH_ASSOC);
ne retourne rien.
Quelqu'un peut-il préciser ce qui est une mauvaise chose, je suis en train de faire? Peut-il être fait? Si non,que dois-je de référence pour une liste complète des clauses où les paramètres peuvent être utilisés?
obtenir les valeurs nécessaires
Non,j'ai renseigné les valeurs d'ailleurs,mais ça ne marche toujours pas.
Autant que je sache, vous devez lier les seules valeurs, pas de colonnes et de ces.
Non,j'ai renseigné les valeurs d'ailleurs,mais ça ne marche toujours pas.
Autant que je sache, vous devez lier les seules valeurs, pas de colonnes et de ces.
OriginalL'auteur user198729 | 2010-04-21
Vous devez vous connecter pour publier un commentaire.
Après l'utilisation :
J'ai le message :
Donc, lorsque vous utilisez un tableau pour l'exécuter, il considère vos entrées comme une chaîne de caractères qui n'est pas une bonne idée pour LIMITER
limit
etorder
clauses,pouvez-vous fournir des liens pour référence?Est-il une liste complète de paramètres qui peuvent être utilisés?Dirait que je suis mauvais, table / colonne de noms ne peut pas être paramétrée. Votre problème vient de votre tableau de clés dont vous avez oublié l' : (':tri' => $_GET['tri']).
Nope,
:
est facultatif(il renvoie toujours rien après l'ajout de:
).Vous pouvez le voir ici, si vous tirez vers le bas assez: php.net/manual/en/pdostatement.execute.phpProblème trouvé, la réponse d'édition.
Mais aop dit:
OriginalL'auteur
Préparées permettre le SGBD pour générer un plan de requête pour votre requête avant de l'exécuter la requête pour vos paramètres fournis. Changer les champs pour
ORDER BY
exige un plan de requête, parce que vous ordonnant de données de différentes façons peut considérablement affecter la façon dont le SGBD peut choisir d'obtenir les données: par exemple, certains indices peuvent aider dans un cas mais pas dans l'autre. Pour cette raison, leORDER BY
champs doivent faire partie de la chaîne SQL passé dans leprepare()
méthode, plutôt que d'être lié à la requête avantexecute()
.Comme pour le
LIMIT
clause, il n'est pas clair si ses paramètres aurait une incidence sur le plan de requête, de sorte que ceux-ci peuvent être liés tard, probablement en fonction de votre SGBD. Selon cette SORTE de réponse il devrait être permis.OriginalL'auteur
Vous ne pouvez pas lier un paramètre pour spécifier une langue mot-clé ou un nom de champ - il doit être le remplacement d'un littéral. Par conséquent, vos valeurs limites, je pense, très bien, mais votre commande par n'est pas. Il sera préférable pour vous de remplacer manuellement le tri et le dir dans la chaîne. S'échapper, mais ne les utilisez pas le DB outils pour le faire, puisqu'ils ne sont pas les littéraux de chaîne. Essentiellement de s'assurer qu'aucun des caractères spéciaux sont présents.
:sort :dir
avec:sss :xxx
mais toujours pas de travail.Ce n'est pas ce que je voulais dire. Cela dépend de votre SGBD, il s'affiche. Avec MySQL, par exemple, vous ne pouvez pas utiliser lier des paramètres pour des mots clés ou des noms. Un utilisateur de la php.net découvert ainsi: php.net/manual/en/pdo.prepare.php#71127. Si vous utilisez un autre SGBD, cependant, ignorez ma réponse.
OriginalL'auteur
Bien que cette question est assez vieille, je pense que ça peut être d'intérêt. Pour moi, il a travaillé après je
PDO::PARAM_INT
comme suggéré avantintval()
La partie correspondante du code ressemble alors à ceci:
Sans l'aide de
intval()
j'ai aussi reçu le message d'erreur erreur de Syntaxe ou de violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre versions du serveur MySQL pour la bonne syntaxe à utiliser près de "0', 10' à la ligne 1OriginalL'auteur