PDO : problème avec methode quote() ?

Mammouth du PHP | 531 Messages

19 janv. 2009, 19:38

Bonjour,

J'ai l'impression d'avoir un soucis avec la méthode quote de PDO.

Le code ci dessous se trouve dans une methode. A signaler que les magic quotes sont désactivées.
Lorsque dans le contenu dans mes variables il y a un apostrophe, l'enregistrement ne se fait pas. Comme je découvre tout juste PDO je n'ai pas encore trouvé comment retourner les erreurs, mais je suis sur que ça vient de là après plusieurs test.

Y aurait-il un soucis dans mon code ?
$cnx->quote($idNews, PDO::PARAM_STR);
		$cnx->quote($titre, PDO::PARAM_STR);
		$cnx->quote($date, PDO::PARAM_STR);
		$cnx->quote($content, PDO::PARAM_STR);
		$cnx->quote($auteur, PDO::PARAM_INT);
		$req = "UPDATE news SET titre = '".$titre."', date = '".$date."', content = '".$content."', etat = ".$etat.", idUser = ".$auteur." WHERE idNews = ".$idNews."";
		$res = $cnx->exec($req);

ViPHP
ViPHP | 1380 Messages

19 janv. 2009, 20:18

Si vous utilisez cette fonction pour construire des requêtes SQL, vous êtes vivement invité à utiliser PDO::prepare() pour préparer les requêtes SQL avec des paramètres liées au lieu d'utiliser PDO::quote() pour interpréter les entrées utilisateurs dans la requête SQL. Les requêtes préparées avec des paramètres liées ne sont pas seulement plus portables, plus malléables et plus sécurisées mais bien plus rapides à exécuter que d'interpréter les requêtes, étant donné que les côtés client et serveur peuvent mettre en cache une version compilée de la requête.
Un truc du genre:
$req = "UPDATE news SET titre =:titre, date =:date, content =:content, etat =:etat, idUser =:auteur WHERE idNews =:news";
$valeurs = array(
	':news'    => $idNews,
	':titre'   => $titre,
	':date'    => $date,
    ':content' => $content
	':auteur'  => $auteur
	);
$res = $cnx->prepare($req);
$res->execute($valeurs);
Ensuite tu traverses le recordset $res avec $res->fetch(PDO::FETCH_ASSOC) ou fetchAll().

Si tu tiens à $cnx->quote() essaye sans les simples quote:
$req = "UPDATE news SET titre = ".$titre.", date = ".$date.", content = ".$content.", etat = ".$etat.", idUser = ".$auteur." WHERE idNews = ".$idNews."";
Modifié en dernier par Ripat le 26 janv. 2009, 08:38, modifié 1 fois.
ripat

skap64
Invité n'ayant pas de compte PHPfrance

20 janv. 2009, 00:08

ou tout simplement une requete mais si on commence avec les quotes, on finit...
<?php
$req = "UPDATE news SET titre = '$titre', date = '$date', content = '$content', etat = '$etat', idUser = '$auteur' WHERE idNews = '$idNews'"; 
// etc.......
?>


x@v
Mammouth du PHP | 570 Messages

20 janv. 2009, 01:13

donc si ont a ce genre de méthode, ont est théoriquement protégé contre les injection ?
		try
		{
			$this->con = parent::beginTransaction();
			//$result= parent::query($reqSelect);
			$result = parent::prepare($reqSelect);
			$result->execute();
			$this->con = parent::commit();
			// ou
			// $this->con = parent::rollBack();
	  		return $result;
		}
		catch (Exception $e) 
		{
			//On indique par email que la requ�te n'a pas fonctionn�.
			error_log(date('D/m/y').' � '.date("H:i:s").' : '.$e->getMessage(), 1, $this->email);
			$this->con =parent::rollBack();
			$message= new Message();
			$message->outPut('Erreur dans la requ�tte', 'Votre requ�te a �t� abandonn�');
		}
J'avais déjà lut cela quelque part !
Mais sur un forum ont m'avait bouffonner sur mon interprétation... :oops:

ViPHP
ViPHP | 1136 Messages

20 janv. 2009, 09:14

