Probleme d'apostrophe sur un UPDATE

Résolu
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009 - 9 févr. 2009 à 14:46
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 3 mars 2009 à 15:29
Bonjour j'ai un problème pour l'update de données d'une base sql via un menu déroulant, l'affichage se fait correctement, la creation de la base aussi sans probleme mais quand j'update il coupe la donnée au niveau du ' ... voilà le code :
Sur la 1ere page avec menu deroulant :
                  <td><?php
                      $sql = @mysql_connect(localhost,root,"");
                      @mysql_select_db("annuaire");
                      $query  = "SELECT libelle FROM services" ;
                      $req = mysql_query($query);
                    if ($num=mysql_num_rows($req) >0)
                    {
                         echo "<select name='serv'><OPTION value='".$result->service."'>".$result->service."</OPTION>";
                         while($row = mysql_fetch_array($req))
                             {
                                 echo "<option value='$row[0]'> $row[0] </OPTION>";
                             }
                         echo "</SELECT>";
                    }?></td>


Sur la 2em page :

$serv = $_POST["serv"];
  $serv=addslashes($serv);
  $sql = "UPDATE users
            SET 
          service = '$serv'
           WHERE id = '$id' " ;


Le code marche tres bien si il n'y a pas d'apostrophe.
Merci de votre aide.
Fabien.

26 réponses

gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
3 mars 2009 à 15:25
J'ai commencé les tests donc comme je te l'ai dit plus haut , le addslash donne "L" comme resultat.
Ensuite j'ai tenté :
echo "<select name='fonc'><OPTION value='".$result->fonction."'>".$result->fonction."</OPTION>";
       while($row = mysql_fetch_array($req))
        {
         echo "<option value="$row[0]"> $row[0] </OPTION>";
        }
       echo "</SELECT>";

--> alleluya ça marche ....

3 pages pour 2 pauvres ' a remplacer en " ....

/me se pend haut et court.

Merci bcp pour ton aide en tout cas , prochainne etape le module de recherche avec tri en fonction des differentes tables ... vous risquez de me revoir prochainnement.

A bientot et merci encore.

Amicalement,
Fabien.


 
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
9 févr. 2009 à 15:09
Bonjour,
Je ne fait pas de PHP donc ma réponse sera théorique dzl

Si une données d'une chaine de caractère d'une requête SQL contiens des apostrophes, alors il faut les doubler.
Par exemple :
"SELECT * FROM ma_table WHERE phrase = 'Ma phrase sans apostrophe' ;" fonctionnera
Alors que :
"SELECT * FROM ma_table WHERE phrase = 'Ma phrase avec cette saleté d ' apostrophe' ;" ne fonctionnera pas
Il faut le doubler :
"SELECT * FROM ma_table WHERE phrase = 'Ma phrase avec cette saleté d''apostrophe' ;" fonctionne (et la base n'écrira d'un seul apostrophe dans les données, pour écrire 2 apostrophe dans ta base il en faut 4 dans la requête ainci de suite)

Perso quand j'insère des chaines de carac dans mes requêtes je fait toujours (même quand c'est inutile)
(Code VB)
 replace(ValeurText,"'","''")

Voila en éspérant répondre à ta question

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
9 févr. 2009 à 17:10
Salut Polack77 et merci de ton interet,
Le probleme est que dans le cas de la creation et de la modification de la table je n'ai pas de probleme car j'utilise addslashes($valeur), j'en ai uniquement dans le cas present : le menu deroulant et les apostrophes .
J'ai tenté de rajouter un addslashes dans la boucle du menu et il me sors ça en valeur :
texte avant \
Pour faire plus simple un exemple , si la valeur est : "D'information" sur l'affichage du menu il me met bien "D'information" mais quand je passe a l'update il me met : "D"
Et si je ne met pas le addslashes dans la boucle il me met juste le "D" dans la table.

Help
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
9 févr. 2009 à 17:37
Juste de D dans la table sa me parait normal (la marque de fin de chaine étant le ' en SQL, encore que perso je reçois une erreur dans ce cas )

Par contre que le SGBD inscrive D\ dans la table c'est plus étrange (heeee la chaine ne contiens que D\ ??? Dans ce cas vérifie
magic_quotes_sybase, source :ici)

Ce qui m'étonne le plus c'est que tu ne rencontre pas de plantage à l'execution de cette requete à tu désactivé le retour des erreurs ?

Si non au lieu de faire un addslashes essai de remplacé l'apostrophe par deux apostrophes en debug juste pour voire ce qui se passe (soit "D''information")

