J'ai une variable en PHP et j'ai besoin de sa valeur dans mon code JavaScript. Comment puis-je obtenir ma variable de PHP à JavaScript?
J'ai un code qui ressemble à ceci:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
J'ai du code JavaScript qui a besoin val
et ressemble à:
<script>
myPlugin.start($val); // I tried this, but it didn't work
<?php myPlugin.start($val); ?> // This didn't work either
myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails
</script>
javascript
php
Le fantôme de Madara
la source
la source
myPlugin.start(<?=$val?>
intentionnelle? Est-il vrai que "cela fonctionne parfois"?"42)"
cela fonctionnera bien: DRéponses:
Il existe en fait plusieurs approches pour ce faire. Certains nécessitent plus de frais généraux que d'autres, et certains sont considérés comme meilleurs que d'autres.
Dans aucun ordre particulier:
Dans cet article, nous examinerons chacune des méthodes ci-dessus et verrons les avantages et les inconvénients de chacune, ainsi que la façon de les mettre en œuvre.
1. Utilisez AJAX pour obtenir les données dont vous avez besoin sur le serveur
Cette méthode est considérée comme la meilleure, car vos scripts côté serveur et côté client sont complètement séparés .
Avantages
Les inconvénients
Exemple d'implémentation
Avec AJAX, vous avez besoin de deux pages, l'une est l'endroit où PHP génère la sortie, et la seconde est l'endroit où JavaScript obtient cette sortie:
get-data.php
index.php (ou quel que soit le nom de la page réelle)
La combinaison ci-dessus des deux fichiers avertira
42
lorsque le fichier aura fini de se charger.Encore du matériel de lecture
2. Faites écho aux données quelque part dans la page et utilisez JavaScript pour obtenir les informations du DOM
Cette méthode est moins préférable à AJAX, mais elle a quand même ses avantages. Il est encore relativement séparé entre PHP et JavaScript dans le sens où il n'y a pas de PHP directement dans le JavaScript.
Avantages
Les inconvénients
<input type=hidden>
pour stocker les informations, car il est plus facile d'extraire les informationsinputNode.value
, mais cela signifie que vous avez un élément vide de sens dans votre HTML. HTML a l'<meta>
élément pour les données sur le document, et HTML 5 introduit desdata-*
attributs pour les données spécifiquement pour la lecture avec JavaScript qui peuvent être associés à des éléments particuliers.Exemple d'implémentation
Avec cela, l'idée est de créer une sorte d'élément qui ne sera pas affiché à l'utilisateur, mais visible par JavaScript.
index.php
3. Faites écho des données directement à JavaScript
C'est probablement le plus facile à comprendre.
Avantages
Les inconvénients
Exemple d'implémentation
La mise en œuvre est relativement simple:
Bonne chance!
la source
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Voir cette question pour plus de détails. Solution: UtilisezJSON_HEX_TAG
pour échapper<
et>
(nécessite PHP 5.3.0).Je vais essayer une réponse plus simple:
Explication du problème
Tout d'abord, comprenons le flux d'événements lorsqu'une page est servie à partir de notre serveur:
Donc, vraiment, l'essentiel à retenir ici est que HTTP est sans état . Une fois qu'une requête a quitté le serveur, le serveur ne peut plus la toucher. Donc, cela laisse nos options pour:
Solutions
C'est la question centrale que vous devriez vous poser:
Suis-je en train d'écrire un site Web ou une application?
Les sites Web sont principalement basés sur des pages, et les temps de chargement des pages doivent être aussi rapides que possible (par exemple, Wikipedia). Les applications Web sont plus lourdes AJAX et effectuent de nombreux allers-retours pour obtenir rapidement des informations du client (par exemple - un tableau de bord de stock).
Site Internet
L'envoi de plus de demandes du client une fois la demande initiale terminée est lent car il nécessite plus de demandes HTTP qui ont une surcharge importante. De plus, cela nécessite une asynchronisme car faire une requête AJAX nécessite un gestionnaire pour quand elle est terminée.
Je ne recommanderais pas de faire une autre demande à moins que votre site soit une application pour obtenir ces informations du serveur.
Vous voulez des temps de réponse rapides qui ont un impact énorme sur les temps de conversion et de chargement. Faire des requêtes Ajax est lent pour la disponibilité initiale dans ce cas et inutile.
Vous avez deux façons de résoudre le problème
Définir un cookie n'est vraiment pas très difficile, il vous suffit de lui attribuer une valeur:
Ensuite, vous pouvez le lire avec JavaScript en utilisant
document.cookie
:Voici un analyseur roulé à la main courte, mais la réponse que j'ai liée juste au-dessus de celle-ci en a de mieux testées:
Les cookies sont bons pour un peu de données. C'est ce que font souvent les services de suivi.
Une fois que nous avons plus de données, nous pouvons les encoder avec JSON dans une variable JavaScript à la place:
En supposant que
$value
c'estjson_encode
possible du côté PHP (c'est généralement le cas). Cette technique est ce que fait Stack Overflow avec son chat par exemple (en utilisant uniquement .NET au lieu de PHP).Application
Si vous écrivez une application - tout à coup, le temps de chargement initial n'est pas toujours aussi important que les performances en cours de l'application, et cela commence à payer pour charger les données et le code séparément.
Ma réponse explique ici comment charger des données à l'aide d'AJAX en JavaScript:
Ou avec jQuery:
Maintenant, le serveur a juste besoin de contenir une
/your/url
route / un fichier qui contient du code qui saisit les données et fait quelque chose avec, dans votre cas:De cette façon, notre fichier JavaScript demande les données et les affiche plutôt que de demander du code ou une mise en page. C'est plus propre et commence à porter ses fruits à mesure que l'application augmente. C'est également une meilleure séparation des préoccupations et cela permet de tester le code côté client sans aucune technologie côté serveur impliquée, ce qui est un autre avantage.
Postscript: Vous devez être très conscient des vecteurs d'attaque XSS lorsque vous injectez quoi que ce soit de PHP à JavaScript. Il est très difficile d'échapper correctement aux valeurs et il est sensible au contexte. Si vous ne savez pas comment gérer XSS, ou si vous ne le savez pas - veuillez lire cet article OWASP , celui-ci et cette question .
la source
{}
est un objet JSON valide - voir json.org\u2028
etc. Vous devez lui dire explicitement de ne pas le faire.J'utilise généralement des attributs data- * en HTML.
Cet exemple utilise jQuery, mais il peut être adapté pour une autre bibliothèque ou JavaScript vanilla.
Vous pouvez en savoir plus sur la propriété de l'ensemble de données ici: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
la source
div
c'est bien, mais vous pouvez utiliser n'importe quelle balise que vous aimez; doit être dans lebody
bien.json_encode () nécessite:
$PHPVar
encodé en UTF-8, Unicode.la source
Utilisez simplement l'une des méthodes suivantes.
OU
la source
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
J'aime bien la façon dont WordPress fonctionne avec ses fonctions de mise en file d'attente et de localisation , donc en suivant ce modèle, j'ai écrit une classe simple pour mettre des scripts en page en fonction des dépendances du script et pour rendre des données supplémentaires disponibles pour le script.
L'appel à la
enqueue_script()
fonction est pour ajouter un script, définir la source et les dépendances sur d'autres scripts, et les données supplémentaires nécessaires pour le script.Et, la
print_scripts()
méthode de l'exemple ci-dessus enverra cette sortie:Indépendamment du fait que le script 'jquery' est mis en file d'attente après le 'jquery-ui', il est imprimé avant car il est défini dans 'jquery-ui' qu'il dépend de 'jquery'. Des données supplémentaires pour le «script personnalisé» se trouvent dans un nouveau bloc de script et sont placées devant, il contient un
mydata
objet qui contient des données supplémentaires, désormais disponibles pour le «script personnalisé».la source
Essaye ça:
-
-Après avoir essayé cela pendant un certain temps
Bien que cela fonctionne, il ralentit cependant les performances. Comme PHP est un script côté serveur tandis que JavaScript est un côté utilisateur.
la source
$phpVariable = '42"; alert("I am evil!");';
Cela ne fonctionne pas car il
$val
n'est pas défini en ce qui concerne JavaScript, c'est-à-dire que le code PHP n'a rien sorti pour$val
. Essayez d'afficher la source dans votre navigateur et voici ce que vous verrez:Et
Cela ne fonctionne pas parce que PHP essaiera de traiter
myPlugin
comme une constante et quand cela échouera, il essaiera de la traiter comme la chaîne'myPlugin'
qu'il essaiera de concaténer avec la sortie de la fonction PHPstart()
et puisque cela n'est pas défini, cela produira un fatal Erreur.Et
Bien que cela soit le plus susceptible de fonctionner, puisque le code PHP produit du JavaScript valide avec les arguments attendus, s'il échoue, il est probable que ce
myPlugin
n'est pas encore prêt. Vérifiez votre ordre d'exécution.Vous devez également noter que la sortie du code PHP n'est pas sécurisée et doit être filtrée avec
json_encode()
.ÉDITER
Parce que je n'ai pas remarqué la parenthèse manquante dans
myPlugin.start(<?=$val?>
: - \Comme le souligne @Second Rikudo, pour que cela fonctionne correctement, il
$val
devrait contenir la parenthèse fermante, par exemple:$val="42);"
Cela signifie que le PHP va maintenant produire
myPlugin.start(42);
et fonctionnera comme prévu lorsqu'il est exécuté par le code JavaScript.la source
myPlugin.start(<?=json_encode($val)?>);
Je suis sorti avec une méthode simple pour assigner des variables JavaScript en utilisant PHP.
Il utilise des attributs de données HTML5 pour stocker des variables PHP, puis il est attribué à JavaScript lors du chargement de la page.
Un tutoriel complet peut être trouvé ici .
Exemple:
Voici le code JavaScript
la source
Exemple:
ÉTAPE 1
ÉTAPE 2
la source
En voici une que je ne vois pas affichée en option. C'est similaire à l'utilisation d'Ajax, mais clairement différent.
Tout d'abord, définissez la source d'un script directement sur un fichier PHP.
Vous pouvez même renvoyer une variable au fichier PHP comme cet exemple:
Puis dans "votre_fichier_php.php":
la source
var1=value1
. En l'état, votre script va se casser si les données incluent un'
caractère.var1 != [some HTML code]
... CLAIREMENTvar1=="value1"
. en clair, vous avez tort de ne rien avoir manqué. le script EXAMPLE est complet et, comme vous pouvez le voir, ne génère aucun HTML - et l'OP n'a pas mentionné HTML. il ne mérite pas un downvote par un déclencheur heureux bypasser - rétracter$val
et qui fonctionne parfois et parfois non:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Voici l'astuce:
Voici votre 'PHP' pour utiliser cette variable:
Vous avez maintenant une variable JavaScript appelée
'name'
, et voici votre code JavaScript pour utiliser cette variable:la source
Disons que votre variable est toujours un entier. Dans ce cas, c'est plus simple:
Sortie :
Disons que votre variable n'est pas un entier, mais si vous essayez la méthode ci-dessus, vous obtiendrez quelque chose comme ceci:
Mais en JavaScript, c'est une erreur de syntaxe.
Donc, en PHP, nous avons un appel de fonction
json_encode
qui encode la chaîne en un objet JSON.Étant donné que
abcd
dans JSON"abcd"
, cela ressemble à ceci:Vous pouvez utiliser la même méthode pour les tableaux:
Et votre code JavaScript ressemble à ceci:
Sortie console
la source
Après de nombreuses recherches, j'ai trouvé que la méthode la plus simple est de passer facilement toutes sortes de variables.
Dans le script du serveur, vous avez deux variables et vous essayez de les envoyer aux scripts client:
Dans n'importe quel code JavaScript appelé sur la page, appelez simplement ces variables.
la source
Je suppose que les données à transmettre sont une chaîne.
Comme d'autres commentateurs l'ont déclaré, AJAX est une solution possible, mais les inconvénients l'emportent sur les avantages: il a une latence et il est plus difficile à programmer (il a besoin du code pour récupérer la valeur côté serveur et côté client), quand un plus simple la fonction d'échappement devrait suffire.
Donc, nous sommes de retour à l'évasion.
json_encode($string)
fonctionne si vous codez d'abord la chaîne source en UTF-8 au cas où elle ne le serait pas déjà, carjson_encode
nécessite des données UTF-8. Si la chaîne est en ISO-8859-1, vous pouvez simplement utiliserjson_encode(utf8_encode($string))
; sinon, vous pouvez toujours utilisericonv
pour effectuer la conversion en premier.Mais il y a un gros problème. Si vous l'utilisez dans des événements, vous devez exécuter
htmlspecialchars()
le résultat afin de le rendre correct. Et puis vous devez être prudent d'utiliser des guillemets doubles pour entourer l'événement, ou toujours ajouterENT_QUOTES
à htmlspecialchars. Par exemple:Cependant, vous ne pouvez pas l'utiliser
htmlspecialchars
sur du code JavaScript standard (code entouré de balises<script>
...</script>
). Cela utilise cette fonction sujette aux erreurs, en oublianthtmlspecialchars
le résultat lors de l'écriture du code d'événement.Il est possible d'écrire une fonction qui n'a pas ce problème et peut être utilisée à la fois dans des événements et dans du code JavaScript normal, tant que vous mettez vos événements toujours entre guillemets simples ou toujours entre guillemets doubles. Voici ma proposition, les obligeant à être entre guillemets (que je préfère):
La fonction nécessite PHP 5.4+. Exemple d'utilisation:
la source
Selon votre code
Maintenant, vous pouvez obtenir de la valeur en utilisant DOM, utilisez innerHTML de span id, dans ce cas, vous n'avez pas besoin d'appeler le serveur, ou Ajax ou autre chose.
Votre page l'imprimera en utilisant PHP et votre JavaScript obtiendra de la valeur en utilisant DOM.
la source
<
et>
. De même, des solutions similaires ont déjà été suggérées.la source
PHP
JS (yourexternal.js)
PRODUCTION
la source
Pour ceux qui ont des problèmes à utiliser le code ci-dessous et qui continuent de s'afficher
<?php echo $username?>
ou quelque chose comme ça, allez modifier le httpd.conf dans la section mime_module en ajoutant ce 'AddType application / x-httpd-php .html .htm' car il peut être désactivé par défaut.la source
$username === "hello"
, alors vous avezvar myData = hello;
ce qui se cassera horriblement.Utilisation:
et cela fonctionnera. Il s'agit simplement d'affecter une variable JavaScript, puis de transmettre la valeur d'une variable PHP existante. Puisque PHP écrit les lignes JavaScript ici, il a la valeur de la variable PHP et peut la transmettre directement.
la source