Page 1 sur 1

Erreur UPDATE, 'mysql_real_escape_string' non pris en compte

Posté : 03 nov. 2007, 10:48
par Invité
Bonjour, je m'excuse de vous déranger mais la je bloque....

Une erreur que je n'ai jamais vue....
Je construis une requete Update avec pluqierus variables dedans, pour ne pas avoir de problèeme avec ' et " et d'autres problèmes de sécurité j'utilise la fonction mysql_real_escape_string()...

Lorsque j'affiche ma requete SQL avant de l'executer, tous les caractères "génant" sont échappé, mais une fois stocké dans la bdd, il n'ya plus aucun antislash et donc je me retrouve avec des bugs d'affichage avec du texte tronqué....

J'ai vérifié si les magic quotes étaient activé et ne faisaient pas doublon, mais echo get_magic_quotes_gpc() me renvoie la valeur 0;

J'ai utilisé la fonction addslashes, mais le problème est le même.

J'ai vérifié l'encodage de mes champs dans la bbd, ils sont tous en utf8, et même si je change le problème persiste.

Je me tourne donc vers vous, je ne comprends plus rien..... |*()


oici un extrait de la construction de ma requete :
	$titre = mysql_real_escape_string($titre);
	$auteur = mysql_real_escape_string($auteur);
	$annee = mysql_real_escape_string($annee);
	$in = mysql_real_escape_string($in);
	$edition = mysql_real_escape_string($edition);
	$commentaires = mysql_real_escape_string($commentaires);
	...
	
	
	$sql="UPDATE `table1` SET `titre` = '".$titre."',
							`auteur` = '".$auteur."',
							`annee` = '".$annee."',
							`in` = '".$in."',
							`edition` = '".$edition."',
							`commentaires` = '".$commentaires."',
							`motscle` = '".$motscle."',
			...";

	mysql_run_query($sql);

Posté : 03 nov. 2007, 11:18
par momox
Avec quel outil regardes-tu dans ta bdd ? PhpMyAdmin ?
Si c'est le cas, il t'enleve automatiquement les antislash a l'affichage si je me souviens bien.
Dans ton appli, quelles sont les valeures que tu récuperes de ta bdd avant traitement éventuel ?

Posté : 03 nov. 2007, 11:45
par eru
salut momox

merci de prendre le temps de répondre,

J'utilise en effet phpMyAdmin, cependant lorsque je rajoute les \ manuellement, ceux ci apparaissent dans les champs de la bdd et donc dans l'appli.
Dans ton appli, quelles sont les valeures que tu récuperes de ta bdd avant traitement éventuel ?
Je ne comprends pas ta question.... tu veux savoir quelles valeurs je récupère ou comment je les récupère? (désolé :oops: )[/quote]

Posté : 03 nov. 2007, 12:02
par momox
Voir les valeurs que tu récupéres.
Et aussi éventuellement la fonction qui les traiterait avant affichage dans ton appli ;)
@+

Posté : 03 nov. 2007, 12:15
par eru
okdak voici la fonction qui appelle les valeurs :

Code : Tout sélectionner

$sql="SELECT * FROM table WHERE id=$action;"; $resultsql = mysql_run_query($sql); $result = mysql_fetch_object($resultsql)) ... <input type="text" name="prixachat" style="width:99%" value=\''.stripslashes($result->prixachat).'\'> <input type="text" name="titre" style="width:99%" value=\''.stripslashes($result->titre).'\'> <input type="text" name="annee" style="width:99%" value=\''.stripslashes($result->annee).'\'> ...

et voici la fonction mysql_run_query()

$results = mysql_query($sql,$db) or db_mysql_die();
	return $results;

et enfin l'objet que me renvoie le code

Code : Tout sélectionner

stdClass Object ( [id] => 298 [titre] => Index général de l'oeuvre [in] => [annee] => 19"92 [edition] => B. Allieu [prixachat] => 300 [estimation] => [dateachat] => ...)

Posté : 03 nov. 2007, 12:50
par momox
Peux tu montrer ce que ca donne ensuite a l'affichage ?

Posté : 03 nov. 2007, 12:55
par eru
pas de soucis je te met ce petit screenshot, j'espère que cela convient, le problème est simple, le problème classique je dirais, les phrases sont coupées dans les input text


Image

Posté : 03 nov. 2007, 12:58
par Tracker
Lorsque j'affiche ma requete SQL avant de l'executer, tous les caractères "génant" sont échappé, mais une fois stocké dans la bdd, il n'ya plus aucun antislash et donc je me retrouve avec des bugs d'affichage avec du texte tronqué....
C'est fait pour !! c'est normal que les \ soit absent de la base.
C'est à toi d'utiliser htmlspecialchars(...) lorsque tu convertis des infos en HTML.


Tracker.

Posté : 03 nov. 2007, 13:00
par eru
ok, mais alors dans ce cas là, à quoi sert la fonction mysql_real_escape_string(), n'est elle pas faites pour échapper les caractères potentiellement dangereux?

Posté : 03 nov. 2007, 13:01
par Tracker
ok, mais alors dans ce cas là, à quoi sert la fonction mysql_real_escape_string(), n'est elle pas faites pour échapper les caractères potentiellement dangereux?
Evidemment que si, mais simplement dans le but de ne pas faire bugguer ta requête (injections), mais surement pas pour déformer l'information que tu introduis. Question de logique...


Tracker.

Posté : 03 nov. 2007, 13:01
par momox
J'ai compris d'ou vient le problème ;)
Pour le value, tu utilies des simples quotes (').
Utilises des double quotes et ton problème sera résolu :p ^^

Posté : 03 nov. 2007, 13:04
par eru
bin non j'ai essayer avec des doubles et le problèmes c'est que lorsque j'utilise un double dans un champ le problème est transposé... (je suis désolé ca doit être relou pour vous.....)

C'est pour cela que tu vois un double quote au milieu du champ annee de parution sur le screenshot d'avant, il servait de test. Et s'il n'y a pas d'antislash il est normal que le texte soit tronqué...

Posté : 03 nov. 2007, 13:04
par Tracker
Pour terminer

vire stripslashes(...) de tes input et remplace par:
htmlspecialchars($var, ENT_COMPAT, [encodage])


Tracker.

Posté : 03 nov. 2007, 13:15
par Tracker
Tu n'as pas dû saisir le principe de l'échappement:

Tu as une info à transmettre à un tiers (MySQL, Navigateur, Url ...). Pour que le tiers reçoive l'information "non déformer", le système te fournit des fonctions d'échappement.

Resultat:
Pour envoyer des infos
- à MySQL utilise mysql_real_escape_string(...)
- à un parser html utilise htmlspecialchars(...)
- comme un attribut d'url (ex ?toto=xxx) utilise urlencode(...)
- etc...


Tracker.

Posté : 03 nov. 2007, 13:16
par eru
ok meci beaucoup,
il semblerait que cela marche avec les htmlspecialchar, et en changeant les simple quotes par des doubles

et merci également pour les infos sur l'échappement, effectivement j'étais à la rue. Tuotes mes excuses pour le dérangement,

Je ne peux pas mettre le topic en résolu, le premier message était en invité , mais pour moi il l'est.

Encore merci à tous