788 Stimmen

Wie übergebe ich Variablen und Daten von PHP an JavaScript?

Ich habe eine Variable in PHP und brauche ihren Wert in meinem JavaScript-Code. Wie kann ich meine Variable von PHP nach JavaScript übergeben?

Ich habe folgenden Code:

getValue(); // Führt einen API- und Datenbankaufruf durch

Auf derselben Seite habe ich JavaScript-Code, der den Wert der $val-Variable als Parameter benötigt:

    myPlugin.start($val); // Ich habe das versucht, aber es hat nicht funktioniert
    <?php myPlugin.start($val); ?> // Das hat auch nicht funktioniert
    myPlugin.start(<?=$val?>); // Das funktioniert manchmal, aber manchmal scheitert es

1050voto

Madara's Ghost Punkte 165354

Es gibt tatsächlich mehrere Möglichkeiten, dies zu tun. Einige erfordern mehr Overhead als andere, und einige gelten als besser als andere.

In keiner bestimmten Reihenfolge:

  1. Verwenden Sie AJAX, um die benötigten Daten vom Server zu erhalten.
  2. Geben Sie die Daten irgendwo auf der Seite aus und verwenden Sie JavaScript, um die Informationen aus dem DOM zu erhalten.
  3. Geben Sie die Daten direkt an JavaScript aus.

In diesem Beitrag werden wir jede der obigen Methoden untersuchen und Vor- und Nachteile sowie deren Implementierung sehen.

1. Verwenden Sie AJAX, um die benötigten Daten vom Server zu erhalten

Diese Methode gilt als die beste, weil Ihre Server- und Client-Seiten-Skripte vollständig getrennt sind.

Vorteile

  • Bessere Trennung zwischen Schichten - Wenn Sie morgen aufhören, PHP zu verwenden, und zu einem Servlet, einer REST-API oder einem anderen Dienst wechseln möchten, müssen Sie nicht viel des JavaScript-Codes ändern.
  • Lesbarer - JavaScript ist JavaScript, PHP ist PHP. Ohne die beiden zu vermischen, erhalten Sie auf beiden Sprachen einen lesbareren Code.
  • Ermöglicht asynchronen Datentransfer - Das Abrufen von Informationen aus PHP kann zeit-/ressourcenaufwändig sein. Manchmal möchten Sie einfach nicht auf die Informationen warten, laden die Seite und lassen die Informationen irgendwann eintreffen.
  • Daten sind nicht direkt im Markup zu finden - Dies bedeutet, dass Ihr Markup sauber von zusätzlichen Daten gehalten wird und nur von JavaScript gesehen wird.

Nachteile

  • Latenz - AJAX erzeugt eine HTTP-Anfrage, und HTTP-Anfragen werden über Netzwerke übertragen und haben Netzwerklatenzen.
  • Zustand - Daten, die über eine separate HTTP-Anfrage abgerufen wurden, enthalten keine Informationen aus der HTTP-Anfrage, die das HTML-Dokument abgerufen hat. Sie benötigen möglicherweise diese Informationen (z.B., wenn das HTML-Dokument als Reaktion auf einen Formularversand generiert wird) und müssen sie irgendwie übertragen. Wenn Sie das Einbetten der Daten in die Seite ausgeschlossen haben (was Sie tun, wenn Sie diese Technik verwenden), sind Sie auf Cookies/Sitzungen beschränkt, die möglicherweise Rennbedingungen unterliegen.

Implementierungsbeispiel

Mit AJAX benötigen Sie zwei Seiten, eine, in der PHP die Ausgabe generiert, und die zweite, in der JavaScript diese Ausgabe erhält:

get-data.php

/* Führen Sie hier eine Operation aus, wie eine Datenbankabfrage, die Dateisitzung
 * die Welt jenseits, Limbo, die Stadt der Schimmer und Kanada.
 *
 * AJAX verwendet normalerweise Zeichenketten, aber Sie können auch JSON, HTML und XML ausgeben.
 * Es hängt alles vom Content-Type-Header ab, den Sie mit Ihrem AJAX senden
 * Anfrage. */

echo json_encode(42); // Am Ende müssen Sie das Ergebnis 'echo'-en.
                      // Alle Daten sollten mit 'json_encode' codiert sein.

                      // Sie können in PHP jeden Wert 'json_encode', Arrays, Zeichenfolgen,
                      // auch Objekte.

index.php (oder wie auch immer die tatsächliche Seite benannt ist)

    fetch("get-data.php")
        .then((response) => {
            if(!response.ok){ // Vor dem Parsen (d.h. Dekodieren) der JSON-Daten
                              // prüfen Sie auf Fehler.
                // Bei einem Fehler, abbrechen.
                throw new Error("Etwas ist schiefgelaufen!");
            }

            return response.json(); // Die JSON-Daten parsen.
        })
        .then((data) => {
             // Hier wird festgelegt, was mit der Antwort zu tun ist.
             alert(data); // Wird: 42 alerten
        })
        .catch((error) => {
             // Hier werden Fehler behandelt.
        });

Die obige Kombination der beiden Dateien wird 42 alerten, wenn die Datei fertig geladen ist.

