web-dev-qa-db-fra.com

Qui passe PHP JSON à Javascript: echo json_encode vs déclaration echo json

J'essaie de créer un fichier de constantes commun à partager entre php et javascript, en utilisant JSON pour stocker les constantes. Mais je me demande pourquoi passer le code JSON de PHP à javascript à l'aide de json_encode() sur l'écho de la déclaration json.

Disons que j'ai le JSON PHP 

<?php 

$json_obj = '{"const1": "val",
            "const2": "val2"             
                            }';

?>

Googler, il semble que la façon typique de revenir à javascript utilise

<?php echo json_encode($json_obj); ?>

Ensuite, je crois que je devrais utiliser quelque chose comme $.getScript() pour lire le fichier php afin d’obtenir $json_obj, puis utiliser parseJSON() pour le rendre utilisable en javascript.

Mais pourquoi pas à la place 

<?php  echo 'var json = '.$json_obj; ?>

De cette façon, tout ce que vous avez à faire est de charger le script directement et vous avez le JSON prêt à être utilisé directement.

Existe-t-il une raison particulière pour laquelle il est plus favorable d'utiliser json_encode() que de simplement renvoyer la déclaration à javascript? 

9
roverred

Dans votre cas, $json_obj est déjà une chaîne. Donc ce n'est pas nécessaire. Mais si vous avez un tableau que vous souhaitez transmettre à javascript json_encode, cela vous aidera.

7
Tobias Golbs

Tout dépend de ce que vous voulez envoyer du serveur au client - que ce soit une donnée (JSON) ou un code.

Deux approches:

  1. Écho d'un fichier JSON sur un serveur - vous imprimez votre document JSON et définissez la réponse Content-Type sur application/json. De cette façon, vous pouvez utiliser n’importe quelle bibliothèque AJAX de votre choix, telle que $.get ou raw XMLHttpRequest etc. C'est un moyen de transmettre des données.

  2. Écho un code Javascript sur un serveur, puis utilisez $.getScript pour le charger. C'est une façon de passer du code. Ceci est potentiellement moins sécurisé, car votre code peut contenir non seulement JSON, mais également tout code arbitraire. Donc, si l'attaquant peut compromettre votre serveur, il pourra peut-être envoyer du code à n'importe quel client pour une exécution à distance.

Si vous souhaitez ne transmettre que des données, optez pour la première approche. C'est plus propre et plus sûr. 

De plus, si vous finissez par écrire frontend dans un environnement différent, par exemple un langage de programmation différent, vous serez en mesure de réutiliser le même point de terminaison renvoyant JSON. Ce sera plus difficile si vous retournez du code Javascript.

5
kamituel

Passage de PHP JSON en Javascript et lecture
var stuff = <?php print json_encode($datajson); ?>; var arr = new Array(); arr= JSON.parse(stuff); document.write((arr[0].cust_code );

2
Kashinath Patil

Même si cela peut sembler excessif pour votre problème particulier, je choisirais toujours l'option json_encode/parse. Pourquoi? tu demandes. Eh bien, considérez cela comme un moyen d'éviter les doubles emplois. Si vous encodez/analysez vous pouvez garder les constantes dans un objet facilement lisible par votre code PHP. Et la même chose pour votre code JS.

Cela élimine simplement le besoin de le tripoter.

1
Luc

L'argument de json_encode() doit être une structure de données PHP, et non une chaîne déjà au format JSON. Vous l'utilisez lorsque vous voulez transmettre un objet PHP à Javascript.

0
Barmar

json_encode est une fonction qui convertit un tableau PHP en chaîne JSON, et rien de plus. Étant donné que votre variable $json_obj est déjà une chaîne JSON, aucune conversion supplémentaire n'est nécessaire et vous pouvez simplement la renvoyer en écho.

Pour obtenir votre chaîne $json_obj à partir d'un tableau, votre code aurait ressemblé à ceci

$json_array = array(
    "const1" => "val",
    "const2" => "val2"
);

$json_obj = json_encode($json_array);
0
SixteenStudio

D'habitude c'est ce que je fais, le moyen le plus sûr que j'ai trouvé:

// holds variables from PHP
var stuff = {};
try {
    // stuff will always be an object
    stuff = JSON.parse('<?php echo empty($stuff) ? '{}' : json_encode($stuff) ?>');
} catch (e) {
    if (e instanceof SyntaxError)
    {
        // report syntax error
        console.error("Cannot parse JSON", e);
    }
}
// show resulting object in console
console.log("stuff:", stuff);
0
3k-

constant.php

<?php
$array = array("const1" => "val", "const2" => "val2");
?>
<script>
var contants = <?php echo json_encode($array); ?>
</script>

FIN DU FICHIER ========================= constant=php

En php, vous pouvez accéder en utilisant 

$array["<key>"]

En javascript, vous pouvez accéder en utilisant 

contants.const1, ....
0
RAVI MONE

Vous utilisez json_encode si vous utilisez un tableau php et non une chaîne:

$array = array("const1" => "val", "const2" => "val2");

echo json_encode($array);

si vous appelez json_encode sur une chaîne, vous obtiendrez:

"{\"const1\": \"val\", \"const2\": \"val2\"}"
0
jcubic