Erreur simple quote SQL/php
Résolu/Fermé
aneantisseur
Messages postés
384
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
-
19 déc. 2013 à 00:09
Utilisateur anonyme - 20 déc. 2013 à 10:16
Utilisateur anonyme - 20 déc. 2013 à 10:16
A voir également:
- Erreur simple quote SQL/php
- Erreur 0x80070643 - Accueil - Windows
- Iphone 14 simple - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 1001 outlook - Accueil - Bureautique
- Erreur 5000 france tv - Forum iPhone
8 réponses
Utilisateur anonyme
Modifié par le père. le 19/12/2013 à 00:57
Modifié par le père. le 19/12/2013 à 00:57
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.
aneantisseur
Messages postés
384
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
18
Modifié par aneantisseur le 19/12/2013 à 09:02
Modifié par aneantisseur le 19/12/2013 à 09:02
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. :)
Utilisateur anonyme
19 déc. 2013 à 09:29
19 déc. 2013 à 09:29
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.
aneantisseur
Messages postés
384
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
18
19 déc. 2013 à 21:01
19 déc. 2013 à 21:01
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
Utilisateur anonyme
19 déc. 2013 à 22:31
19 déc. 2013 à 22:31
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.
aneantisseur
Messages postés
384
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
18
19 déc. 2013 à 22:34
19 déc. 2013 à 22:34
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 :)
aneantisseur
Messages postés
384
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
18
19 déc. 2013 à 23:24
19 déc. 2013 à 23:24
Bon, et bien je laisse tomber ^^
J'ai finalement sécurisé la variable utilisateur a la main:
J'ai finalement sécurisé la variable utilisateur a la main:
$variable=$bdd->quote($variable);
$requete=$bdd->query('SELECT '.$champ.' FROM membre WHERE '.$champ.'='.$variable.'') or die (print_r($requete->errorInfo()));
$donnee_bdd = $requete->fetch();
Utilisateur anonyme
20 déc. 2013 à 10:16
20 déc. 2013 à 10:16
Pour rester dans la logique des requêtes préparées, tu aurais pu faire :
$requete=$bdd->prepare('SELECT '.$champ.' FROM membre WHERE '.$champ.' = :variable'); $requete->execute(array( 'variable'=>$variable)) or die (print_r($requete->errorInfo()));