Salut ,
$cnx->quote($idNews, PDO::PARAM_STR);
        $cnx->quote($titre, PDO::PARAM_STR);
        $cnx->quote($date, PDO::PARAM_STR);
        $cnx->quote($content, PDO::PARAM_STR);
        $cnx->quote($auteur, PDO::PARAM_INT);
        $req = "UPDATE news SET titre = '".$titre."', date = '".$date."', content = '".$content."', etat = ".$etat.", idUser = ".$auteur." WHERE idNews = ".$idNews."";
        $res = $cnx->exec($req);
Ici , déjà pour plus de lisibilité , tu peux enlever PDO::PARAM_STR étant la valeur par défaut .

Maintenant quelque chose m'échappe , tu ne recupére pas tes chaines échappées ? ce n'est pas une référence que tu met dans la méthode quote .. et ici , aucune chaine que tu échappes n'est récupérés ..

Ensuite , pour voir exactement ce qui se passe , affiche à l'écran ta variable $req pour voir ou ca plante ..

Mais pour moi le code ci -dessous fonctionnerai dejà mieux :
$req = "UPDATE 
			news 
		SET 
			titre 	    = '".$cnx->quote($titre)."',
			date      = '".$cnx->quote($date)."',
			content  = '".$cnx->quote($content)."',
			etat 	    = ".$cnx->quote($etat).",
			idUser   = ".$cnx->quote($auteur)."
		WHERE 
			idNews  = ".$cnx->quote($idNews)."
		LIMIT 1";

$res = $cnx->exec($req);

Natolumin
Invité n'ayant pas de compte PHPfrance

25 janv. 2009, 21:11

$cnx->quote($idNews, PDO::PARAM_STR);
        $cnx->quote($titre, PDO::PARAM_STR);
        $cnx->quote($date, PDO::PARAM_STR);
        $cnx->quote($content, PDO::PARAM_STR);
        $cnx->quote($auteur, PDO::PARAM_INT);
        $req = "UPDATE news SET titre = '".$titre."', date = '".$date."', content = '".$content."', etat = ".$etat.", idUser = ".$auteur." WHERE idNews = ".$idNews."";
        $res = $cnx->exec($req); 
En fait, la méthode quote s'occupe des ' à votre place, ils sont donc superflus dans la requête...

Ce qui nous donne :
$cnx->quote($idNews, PDO::PARAM_STR);
        $cnx->quote($titre, PDO::PARAM_STR);
        $cnx->quote($date, PDO::PARAM_STR);
        $cnx->quote($content, PDO::PARAM_STR);
        $cnx->quote($auteur, PDO::PARAM_INT);
        $req = 'UPDATE news SET titre = '.$titre.', date = '.$date.', content = '.$content.', etat = '.$etat.', idUser = '.$auteur.' WHERE idNews = '$idNews.'';
        $res = $cnx->exec($req); 
J'en ai profité pour changer les doubles quote en simples, c'est pas bon pour les performances ces petites bêtes...

x@v
Mammouth du PHP | 570 Messages

26 janv. 2009, 00:17

Avec les requêtes préparées avons nous besoin d'utilisés la méthode quote ?
:)

ViPHP
ViPHP | 1380 Messages

26 janv. 2009, 08:37

Avec les requêtes préparées avons nous besoin d'utilisés la méthode quote ?
:)
Absolument pas, c'est même la méthode recommandée pour se protéger contre les injections. Voir la citation de mon post plus haut.
ripat

x@v
Mammouth du PHP | 570 Messages

26 janv. 2009, 17:10

d'ou tu tiens l'inforamtion ?
:)

ViPHP
ViPHP | 1380 Messages

28 janv. 2009, 09:33

d'ou tu tiens l'inforamtion ?
:)
La doc, des essais personnels et http://www.google.be/search?q=pdo+prepare+injection+sql
ripat

x@v
Mammouth du PHP | 570 Messages

28 janv. 2009, 12:35

pour moi c'est clair, merci :)

ViPHP
ViPHP | 1380 Messages

28 janv. 2009, 13:17

pour moi c'est clair, merci :)
Pas perçu le deuxième degré de tes remarques alors. Désolé.
ripat

x@v
Mammouth du PHP | 570 Messages

28 janv. 2009, 14:08

aucun second degré, juste que sa clarifie ce qui était flou pour moi. protection des valeurs automatique.
excellent