Weitere Lektüre

2. Geben Sie die Daten irgendwo auf der Seite aus und verwenden Sie JavaScript, um die Informationen aus dem DOM zu erhalten

Diese Methode ist weniger bevorzugt als AJAX, hat aber immer noch ihre Vorteile. Es ist immer noch relativ getrennt zwischen PHP und JavaScript in dem Sinne, dass kein PHP direkt im JavaScript enthalten ist.

Vorteile

  • Schnell - DOM-Operationen sind oft schnell, und Sie können relativ schnell viele Daten speichern und abrufen.

Nachteile

  • Eventuell unspezifische Markup - Normalerweise verwenden Sie eine Art von , um die Informationen zu speichern, da es einfacher ist, die Informationen aus inputNode.value zu erhalten, aber wenn Sie das tun, haben Sie ein bedeutungsloses Element in Ihrem HTML. HTML hat das -Element für Informationen über das Dokument, und HTML 5 führt data-*-Attribute für Daten ein, die speziell zum Lesen mit JavaScript verwendet werden können und mit bestimmten Elementen verbunden sein können.
  • Verunreinigt die Quelle - Daten, die PHP generiert, werden direkt in die HTML-Quelle ausgegeben, was bedeutet, dass Sie eine größere und weniger fokussierte HTML-Quelle erhalten.
  • Schwerer strukturierte Daten zu erhalten - Strukturierte Daten müssen gültiges HTML sein, andernfalls müssen Sie Zeichenfolgen selbst escapen und konvertieren.
  • Bindet PHP eng an Ihre Datenlogik - Da PHP in der Präsentation verwendet wird, können Sie die beiden nicht sauber trennen.

Implementierungsbeispiel

Bei dieser Methode besteht die Idee darin, ein Element zu erstellen, das dem Benutzer nicht angezeigt wird, aber für JavaScript sichtbar ist.

index.php

    var div = document.getElementById("dom-target");
    var myData = div.textContent;

3. Geben Sie die Daten direkt an JavaScript aus

Dies ist wahrscheinlich am einfachsten zu verstehen.

Vorteile

  • Sehr einfach implementiert - Es erfordert sehr wenig, um dies zu implementieren und zu verstehen.
  • Verunreinigt die Quelle nicht - Variablen werden direkt an JavaScript ausgegeben, sodass der DOM nicht beeinträchtigt wird.

Nachteile

  • Bindet PHP eng an Ihre Datenlogik - Da PHP in der Präsentation verwendet wird, können Sie die beiden nicht sauber trennen.

Implementierungsbeispiel

Die Implementierung ist relativ einfach:

    var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Vergessen Sie nicht das zusätzliche Semikolon!

Viel Erfolg!

115voto

Hayley Punkte 2567

Ich verwende normalerweise data-* Attribute in HTML.

    $(document).ready(function() {
        $('.service-container').each(function() {
            var container = $(this);
            var service = container.data('service');

            // Var "service" contains now the value of $myService->getValue();
        });
    });

Dieses Beispiel verwendet jQuery, kann aber für eine andere Bibliothek oder Vanilla JavaScript angepasst werden.

Weitere Informationen zum dataset-Attribut finden Sie hier: https://developer.mozilla.org/de/docs/Web/API/HTMLElement.dataset

101voto

Benjamin Gruenbaum Punkte 259076

Ich werde versuchen, eine einfachere Antwort zu geben:

Erklärung des Problems

Zunächst einmal verstehen wir den Ablauf der Ereignisse, wenn eine Seite von unserem Server bereitgestellt wird:

  • Zunächst wird PHP ausgeführt, es generiert das HTML, das an den Client übermittelt wird.
  • Dann "endet" PHP (d. h. es läuft buchstäblich nicht mehr), wenn dieses HTML an den Client geliefert wird. Ich möchte betonen, dass PHP, sobald der Code den Server verlässt, aufgehört hat, Teil des Seitenladevorgangs zu sein, und der Server keinen Zugriff mehr darauf hat.
  • Dann, wenn das HTML mit JavaScript den Client erreicht, kann dieser das JavaScript auf diesem HTML ausführen, vorausgesetzt, es handelt sich um gültiges Javascript.

Also das wirklich Wichtige hier zu merken ist, dass HTTP zustandslos ist. Sobald eine Anfrage den Server verlassen hat, kann der Server nicht mehr darauf zugreifen. Das lässt uns also folgende Optionen:

  1. Mehr Anfragen vom Client nach der ersten Anfrage senden.
  2. Die Informationen, die der Server zu übermitteln hatte, in der ersten Anfrage codieren.

Lösungen

Die Kernfrage, die du dir hier stellen solltest, ist:

Schreibe ich eine Website oder eine Anwendung?

Websites sind hauptsächlich seitenbasiert, und die Ladezeiten müssen so schnell wie möglich sein (zum Beispiel – Wikipedia). Webanwendungen sind stärker auf AJAX ausgerichtet und führen viele Abfragen durch, um schnell Informationen für den Client zu erhalten (zum Beispiel – ein Aktiendashboard).

