Page 1 sur 2

Suicide par PHP(pg_escape_string-PDO) même combat

Posté : 16 janv. 2007, 13:08
par Maitrepylos
Bonjour, je vous situe mon problème.

Au temps de ce bon vieux php 5.1(Version Ubuntu Dapper).
Une simple insertion PostgreSQL de ce type me comblais
$sqlparticipant = "INSERT INTO participant (parcivilite,parnom,parprenom,parlieunaissance,pardatenaissance)";
		$sqlparticipant.= "Values ('".pg_escape_string($civilite)."','".pg_escape_string($nom)."','".pg_escape_string($prenom)."','".pg_escape_string($LieuNaissance)."',$datenaissance)";
		pg_escape_string($sqlparticipant);
		pg_query($sqlparticipant)or die(Erreurpgquery());

		$sqlid = "SELECT idparticipant FROM participant WHERE parnom ='".$nom."' AND parprenom = '".$prenom."'";
		$sqlquery =pg_query($sqlid)or die(Erreurpgquery());
		$row =pg_fetch_array($sqlquery)or die(Erreurpgquery());
		$_SESSION['id']=$row['idparticipant'];

Puis me pris l'envie dans un nouveau projet d'utiliser PDO, donc j'ai fais une mise à jour de PHP 5.1 vers PHP 5.2(Debian dotdeb).
Et là les Romains(enfin moi), s'empoignèrent.

Aucune insertion ne se faisaient, j'avais une erreur qui voulais que j'ouvre un fichier plutôt que de réaliser l'action, cfr ce Post.

Il s'est avérer que la fonction pg_escape_string(), posait problème (cfr bug(merci Haugure) ), en gros on ne peux plus encapsuler pg_escape_string()

Donc je test ceci :
                $civilite = pg_escape_string($civilite);
		$nom = pg_escape_string($nom);
		$prenom = pg_escape_string($prenom);
		$LieuNaissance = pg_escape_string($LieuNaissance);

		$sqlparticipant = "INSERT INTO participant (parcivilite,parnom,parprenom,parlieunaissance,pardatenaissance)";
		$sqlparticipant.= " Values ('".$civilite."','".$nom."','".$prenom."','".$LieuNaissance."',$datenaissance)";
		pg_query($sqlparticipant)or die(Erreurpgquery());

		$sqlid = "SELECT idparticipant FROM participant WHERE parnom ='".$nom."' AND parprenom = '".$prenom."'";
		$sqlquery =pg_query($sqlid)or die(Erreurpgquery());
		$row =pg_fetch_array($sqlquery)or die(Erreurpgquery());
		$_SESSION['id']=$row['idparticipant'];
En fait si j'utilise la fonction pg_escape_string(), cela ne fonctionne pas.
Par contre sans cette fonction tout est nikel, enfin presque puisque magic_quote étant à off, je n'ai plus de fonction qui échappe mes données.

Il y a bien addslashes(), mais ce n'est pas recommandé pour le SGBDR.

Donc je me dit, ben il faut réécrire les insertion en PDO, ce que je fais
$pdo = new PDO('pgsql:dbname=******* host=localhost','*****','******');

		$sql='INSERT INTO participant (parcivilite,parnom,parprenom,parlieunaissance,pardatenaissance) Values (:civilite,:nom,:prenom,:LieuNaissance,:datenaissance)';
		$stmt = $pdo->prepare($sql);
		$valeur = array(':civilite'=>$civilite,':nom'=>$nom,':prenom'=>$prenom,':LieuNaissance'=>$LieuNaissance,':datenaissance'=>$datenaissance);
		$stmt->execute($valeur);

Et là horreur, j'ai le même problème, il refuse d'insérer les données mais me propose d'ouvrir un fichier à la place(peut-être que mon PDO est mauvais?).

Je ne vois que comme solution de remettre mon magic_quote à ON en attendant, j'espère que cela va aller.

Si vous avez une solution ou une idée, je suis vraiment preneur.

MaitrePylos

Posté : 16 janv. 2007, 13:46
par Ajoloca
Bonjour,

Tu ne devrais pas activer magic_quote.

Avec PDO tu as une méthode qui te permets "d'encapsuler" tes chaines de caractères indépendamment du SGBDR.
$nom = "Un nom d'auteur";
$nom = $dbh->quote($nom);
$sql = "INSERT INTO table (nom) VALUES ($nom)";

Posté : 16 janv. 2007, 14:21
par Maitrepylos
Ok, je l'avais trouvé.

Mais mon problème est que mon code PDO, ce-dessus ne fonctionne pas.

Il me propose de télécharger le fichier(qui est vide).

Donc je ne vois vraiment pas comment faire pour insérer mes données.

Je panique là.

MaitrePylos

Posté : 16 janv. 2007, 14:45
par Ajoloca
Re,

