it-swarm.com.de

Effiziente Möglichkeit, Variablen aus zu übergeben PHP zu JavaScript

Von Zeit zu Zeit muss ich einige Variablen von PHP an das JS-Skript übergeben ... __ Für jetzt habe ich es so gemacht:

var js-variable = "<?php echo $php-variable; ?>";

Dies ist jedoch sehr hässlich und ich kann mein JS-Skript nicht in der .js-Datei ausblenden, da es von PHP analysiert werden muss. Was ist die beste Lösung, um damit umzugehen? 

23
user606521

Wenn Sie PHP nicht verwenden möchten, um Ihr Javascript zu generieren (und sich nicht um den zusätzlichen Aufruf Ihres Webservers kümmern), verwenden Sie AJAX, um die Daten abzurufen.

Wenn Sie PHP verwenden möchten, codieren Sie vor der Ausgabe immer mit json_encode.

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
35
ilanco

Bitte benutze eine rest/rpc api und gib json an deine js weiter. Dies kann auf folgende Weise geschehen, wenn Sie Jquery verwenden:

rest.php 

<?php echo "{name:biplav}" ?>

Dann machen Sie aus Ihren js einen Anruf wie folgt:

var js_var;
$.get("rest.php", function(data) {
         js_var=data;
});

Das ist das einfachste Beispiel, das mir einfällt.

8
biplav
<?php
// filename: output-json.php
header('content-type:application/json;charset=utf-8');
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));

json_encode ist eine robuste Funktion, die sicherstellt, dass die Ausgabe als gültiges Javascript/json codiert und formatiert wird. Der Inhaltstyp-Header teilt dem Browser mit, wie die Antwort zu interpretieren ist.

Wenn Ihre Antwort wirklich JSON ist, wie zum Beispiel:

{"foo": 5}

Dann deklarieren Sie es als content-type:application/json;charset=utf-8. JSON ist schneller zu analysieren und hat im Vergleich zu Javascript eine viel geringere Wahrscheinlichkeit, dass xss ausgenutzt wird. Aber, wenn Sie echtes Javascript in der Antwort verwenden müssen, wie zum Beispiel:

var obj = {foo: 5};

Dann deklariere es als content-type:text/javascript;charset=utf-8

Sie können wie eine Datei darauf verlinken:

<script src="output-json.php"></script>

Alternativ kann es bequem sein, den Wert direkt in Ihr HTML einzubetten, anstatt eine separate http-Anfrage zu stellen. Mach es so:

<script>
    <?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?>
</script>

Stellen Sie sicher, dass JSON_HEX_TAG verwendet wird, wenn Sie über das <script> -Tag in Ihr HTML einbetten. Andernfalls riskieren Sie Angriffe durch xss-Injektion. Abhängig vom Kontext, in dem Sie es verwenden, müssen Sie möglicherweise auch andere Flags verwenden, um die Sicherheit zu erhöhen: JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS. Diese Flags machen die Antwort für den Menschen weniger lesbar, sind jedoch im Allgemeinen gut für die Sicherheit und Kompatibilität. Daher sollten Sie sie wahrscheinlich nur verwenden.

Ich möchte wirklich betonen, wie wichtig es ist, den Inhaltstyp zu deklarieren und möglicherweise das JSON_HEX_TAG -Flag zu verwenden, da beide dazu beitragen können, die xss-Injection zu verringern.

Tun Sie nicht dies, es sei denn, Sie möchten einen xss-Angriff versuchen:

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
7
goat

Wenn Sie eine Variable direkt in Ihrem JS übergeben müssen, ist Ihre Webanwendung meiner Meinung nach nicht gut gestaltet.

Ich habe also zwei Tipps: * Verwenden Sie JSON-Dateien für allgemeine Konfigurationen wie /js/conf/userprefs.json.

{
    "avatar": "/img/users/123/avatar.jpg",
    "preferred_color": "blue"
    // ...
}
  • oder (besserer Weg) Sie können Ihre Json-Confs mit einem AJAX -Aufruf abrufen.

Mit PHP -Frameworks wie Symfony2 können Sie ein Format in Ihrer Routing-Konfiguration festlegen und die Ausgabe einer Variablen in der Vorlagen-Engine (wie Twig) belassen.

Ich mache ein Beispiel für Symfony2-Benutzer, aber dies kann von jedem Programmierer verwendet werden:

routing.yml

userprefs:
    pattern: /js/confs/userprefs.{_format}
    defaults: { _controller: CoreBundle:JsonPrefs:User, _format: json }
    requirements:
        _format: json
        _method: GET

Innerhalb des Controllers können Sie alle Abfragen ausführen, die Sie zum Abrufen Ihrer Variablen benötigen, und zwar in der Ansicht:

Ressourcen/Ansichten/JsonPrefs/User.json

{
    "avatar": "{{ user.avatar }}",
    "preferred_color": "{{ user.preferred_color }}"
    // ...
}

In Ihrem JS können Sie die JSON jetzt mit einem einfachen AJAX -Aufruf abrufen. __ Zur Leistungssteigerung können Sie die JSONs beispielsweise mit Varnish zwischenspeichern. Auf diese Weise muss Ihr Server nicht jedes Mal eine Abfrage durchführen, wenn Sie die Benutzervorgaben lesen.

3

Wenn Sie Ihre .htaccess-Datei ändern, um sie aufzunehmen

 AddType application/x-httpd-php .js

sie können eine .js -Datei verwenden, die von PHP verarbeitet wird. Dies ist die Hälfte dessen, was Sie benötigen.

In Anbetracht dessen, wie hässlich diese Lösung ist, würde ich sagen, dass dies der am wenigsten hässliche Mechanismus ist. Sie könnten versuchen, Ihr gesamtes JS-Skript durch ein PHP -Skript als String zu übergeben und die Variablen, die Sie einfügen müssen, suchen und ersetzen, aber ich denke, Sie werden zustimmen, dass dies hässlicher ist als die Lösung, die Sie sind derzeit verwendet.

2
Eliot Ball

Legen Sie alle Ihre .js-Dateien in einem Ordner ab und konfigurieren Sie Ihren HTTP-Server so, dass alle Anforderungen an diese Dateien an eine PHP -Datei weitergeleitet werden, die die Dateien lädt und ausgibt.

Nehmen wir an, Sie haben Apache und Ihre .js-Dateien befinden sich in/js:

RewriteRule /js   /getjs.php

getjs.php:

<?php
header('Content-Type: text/javascript');
include_once($_SERVER['SCRIPT_NAME']);
?>
2
MaxArt

Soweit die Ausführung von .js-Dateien durch den PHP -Parser vermieden wird, können Sie wenig tun, außer den Wert von js-variable über einen AJAX - Aufruf abzurufen.

Sie können den Wert auch wie folgt ausgeben:

var js_variable = <?php echo json_encode ($php_variable); ?>

um all den Dingen zu entgehen, die Ihr Javascript brechen würden.

1
wroniasty

Zumindest können Sie einen PHP Shortcode verwenden, um Ihre "hässliche" Lösung etwas sauberer zu machen:

var js-variable = "<?= $php-variable ?>";
0
Kevin