Website

Mehr Anfragen vom Client nach der ersten Anfrage zu senden ist langsam, da es mehr HTTP-Anfragen erfordert, die einen erheblichen Overhead haben. Außerdem erfordert es Asynchronizität, da das Senden einer AJAX-Anfrage einen Handler erfordert, wenn sie abgeschlossen ist.

Ich würde empfehlen, _keine weitere Anfrage zu stellen _es sei denn, deine Seite ist eine Anwendung__, um diese Informationen vom Server zu erhalten.

Du möchtest schnelle Reaktionszeiten, die einen großen Einfluss auf die Konversion und die Ladezeiten haben. Das Senden von AJAX-Anfragen ist in diesem Fall langsam bei der ersten Uptime und unnötig.

Du hast zwei Möglichkeiten, das Problem anzugehen

  • Setze ein Cookie – Cookies sind Header, die in HTTP-Anfragen gesendet werden und von Server und Client gelesen werden können.
  • Codierte die Variable als JSON - JSON ähnelt sehr JavaScript-Objekten und die meisten JSON-Objekte sind gültige JavaScript-Variablen.

Das Setzen eines Cookies ist wirklich nicht sehr schwer, du weist ihm einfach einen Wert zu:

setcookie("MyCookie", $wert); // Setzt das Cookie auf den Wert, denke daran, setze es nicht auf HTTP Only auf true.

Dann kannst du es mit JavaScript lesen indem du document.cookie verwendest:

Hier ist ein eigenhändiger Parser, aber die Antwort, auf die ich gerade verlinkt habe, hat bessere getestete:

var cookies = document.cookie.split(";").
    map(function(el){ return el.split("="); }).
    reduce(function(prev,cur){ prev[cur[0]] = cur[1]; return prev },{});
alert(cookies["MyCookie"]); // Wert mit PHP gesetzt.

Cookies sind gut für einige Daten. Das machen Tracking-Services oft.

Sobald wir mehr Daten haben, können wir sie mit JSON in einer JavaScript-Variablen innerhalb kodieren:

    var myServerData = <?=json_encode($wert)?>; // Vergiss nicht, den Serverdaten zu säubern

Vorausgesetzt, dass $wert auf der PHP-Seite json_encodefähig ist (das ist es normalerweise). Diese Technik wird zum Beispiel von Stack Overflow in seinem Chat verwendet (nur mit .NET anstelle von PHP).

Anwendung

Wenn du eine Anwendung schreibst - plötzlich ist die anfängliche Ladezeit nicht immer so wichtig wie die fortlaufende Leistung der Anwendung, und es beginnt, sich auszuzahlen, Daten und Code getrennt zu laden.

Meine Antwort hier erklärt, wie man Daten mit AJAX in JavaScript lädt:

function callback(data){
    // Was mache ich mit der Antwort?
}

var httpRequest = new XMLHttpRequest;
httpRequest.onreadystatechange = function(){
    if (httpRequest.readyState === 4) { // Anfrage ist abgeschlossen
        if (httpRequest.status === 200) { // erfolgreich
            callback(httpRequest.responseText); // Wir rufen unsere Methode auf
        }
    }
};
httpRequest.open('GET', "/echo/json");
httpRequest.send();

Oder mit jQuery:

$.get("/deine/url").done(function(data){
    // Was mache ich mit den Daten?
});

Jetzt muss der Server nur eine Route/Datei /deine/url enthalten, die Code enthält, der die Daten abruft und etwas damit macht, in deinem Fall:

getValue(); // Macht einen API- und Datenbankaufruf
header("Content-Type: application/json"); // Informiere den Client über den Antworttyp
echo json_encode($val); // Schreibe es in die Ausgabe

Auf diese Weise fordert unsere JavaScript-Datei die Daten an und zeigt sie an, anstatt nach Code oder Layout zu fragen. Das ist sauberer und zahlt sich aus, je höher die Anwendung wird. Es ist auch eine bessere Trennung der Anliegen und ermöglicht es, den Clientseitigen Code ohne Beteiligung einer serverseitigen Technologie zu testen, was ein weiterer Vorteil ist.

Nachtrag: Du musst dich sehr bewusst sein über XSS-Angriffsmöglichkeiten, wenn du etwas von PHP nach JavaScript injizierst. Es ist sehr schwierig, Werte ordnungsgemäß zu escapen, und es ist kontextsensitiv. Wenn du unsicher bist, wie du mit XSS umgehen sollst, oder nichts davon weißt - lies bitte diesen OWASP-Artikel, diesen hier und diese Frage.

53voto

Jessé Catrinck Punkte 2027
  var jsvar = <?php echo json_encode($PHPVar); ?>;

json_encode() erfordert:

  • PHP 5.2.0 oder höher
  • $PHPVar codiert als UTF-8, Unicode.

32voto

Verwenden Sie einfach eine der folgenden Methoden.

var js_variable  = '<?php echo $php_variable;?>';
<script>
</code></pre>

<p><strong>ODER</strong> </p>

<pre><code><script type="text/javascript">
    var js_variable = <?php echo json_encode($php_variable); ?>;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X