IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Echappement d'apostrophe et construction json


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut Echappement d'apostrophe et construction json
    Bonjour,
    Je fais une construction de json à partir d'une reqête MySql.
    le problème c'est que lorsqu'il y a une apostrophe cela bubug, gentiment.

    La solution, est-elle :
    -échapper ces apostrophes à l'insert dans la BD
    - puis un faire string_replace (php) à l'affichage ?

    Ou il y a-t-il un autre moyen ?

    D'ailleurs, le même type de problème apparait avec les doubles côtes.

    Vous remerciant cordialement.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    soit echapper, soit remplacer par ' ...

    ou encore en php selon le retour attendu ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $encodeData = htmlspecialchars(json_encode($yourArr), ENT_QUOTES, 'UTF-8');
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 104
    Par défaut
    On peut aussi tirer parti des options de json_encode :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $encodedData = json_encode($yourArr, JSON_HEX_QUOT | JSON_HEX_APOS);
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Invité
    Invité(e)
    Par défaut
    1-
    Citation Envoyé par SpaceFrog Voir le message
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $encodeData = htmlspecialchars(json_encode($yourArr), ENT_QUOTES, 'UTF-8');
    @SpaceFrog
    Non, ça ne fonctionne pas.

    Il faut appliquer htmlspecialchars AVANT le json_encode :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $encodeData = json_encode( array_map('htmlspecialchars', $yourArr) );

    Et pour décoder (en PHP) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $decodeData = array_map( 'htmlspecialchars_decode', json_decode( $encodeData ) );


    2-
    Citation Envoyé par feelwatt Voir le message
    ...La solution, est-elle :
    - échapper ces apostrophes à l'insert dans la BD
    - puis un faire string_replace (php) à l'affichage ?
    ...
    Non, certainement pas !

    C'est au moment de l'AFFICHAGE qu'on utilise htmlspecialchars() !
    Soit valeur après valeur :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $yourArr_affichage['var1'] = htmlspecialchars( $yourArr['var1'] );
    $yourArr_affichage['var2'] = htmlspecialchars( $yourArr['var2'] );
    ...

    Soit en une fois :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $yourArr_affichage = array_map('htmlspecialchars', $yourArr);

    Du coup, la construction du json devient :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $encodeData = json_encode( $yourArr_affichage );
    Dernière modification par Invité ; 13/02/2019 à 10h04.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Personellement, j'aime bien la solution de Watilin.
    Mais ce qu'il faudrait savoir, c'est là où se trouve le bug : est-ce que c'est lors de l'exploitation du json par le JS ? à l'affichage dans le HTML ? ou dans le PHP au niveau de la récupération des données ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Bonsoir à tous,
    Je passe rapidement, (je regarderai les solutions proposées demain ou vendredi).

    Pour répondre à Célira
    c'est lors de l'exploitation du json par le JS
    La console dit qu'il y a un crochet [ d'ouvert et qu'il manque sa fermeture.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Bonjour,
    Est-ce que la solution de Watilin
    $encodedData = json_encode($yourArr, JSON_HEX_QUOT | JSON_HEX_APOS);
    ne concerne pas que les quotes et apostrophes ?
    > et que d'autres caractères risquent de perturber l'exploitation du json par le JS ?
    Par exemple les retours à la ligne dans les textareas.

    Voici la présentation de ce que j'ai mis en place et qui fonctionne sans utiliser les apostrophe ou double-quotes:
    Il s'agit de changer les infos des inputs et textarea
    lorsque l'on change de user dans une liste.
    > function change_user(id)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <script type="text/javascript"> 
    data_users = <?php echo json_encode($data_users); ?>;
     
    // Remplissage JS
    data_users = { 
    <?php 
    // Boucle php 
    while ($user=$req_user_liste->fetch()) { ?>
    '<?php echo $user["id"]; ?>': 
    	[
    		'<?php echo $user["nom"]; ?>',
    		'<?php echo $user["fixe"]; ?>',
    		'<?php echo $user["portable"]; ?>',
    		'<?php echo $user["mail"]; ?>'
    	],
    	<?php } ?> };
    // console.log(data_users);
     
    // Et la fonction qui permet de changer les valeurs des champs: 
    function change_user(id) 
        { 
          document.getElementById('nom_user').value = data_users[id][0]; 
          document.getElementById('fixe_user').value = data_users[id][1]; 
          document.getElementById('portable_user').value = data_users[id][2];
          document.getElementById('mail_user').value = data_users[id][3]; 
        }
     
    </script>
    Pensez-vous je m'y prenne logiquement ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    • as-tu lu la doc ?
    • as-tu fait des tests ?

    Accessoirement :
    • as-tu lu ce que j'ai écrit ?

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Des tests
    oui, j'en ai fait.
    Notamment, à la construction du json:
    str_replace pour constater que l'apostrophe créer la confusion dans le json:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($user=$req_user_liste->fetch()) { ?>
    '<?php echo $user["id"]; ?>': 
    	[
    		'<?php echo str_replace('\'', '&apos;',$user["nom"]); ?>',
    		'<?php echo str_replace('\'', '&apos;',$user["fixe"]); ?>',
    		'<?php echo str_replace('\'', '&apos;',$user["portable"]); ?>',
    		'<?php echo str_replace('\'', '&apos;',$user["mail"]); ?>',
    	],
    	<?php } ?> };
    htmlspecialchars
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($user=$req_user_liste->fetch()) { ?>
    '<?php echo $user["id"]; ?>': 
    	[
    		'<?php echo htmlspecialchars($user["nom"]); ?>',
    		'<?php echo htmlspecialchars($user["fixe"]); ?>',
    		'<?php echo htmlspecialchars($user["portable"]); ?>',
    		'<?php echo htmlspecialchars($user["mail"]); ?>',
    	],
    	<?php } ?> };
    Après, non je n'ai pas lu toute la doc...
    J'avoue et me repenti.

  10. #10
    Invité
    Invité(e)
    Par défaut
    C'est sûr, si tu ne lis pas ce qu'on t'écrit, et/ou que tu n'en tiens pas compte....

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    A pardon, en disant "je n'ai pas lu toute la doc",
    je disais la doc de json, en aucun cas ce que vous avez écrit tous.
    Pardon pour la confusion.

    Je suis conscient que le code ne se copie-colle pas comme ça et que par magie il va fonctionner.
    Je suis justement entrain d'intégrer (codalement et aussi mentalement) ce que vous avez écrit,
    afin de comprendre comment ca marche.

    Soyez-sur, que je respecte vos réponse et le temps que vous y consacrez.

    C'est vrai que mes réponses, font le gars qui pose un htmlspecialchars par-ci, un str_replace par là.
    Et je suis d'accord, je suis allé un peu vite. Je ne voulais pas non plus être muet sur cette discution que j'ai ouvert.

    Je vais me pencher plus sérieusement sur cette construction json
    afin de la gérer consciemment.

    Excuses.

  12. #12
    Invité
    Invité(e)
    Par défaut
    OK.

    Pourquoi construis-tu une usine à gaz ?
    Tu n'as pas besoin de "construire" "à la main" le json.

    json_encode() est là pour faire le job.
    • Utilise-le !
    • Teste le résultat obtenu !

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Ok !
    Alors si j'ai bien compris
    Php:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Encodage json
       $encodeData = json_encode($_SESSION['users']);
    Puis en js
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data_users = <?php echo $encodeData;?>;
    // console.log(data_users); 
     
    // Et là on récupère la case que l'on veut
    console.log(data_users[3]['adresse']);
    En fait c'est le passage de php à js que je ne captais pas.

    - Je croyais que le json_encode se faisait en js

    Un truc aussi je ne comprend pas: pourquoi dans
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    data_users = <?php echo $encodeData;?>;
    <?php echo $encodeData;?> n'est pas entre simples côtes ?

    ***
    Et pour reprendre ma signature,
    "Il ne savait comment ça fonctionnait, alors ça ne fonctionnait pas"

  14. #14
    Invité
    Invité(e)
    Par défaut
    json_encode() est une fonction PHP. Ne mélange pas les langages...

    Voici un exemple simple :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    	$select_query = "SELECT * FROM ma_table;";
      try {
    	$pdo_select = $pdo->prepare($select_query);
    	$pdo_select->execute();
      } catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
    	// -----------------
    	// on applique htmlspecialchars() sur chaque élément de chaque ligne
    	$row_all = []; // array
    	while( $row = $pdo_select->fetch() )
    	{
    		$row_all[ $row['id'] ] = array_map( 'htmlspecialchars', $row ); // N.B. : on met l' id (auto-incrémenté, donc UNIQUE) en index de l'array
    	}
    //	echo '<pre>'; print_r( $row_all ); echo '</pre>'; // TEST
    	// -----------------
    ?>
    A la suite :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <div id="affichage"></div>
    <script>
    	var row_json = <?php echo json_encode( $row_all ); ?>; // on obtient un objet json
    	console.log( row_json );
     
    	// exemple
    	var id = 1;
    	console.log( row_json[id] ); // TEST
     
    	// affichage
    	var div_affichage = document.getElementById('affichage');
    	div_affichage.innerHTML =  '<b>' + row_json[id]['nom'] + '</b> (' + row_json[id]['mail'] + ')';
    </script>

    Remarque : on peut aussi passer de simples variables ou chaines de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php $chaine_php = "C'est une \"chaine\" !"; ?>
    <script>
    	var chaine_js = <?php echo json_encode( htmlspecialchars($chaine_php) ); ?>; // chaine JS
     
     
    	console.log( chaine_js ); // TEST
    </script>

  15. #15
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Salut,
    Oui, c'est bien plus clair comme ça.
    je confondais les langages.

    Pour info, au début de la connexion utilisateur je créer des array php,
    pour les réutiliser sans re-faire appel à la BD

    Donc dans
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $encodeData = json_encode($_SESSION['users']);
    $_SESSION['users'] est déjà créé.
    Et c'est avec plaisir que j'ai pu le ré-utiliser pour le json_encode.

    Ps:
    J'avais créer une discution là dessus. https://www.developpez.net/forums/d1...intempestives/
    Et une solution de local_storage parait pas mal pour cela.

    Je n'ai pas plus avancé sur ce local_storage,
    à par qqls astuces pour garder des choses affichées (onclick > visible) après un rechargement de page.


    Ce serait possible de combiner le local_storage et le json ?

  16. #16
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 104
    Par défaut
    Citation Envoyé par feelwatt Voir le message
    > et que d'autres caractères risquent de perturber l'exploitation du json par le JS ?
    Par exemple les retours à la ligne dans les textareas.
    Je viens de tester, les caractères « blancs » (sauts de ligne, tabulations, etc.) sont automatiquement transformés par PHP. Par exemple :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php echo json_encode([ "Cette chaîne contient
    un saut de ligne" ]);
    Donne le JSON suivant :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    [ "Cette chaîne contient\nun saut de ligne" ]
    Donc pas de soucis à se faire à ce niveau-là.

    Un truc aussi je ne comprend pas: pourquoi dans
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    data_users = <?php echo $encodeData;?>;
    <?php echo $encodeData;?> n'est pas entre simples côtes ?
    Pour comprendre ça il faut regarder le code généré (raccourci Ctrl+U sous tout navigateur). Un JSON est soit un objet soit un tableau, donc ton PHP peut générer un des deux cas suivants :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unObjetJson = { … }
    // ou
    unObjetJson = [ … ]
    C’est du JS valide.
    Si tu mets des guillemets (simples ou doubles, c’est pareil), ça sera aussi valide mais ça n’aura pas la même signification :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    unObjetPlusTellementJson = " … ";
    Ça fait une simple chaîne. Qui se trouve être du JSON sérialisé, que JS peut dé-sérialiser avec la fonction JSON.parse().

    Citation Envoyé par feelwatt Voir le message
    Ce serait possible de combiner le local_storage et le json ?
    Bien sûr ! Comme le localStorage ne sait stocker que des primitives (nombres, chaînes, booléens), tu ne peux pas lui passer directement du JSON. Mais tu peux sérialiser (= mettre sous forme stockable, en gros) ton JSON avec la fonction JSON.stringify.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  17. #17
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Ok
    Si tu mets des guillemets (simples ou doubles, c’est pareil), ça sera aussi valide mais ça n’aura pas la même signification :
    > Ca devient une chaine de caractères.

    Merci à tous, pour les participations à cette discution,
    ca m'a ben éclairé au niveau json.

    Je la laisse ouvert un petit moment.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. JSON fonction decode echapper " [ {
    Par iamslyper dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 28/12/2011, 03h20
  2. Echapper Apostrophe construction requête
    Par lolymeupy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/08/2011, 09h27
  3. echappement d'apostrophe dans eval
    Par italiasky dans le forum ASP.NET
    Réponses: 2
    Dernier message: 11/08/2010, 13h07
  4. Echapper apostrophe dans string
    Par dubitoph dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 31/12/2009, 17h28
  5. Construction de l'arborescence serveur dans un fichier JSON
    Par hapalemur dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 05/08/2009, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo