Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/04/2006, 16h55   #1
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Par défaut [Conception] Echappement de caractères

Bonjour,

Petit problème avec stripslashes et addslashes.

Mon objectif est d'afficher un formulaire avec un champ de texte contenant une chaîne de caractères issue d'une base de données, afin de permettre à l'utilisateur de modifier cette chaîne pour mettre à jour ce champ dans la base de données.

Pour cela dans le code j'utilise :
Code :
<input type='text' name='texte' value="".stripslashes($variable)."">
Puis un peu plus loin je lance ma requête de mise à jour:
Code :
1
2
3
4
$post_texte = addslashes($_POST['texte']);
 
$sql_update = "UPDATE table SET var = '".$post_texte."' WHERE ...";
$req_update = mysql_query($sql_update) or die('Erreur SQL : <br />'.$sql_update);
Le problème c'est que dans le champ de texte du formulaire s'il y a une double cote, la chaîne de caractère s'arrête à celle-ci, bien que la chaine dans la base soit complète.

Exemple : Soit la chaine suivante:
Test de la chaine "chaine"

Dans la base de données, celle-ci est bien sous la forme:
Test de la chaine \"chaine\"

Mais dans le champ de texte il s'affiche:
Test de la chaine

Je précise que tout fonctionne bien avec les simples cotes.
Quelqu'un peut-il me dire comment faire pour prendre en compte les doubles cotes?

Merci.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 01h22   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Normalement dans ta base de données tu devrais avoir "chaine" et pas \"chaine\". En fait tu appliques deux fois addslashes de suite ce qui fait que tes données sont doublement échappées. (une fois à cause de magic_quotes_gpc=on et une fois avec addslashes)

Ensuite, pour afficher dans un input, généralement je fais un
Code :
htmlentities($valeur, ENT_QUOTES)
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 01h42   #3
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

En effet, le problème se situe à l'affichage : je présume que les guillemets de ta chaîne entrent en conflit avec les guilllemets qui délimitent la propriété "value" de ton <input type="text">.

Au passage : jette un oeil sur mysql_real_escape_string() et ici :
http://shiflett.org/archive/184


[Edit]
@Mr N. : Si si, il doit bel et bien avoir \"chaîne\" dans le champ de son tuple. Non, il n'applique pas 2 fois addslashes() mais bien une seule fois.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 03h38   #4
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Comment tu sais que addslashes n'a pas été appliqué deux fois ? Tu connais sa config ? Je parie qu'il a magic_quote_gpc = on donc addslashes + addslashes = 2 addslashes

Et dans une base de données on ne se trimbale pas des caractères d'échappement qui servent seulement à construire une requête donc on ne doit pas avoir \" ou \' une fois les données dans la base.

Donc le problème se situe à l"affichage *et* au stockage
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 10h40   #5
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Oui, bon j'étais pas en forme. Certes, je ne connais pas sa config.

Cela dit, il me semble que stripslashes() intervient systématiquement pour une raison simple : les antislashes sont bel et bien enregistrés dans la BDD.

nicoaix n'a pas de \\\" dans sa base, c'est ce qui me fait dire qu'il n'a pas les magic quotes à ON.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 13h33   #6
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Code :
1
2
3
4
5
je tape "chaine"                                                  ===> "chaine"
magic_quotes_gpc                                                  ===> \"chaine\"
addslashes                                                        ===> \\\"chaine\\\"
construction de "UPDATE ... SET var = '\\\"chaine\\\"' WHERE ..." ===> UPDATE ... SET var = '\"chaine\"' WHERE ...
dans la db                                                        ===> \"chaine\"
C'est plus clair là :
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2006, 19h32   #7
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Hmmm, après tests, oui.

Code :
1
2
3
4
5
CREATE TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL default '',
  PRIMARY KEY  (`id`)
)
Citation:
<?php

mysql_connect
('localhost', 'root', '');
mysql_select_db('test');

$sql = 'INSERT INTO `test` (`name`) VALUES ("\'bouh\'")';

mysql_query($sql)
   or die(
mysql_error());

$sql = 'SELECT `id`, `name` FROM `test` ORDER BY `id` DESC LIMIT 1';
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);

echo
$row['id'].' : '.htmlentities($row['name']);

?>
Colorez votre code PHP sur les forums grâce à Developpez.com
=> 'bouh'

Code :
'INSERT INTO `test` (`name`) VALUES ("\\\'bouh\\\'")'
=> 'bouh'

Code :
'INSERT INTO `test` (`name`) VALUES ("\\\\\'bouh\\\\\'")'
=> \'bouh\'

Code :
"INSERT INTO `test` (`name`) VALUES ('\'bouh\'')"
=> 'bouh'

Code :
"INSERT INTO `test` (`name`) VALUES ("\\\'bouh\\\'")"
=> SQL syntax error

Code :
"INSERT INTO `test` (`name`) VALUES ("\\\\\'bouh\\\\\'")"
=> \'bouh\'
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h03.


 
 
 
 
Partenaires

Hébergement Web