Essaie ceci
try {
	$pdo = new PDO('pgsql:dbname=******* host=localhost','*****','******');
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
	die('Erreur ! : ' . $e->getMessage() . '<br />';
}

$sql='INSERT INTO participant (parcivilite,parnom,parprenom,parlieunaissance,pardatenaissance) 
     VALUES (:civilite,:nom,:prenom,:LieuNaissance,:datenaissance)';
try {
	$stmt = $pdo->prepare($sql);
} catch (PDOException $e) {
	die('Erreur ! : ' . $e->getMessage() . '<br />';
}
try {
   $stmt->bindParam(':civilite', $pdo->quote($civilite));
   $stmt->bindParam(':nom', $pdo->quote($nom));
   $stmt->bindParam(':prenom', $pdo->quote($prenom));
   $stmt->bindParam(':LieuNaissance', $pdo->quote($LieuNaissance));
   $stmt->bindParam(':datenaissance', $pdo->quote($datenaissance));
   $stmt->execute();
} catch (PDOException $e) {
	die('Erreur ! : ' . $e->getMessage() . '<br />';
} 

Posté : 16 janv. 2007, 15:02
par Maitrepylos
Bon alors, déja merci pour ton aide.

Que je mette les magic_quote_gpc à On ou Off.

Dans les deux cas ton code fais en sorte que cela ouvre un fichier plutôt que d'insérer les données.


je penche pour un problème de php.ini, mais je ne vois pas où.

Voici mon phpInfo()

Posté : 16 janv. 2007, 15:07
par Ajoloca
Re,

Les autres fichiers avec extension .php, sont-ils pris en compte ou bien il te demande de les télécharger aussi ?

Posté : 16 janv. 2007, 15:14
par Maitrepylos
Oui, tout fonctionnent nikel.

En fait :

si je prend la méthode classique d'insertion
pg_query()
et que je n'utilise pas pg_escape_string(), cela fonctionne bien(mais cela suppose que magic_quote soit à On ).

Par contre je fais également des insertions, mais via une procédure stocké, et là cela ne me pose pas de problème.

Bienvenu dans mon monde :)

Posté : 16 janv. 2007, 15:29
par Ajoloca
Re,
Essaie comme ça
try {
	$pdo = new PDO('pgsql:dbname=******* host=localhost','*****','******');
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
	die('Erreur ! : ' . $e->getMessage() . '<br />';
}

$sql="INSERT INTO participant (parcivilite,parnom,parprenom,parlieunaissance,pardatenaissance) 
     VALUES ('" . $pdo->quote($civilite) . "','" . $pdo->quote($nom) . "','" .
        $pdo->quote($prenom). "','" . $pdo->quote($LieuNaissance) . "','" .
        $pdo->quote($datenaissance) . "')";
try {
   $pdo->exec($sql);
}
catch (PDOException $e) {
	die('Erreur ! : ' . $e->getMessage() . '<br />';
}
C'est sans trop de conviction, mais...

Posté : 16 janv. 2007, 15:39
par Maitrepylos
Pas mieux.

je pense que ton premier exemple est bon, il faut juste trouver pourquoi, il ne veut pas interpréter le code!

Posté : 16 janv. 2007, 15:43
par Ajoloca
Re,

Non, mon premier exemple a des erreurs.

Avec le "prepare" il ne faut pas échapper les chaines de caractères (d'après la doc).
C'est justement le but de "prepare".

Alors reprends-le sans les $pdo->quote().
EDIT :
Il ne faut pas que les magic_quote soit activé, sinon ça plante.

N'oublie pas de redémarrer Apache après la modif

Posté : 16 janv. 2007, 16:04
par Maitrepylos
Toujours pas.

Je vais commenter chaque ligne et défaire au fur et a mesure, pour voir ce qui déclenche la non interprétation.

Posté : 16 janv. 2007, 16:10
par Maitrepylos
donc, dés que j'arrive dans ce bloc
try {
   $stmt->bindParam(':civilite', $civilite);
   $stmt->bindParam(':nom', $nom);
   $stmt->bindParam(':prenom', $prenom);
   $stmt->bindParam(':LieuNaissance', $LieuNaissance);
   $stmt->bindParam(':datenaissance', $datenaissance);
   $stmt->execute();
} catch (PDOException $e) {
    die('Erreur ! : ' . $e->getMessage() . '<br />');
}
Il veut ouvrir un fichier, et non pas s'exécuter!

[edit]: je dois partir, a demain, merci de ton aide

Posté : 17 janv. 2007, 10:03
par Maitrepylos
bonjour,

je reviens à la charge.

j'ai tenter ceci :
$pdo->exec("parcivilite,parnom,parprenom,parlieunaissance,pardatenaissance) VALUES ('".$civilite."','".$nom."','".$prenom."','".$LieuNaissance."',$datenaissance)");
Mais cela n'insère rien, mais au moins cela ne me demande pas d'ouvrir un fichier!

Posté : 17 janv. 2007, 10:49
par Ajoloca
Bonjour,

Si tu veux utiliser $pdo->exec() tu dois utiliser $pdo->quote() et c'est à ce moment que ça va planter.

Posté : 17 janv. 2007, 11:15
par Maitrepylos
Bon clairement je ne peux plus utiliser de système d'échappement, la question est Pourquoi?

Quelles sont les possible cause à ce phénomène?