Bon courage et bonne prog
 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
9 févr. 2009 à 17:42
mysql_real_escape_string tu connais ?
Il semblerais que sa soit plus efficace que addslashes dans le cas de MySQL
Source ici
Recherche Google <mysql apostrophe> 1ér réponse
Google est ton amis

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
20 févr. 2009 à 16:19
Salut, excuse moi pour le temps de réponse j'étais en voyage ^^
Alors pour commencer google est mon meilleur amis et je ne me permettrais pas de poster ici sans avoir passer 2jours minimum a éplucher google :)
J'ai déjà tenté mysql_real_escape_string et ça n'a pas marche non plus.
Mon problème n'est pas général , les créations et modification par champs de texte fonctionne, c'est les modification par menu déroulant qui pètent un câble et me vire ce qu'il y a après l'apostrophe.
Sinon magic quotes est a 0 .
Need help , merci :(
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 févr. 2009 à 16:44
Bonjour,
2 jours !?!? (moi c'est plutôt une demi journée , voir 2 heures )
(Ton voilage c'est bien passé j'espère )

Comme je l'es dit plus haut je ne connais pas bien le PHP (mais le SQL oui )

A tu la possibilité d'extraire de ton programme les requêtes réellement envoilé à la base (Si oui peut tu les posté ici ? Sa serais l'idéale pour trouvé la source de ton problème je pense) ? Avec un message box au lieu de la fonction d'exécution de la requête par exemple .
A tu testé le "doublage" des apostrophes (soit une donnée de ce style : "D''information", moi je fait tout le temps comme sa et je n'est jamais de problème, néanmoins ta requête devrais fonctionné avec un "\'" vue qu'il semblerais que c'est la façon de faire pour MySQL source)?
Peut tu récup le code de retour de la fonction d'exécution de requête (à tu désactivé les erreurs ou peut être à tu besoin d'une fonction du genre de GetLastError (API windows)) ?
Ce qui m'étonne le plus c'est justement que tu n'est pas de code d'erreur en retour

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 févr. 2009 à 16:48
J'y pense :
Ta chaine ne passerais pas deux fois dans la fonction mysql_real_escape_string car si oui la requête exécuté serais alors : "D\\\'information" (même si dans ce cas tu devrais avoir dans ta base "D\'information") ???
Tu problème est tres étrange (je trouve) en tout cas ???

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
20 févr. 2009 à 16:50
Avec un mysqltop je dois la voir passer oui je tenterais ça lundi, je n'ai pas acces a mon serveur d'ici , il va faloir attendre que je rentre au taf :)
Merci en tout cas de ton aide.
Le plus bizare en fait c'est que meme l'affichage de la requete marche bien, on dirait que le select du menu deroulant me coupe la valeur avec ou sans les \
A lundi ;)
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 févr. 2009 à 16:51
Puffffff décidément c'est la journée des oublies
Quel est le type de ta donnée en base ?
Y à t'il un cast à un moment ou un autre ?
Si oui retire le (ou modifi le). Si non ajoute en un

Bonne prog et bon week-end (dans 45 min pour moi )

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
20 févr. 2009 à 16:54
La table est en varchar, et je ne sais pas ce qu'est un 'cast'
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 févr. 2009 à 17:23
Un cast est un changement de type. exemple :
TO_CHAR
(oui c'est vrais que ce mot est plutôt employé en C/C++ )

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 févr. 2009 à 17:25
Heeee au faite TO_CHAR c'est pour oracle
Pour MySQL utilise CHAR (source)
Bon week-end et à lundi

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 mars 2009 à 10:51
Salut
Heeee où en est ton problème ?
Comment l'à tu résolu ?

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
2 mars 2009 à 12:19
Salut Polack dsl j'etais malade la semaine derniere du coup j'ai pas pu te repondre, je suis rentré ce matin :)
Je n'ai pas compris le principe du char et surtout ou tu veux que je teste ceci ?


Au passage, j'ai pu tester deux trois truk ce matin et c'est uniquement si je fais un menu deroulant que l'update foire , le reste marche.
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 mars 2009 à 14:21
Uniquement dans le menu déroulant ????
Il serais peut être utile que tu affiche la requête juste avant l'envoie à ta base ????

Ce que j'entendais par CHAR :
Exemple :
select * from ma_table WHERE phrase = CHAR('Ma phrase avec cette saleté d\' apostrophe')
Ou
select * from ma_table WHERE CHAR(phrase) = CHAR('Ma phrase avec cette saleté d\'apostrophe')
Ou encore
select * from ma_table WHERE CHAR(phrase) = 'Ma phrase avec cette saleté d\'apostrophe'

