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

Mammouth du PHP | 1029 Messages

16 janv. 2007, 13:08

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
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 1961 Messages

16 janv. 2007, 13:46

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)";
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1029 Messages

16 janv. 2007, 14:21

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
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 1961 Messages

16 janv. 2007, 14:45

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 />';
} 
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1029 Messages

16 janv. 2007, 15:02

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()
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 1961 Messages

16 janv. 2007, 15:07

Re,

Les autres fichiers avec extension .php, sont-ils pris en compte ou bien il te demande de les télécharger aussi ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1029 Messages

16 janv. 2007, 15:14

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 :)
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 1961 Messages

16 janv. 2007, 15:29

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...
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1029 Messages

16 janv. 2007, 15:39

Pas mieux.

je pense que ton premier exemple est bon, il faut juste trouver pourquoi, il ne veut pas interpréter le code!
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 1961 Messages

16 janv. 2007, 15:43

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
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1029 Messages

16 janv. 2007, 16:04

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.
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 1029 Messages

16 janv. 2007, 16:10

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
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 1029 Messages

17 janv. 2007, 10:03

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!
L'expérience est la somme de toutes nos erreurs.

ViPHP
ViPHP | 1961 Messages

17 janv. 2007, 10:49

Bonjour,

Si tu veux utiliser $pdo->exec() tu dois utiliser $pdo->quote() et c'est à ce moment que ça va planter.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1029 Messages

17 janv. 2007, 11:15

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?
L'expérience est la somme de toutes nos erreurs.