Erreur simple quote SQL/php [Résolu/Fermé]

Signaler
Messages postés
385
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
-
 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:

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.


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.
Messages postés
385
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
16
Bah je pense que c'est faisable, puisque dans un insert, je m'en sert.


$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.
Messages postés
385
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
16
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:
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 !

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.
Messages postés
385
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
16
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 :)
Messages postés
385
Date d'inscription
dimanche 8 mars 2009
Statut
Membre
Dernière intervention
13 juillet 2018
16
Bon, et bien je laisse tomber ^^

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();

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()));