Mais en théorie ces 3 requêtes devrais faire exactement la même chose que :
select * from ma_table WHERE phrase = 'Ma phrase avec cette saleté d\'apostrophe'

Affiche (voir mieux de sauvegarde dans un fichier TEXTE) les requêtes juste avant l'envoie en base (soit une fois le addslashes exécuté).

Si non active les "traces" (comment faire [ici ici]) ainsi tu pourras analysé ce qui est réellement reçu par ta base de données.

J'avoue que à part sa je ne sait plus trop quoi te faire testé là .

Je pense que tu devrais pouvoir trouvé la source de l'erreur avec les traces.

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
gorc Messages postés 16 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 3 mars 2009
2 mars 2009 à 15:31
Bha j'ai deja fait tout ça , ma base reçoit que ce qui se trouve avant l'apostrophe...
Voila comment se deroule le truk :
1 - Affichange du contenu de la base avec apostrophe dans le menu deroulant --> oki pas de soucis
2 - Selection par l'utilisateur du choix avec apostrophe --> ok, il selectionne bien dans le menu l'option avec apostrophe
3 - Envoi du contenu du menu deroulant a la page suivant pour update --> CARASTROPHE !! il coupe tout ce qu'il y a apres l'apostrophe ...

Voilà exactement mon probleme , on dirait qu'il n'arrive pas a prendre l'apostrophe dans l'option, j'ai tenté de mettre des addslashes au niveau du menu deroulant et là plus etrange encore, il me sors :
Pour la phrase "D'apostrophe"
Resultat : "D"

Honetement je suis en train de m'arracher les cheveux ....
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
3 mars 2009 à 11:34
Dzl du temps mit à répondre je n'avais pas vue ta réponse hier
Ne t'arrache pas les cheveux (si tout les développeur fessais sa les coiffeurs aurais qq problèmes )

Sa ne serais pas au moment de la construction de ta requête que se trouve le bug ?
Je veut dire avant l'addslashes ?
Que te retourne $_POST["serv"] ?

J'avoue que je ne sait plus quoi te conseillé .

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
3 mars 2009 à 11:44
Il semble que $_post retourne des chaines déjà échappé (heee c'est vraiment comme sa qu'on dit ???) donc pas d'addslashes nécessaire.





Les apostrophes magiques.




Vous l'aurez compris, le problème d'échappement est le plus souvent
lié à la saisie de données. Sur cette constatation, les développeurs de
PHP ont inventé les "apostrophes magiques". Sous cette appellation
ésotérique, se cache en fait un principe très simple : toutes les
données contenues dans les tableaux
$_GET
,
$_POST
et
$_COOKIE
sont échappées avant d'être transmises au script.




Source



Quand je cherche $_post sur google je trouve toujours des syntaxe de la forme $_post('NomChamp') (exemple) sa ne pourais pas être sa symplement ???? Toi tu à $_post("NomChamp").

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
3 mars 2009 à 12:05
Néanmoins ne t'en fait pas trop quand même, l'aire de rien on avance (même si ce n'est pas rapide je suis bien d'accord).
On est maintenant sur que la données est perdu avant l'envoie en base (vue que tu à vérif les trace et que ces carac sont absent des requêtes à la réception en base). C'est donc la création de la requête qui bug.

Soit ces qq ligne :
$serv = $_POST["serv"];
  $serv=addslashes($serv);        <- Sachant que cette ligne semble inutile il ne reste pas beaucoup de choix
  $sql = "UPDATE users
            SET
          service = '$serv'
           WHERE id = '$id' " ;

$id et $serv sont des variables remplacer par ton objet de connection (comme en VB.NET ?) ou non ?
Si non je vérais peut être un truc dans le genre :
$sql = "UPDATE users

            SET

          service = '".$serv."'

           WHERE id = '".$id."' " ;

De plus si les apostrophes sont présent dans le ComboBox donc c'est la récup ou la construction qui bug.
En PHP comment se termine les chaines de carac (par un caractère 0 comme en C ? Si oui regarde autour de sa, j'ai déjà rencontré le bug : Un carac à 0 dans une chaine que je voulais transmettre et du coup l'OleDb considérais sa comme une marque de fin de chaine, donc la fin de ma requête, ce bug avais été long à comprendre l'aire de rien , ce carac à 0 n'avais RIEN à faire là , je ne pense pas que sa soit ton cas si non tu aurais un retour d'erreur, c'étais juste pour la pitite histoire ).

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Rejoignez-nous