Erreur UPDATE, 'mysql_real_escape_string' non pris en compte

Invité
Invité n'ayant pas de compte PHPfrance

03 nov. 2007, 10:48

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);

Mammouth du PHP | 1511 Messages

03 nov. 2007, 11:18

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 ?

eru
Eléphanteau du PHP | 39 Messages

03 nov. 2007, 11:45

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]

Mammouth du PHP | 1511 Messages

03 nov. 2007, 12:02

Voir les valeurs que tu récupéres.
Et aussi éventuellement la fonction qui les traiterait avant affichage dans ton appli ;)
@+

eru
Eléphanteau du PHP | 39 Messages

03 nov. 2007, 12:15

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] => ...)

Mammouth du PHP | 1511 Messages

03 nov. 2007, 12:50

Peux tu montrer ce que ca donne ensuite a l'affichage ?

eru
Eléphanteau du PHP | 39 Messages

03 nov. 2007, 12:55

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

Eléphant du PHP | 443 Messages

03 nov. 2007, 12:58

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.

eru
Eléphanteau du PHP | 39 Messages

03 nov. 2007, 13:00

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?

Eléphant du PHP | 443 Messages

03 nov. 2007, 13:01

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.
Modifié en dernier par Tracker le 03 nov. 2007, 13:02, modifié 1 fois.

Mammouth du PHP | 1511 Messages

03 nov. 2007, 13:01

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 ^^

eru
Eléphanteau du PHP | 39 Messages

03 nov. 2007, 13:04

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é...

Eléphant du PHP | 443 Messages

03 nov. 2007, 13:04

Pour terminer

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


Tracker.

Eléphant du PHP | 443 Messages

03 nov. 2007, 13:15

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.

eru
Eléphanteau du PHP | 39 Messages

03 nov. 2007, 13:16

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