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
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.
0
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
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. :)
0
Utilisateur anonyme
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.
0
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
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
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.
0
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
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 :)
0
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
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();
0
Utilisateur anonyme
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()));
0