Erreur simple quote SQL/php
Résolu
aneantisseur
Messages postés
385
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour, je bloque en ce moment même sur une requête SQL (problème dû a php)
En fait, j'essai de selectioner dans ma table en avec LIMIT où l'entrée de départ est une varible en $_GET. Je sécurise donc avec prepare, puis execute, mais le script me rajoute des quotes a mon entrée, je me retrouve donc avec cette erreur:
Le code de base :
Merci.
En fait, j'essai de selectioner dans ma table en avec LIMIT où l'entrée de départ est une varible en $_GET. Je sécurise donc avec prepare, puis execute, mais le script me rajoute des quotes a mon entrée, je me retrouve donc avec cette erreur:
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 ''0', 10' at line 1 ) 1
Le code de base :
if(isset($_GET['page']))
{
$debut=htmlspecialchars($_GET['page']) - 1;
$debut=$debut * 10;
}
else
{
$debut=0;
}
$requete = $bdd->prepare('SELECT * FROM chat ORDER BY ID DESC LIMIT ?, 10');
$requete->execute(array($debut)) or die (print_r($requete->errorInfo()));
Merci.
A voir également:
- Erreur simple quote SQL/php
- Iphone 14 simple - Guide
- Montage video simple windows - Guide
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Expert php pinterest - Télécharger - Langages
8 réponses
Bonsoir
Je ne sais pas c'est faisable d'éviter les quotes avec PDO.
Mais tu peux facilement sécuriser toi-même ta variable en vérifiant qu'il n'y a que des chiffres.
[edit] en fait, il y a PDOStatement::bindParam qui permet de spécifier les types des paramètres nommés dans les requêtes préparées. Je suppose qu'il n'ajoute pas de quotes si on lui dit qu'il s'agit d'un entier.
Je ne sais pas c'est faisable d'éviter les quotes avec PDO.
Mais tu peux facilement sécuriser toi-même ta variable en vérifiant qu'il n'y a que des chiffres.
[edit] en fait, il y a PDOStatement::bindParam qui permet de spécifier les types des paramètres nommés dans les requêtes préparées. Je suppose qu'il n'ajoute pas de quotes si on lui dit qu'il s'agit d'un entier.
Bah je pense que c'est faisable, puisque dans un insert, je m'en sert.
Comment ca se fait ? ^^
EDIT: En effet, avec PDOStatement::binparam, ca marche, mais j'aimerais savoir pourquoi j'ai pu l'utiliser dans un insert et pas dans un select. :)
$array_insert = array(
'nom' => 'Diablo 3',
'possesseur' => 'Thomas',
'console' => 'PC',
'prix' => 40,
'nbre_joueurs_max' => 4,
'commentaires' => 'Un bon jeu !'
);
$requete = $bdd->prepare('INSERT INTO jeux_video(nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES(:nom, :possesseur, :console, :prix, :nbre_joueurs_max, :commentaires)');
$requete->execute($array_insert) or die (print_r($requete->errorInfo()));
Comment ca se fait ? ^^
EDIT: En effet, avec PDOStatement::binparam, ca marche, mais j'aimerais savoir pourquoi j'ai pu l'utiliser dans un insert et pas dans un select. :)
mais j'aimerais savoir pourquoi j'ai pu l'utiliser dans un insert et pas dans un select
Parce que le LIMIT est très spécial en mysql. Dans les données (VALUES), il transforme les textes en nombres s'il en a besoin, donc les apostrophes ne le dérangent pas, mais dans LIMIT il lui faut absolument un paramètre numérique, donc pas d'apostrophes.
Parce que le LIMIT est très spécial en mysql. Dans les données (VALUES), il transforme les textes en nombres s'il en a besoin, donc les apostrophes ne le dérangent pas, mais dans LIMIT il lui faut absolument un paramètre numérique, donc pas d'apostrophes.
Ok :)
Entre temps je suis retombé sur une erreur assez similaire. Je fais un select ou quasiment toutes les infos sont des variables, mais j'ai une belle erreur:
Mon code source :
Sachant que $champ (ici 'pseudo') et $table (ici 'membre') sont des variables dans le code source, et $variable est une donnée utilisateur (ici 'Feignus').
Aideeez-moi !! xD
Merci !
Entre temps je suis retombé sur une erreur assez similaire. Je fais un select ou quasiment toutes les infos sont des variables, mais j'ai une belle erreur:
Array ( [0] => 42000 [1] => 1064 [2] => 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 ''membre' WHERE 'pseudo'='Feignus'' at line 1 ) 1
Mon code source :
function verifier_aucune_entree($champ, $table, $variable)
{
global $bdd;
$requete=$bdd->prepare('SELECT :champ FROM :table WHERE :champ=:variable');
$requete->execute(array(
'champ'=>$champ,
'table'=>$table,
'variable'=>$variable)) or die (print_r($requete->errorInfo()));
$donnee_bdd = $requete->fetch();
if($donnee_bdd[$variable]==$variable)
return true;
else
return false;
}
Sachant que $champ (ici 'pseudo') et $table (ici 'membre') sont des variables dans le code source, et $variable est une donnée utilisateur (ici 'Feignus').
Aideeez-moi !! xD
Merci !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu ne peux pas utiliser les noms (:nom) ou marqueurs (?) que pour les valeurs, pas pour les noms de champs ou de tables.
Tu ne peux donc insérer des noms de champs ou de tables que par concaténation en php, ce qui t'oblige à les contrôler soigneusement pour éviter les injections. Hélas, PDO ne fait pas tout !
Au passage, si c'était possible, tu n'aurais quand même pas le droit d'utiliser 2 fois la même variable (:champ) dans une requête, il faudrait que tu les appelles :champ1 et :champ2 et que tu leur donnes la même valeur.
Tu ne peux donc insérer des noms de champs ou de tables que par concaténation en php, ce qui t'oblige à les contrôler soigneusement pour éviter les injections. Hélas, PDO ne fait pas tout !
Au passage, si c'était possible, tu n'aurais quand même pas le droit d'utiliser 2 fois la même variable (:champ) dans une requête, il faudrait que tu les appelles :champ1 et :champ2 et que tu leur donnes la même valeur.
Ok, j'ai trouvé. En fait, la variable $table est 'membre' est est affichée avec les quotes dans la requête. Il suffit d'enlever les quotes (j'ai mis membre directeement dans la requête).
Donc, questions suivante : Comment on enlève les quotes qui entourent une variable texte ?
Merci :)
Donc, questions suivante : Comment on enlève les quotes qui entourent une variable texte ?
Merci :)