Ich habe eine Variable in PHP und ich brauche ihren Wert in meinem JavaScript-Code. Wie kann ich meine Variable von PHP nach JavaScript bringen?
Ich habe Code, der so aussieht:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
Ich habe JavaScript-Code, der Folgendes benötigt val
und aussieht:
<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
Madaras Geist
quelle
quelle
myPlugin.start(<?=$val?>
beabsichtigt? Stimmt es, dass "das manchmal funktioniert"?"42)"
es gut funktionieren: DAntworten:
Es gibt tatsächlich mehrere Ansätze, um dies zu tun. Einige erfordern mehr Overhead als andere, und einige gelten als besser als andere.
In keiner bestimmten Reihenfolge:
In diesem Beitrag werden wir jede der oben genannten Methoden untersuchen und die Vor- und Nachteile der einzelnen Methoden sowie deren Implementierung untersuchen.
1. Verwenden Sie AJAX, um die benötigten Daten vom Server abzurufen
Diese Methode wird als die beste angesehen, da Ihre serverseitigen und clientseitigen Skripts vollständig getrennt sind .
Vorteile
Nachteile
Implementierungsbeispiel
Mit AJAX benötigen Sie zwei Seiten, eine, auf der PHP die Ausgabe generiert, und die zweite, auf der JavaScript diese Ausgabe erhält:
get-data.php
index.php (oder wie auch immer die eigentliche Seite heißt)
Die obige Kombination der beiden Dateien alarmiert,
42
wenn das Laden der Datei abgeschlossen ist.Noch etwas Lesematerial
2. Echo die Daten irgendwo auf der Seite und verwenden Sie JavaScript, um die Informationen aus dem DOM zu erhalten
Diese Methode ist AJAX weniger vorzuziehen, hat aber dennoch ihre Vorteile. Es ist immer noch relativ getrennt zwischen PHP und JavaScript in dem Sinne, dass es kein PHP direkt im JavaScript gibt.
Vorteile
Nachteile
<input type=hidden>
zum Speichern der Informationen, da es einfacher ist, die Informationen herauszuholen. DiesinputNode.value
bedeutet jedoch, dass Sie ein bedeutungsloses Element in Ihrem HTML-Code haben. HTML enthält das<meta>
Element für Daten zum Dokument, und HTML 5 führtdata-*
Attribute für Daten speziell zum Lesen mit JavaScript ein, die bestimmten Elementen zugeordnet werden können.Implementierungsbeispiel
Damit soll eine Art Element erstellt werden, das dem Benutzer nicht angezeigt wird, aber für JavaScript sichtbar ist.
index.php
3. Echo die Daten direkt in JavaScript
Dies ist wahrscheinlich am einfachsten zu verstehen.
Vorteile
Nachteile
Implementierungsbeispiel
Die Implementierung ist relativ einfach:
Viel Glück!
quelle
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Siehe diese Frage für Details. Lösung: Verwenden SieJSON_HEX_TAG
diese Option , um zu entkommen<
und>
(erfordert PHP 5.3.0).Ich werde eine einfachere Antwort versuchen:
Erklärung des Problems
Lassen Sie uns zunächst den Ereignisfluss verstehen, wenn eine Seite von unserem Server bereitgestellt wird:
Das Wichtigste dabei ist, dass HTTP zustandslos ist . Sobald eine Anfrage den Server verlassen hat, kann der Server sie nicht mehr berühren. Damit haben wir folgende Möglichkeiten:
Lösungen
Das ist die Kernfrage, die Sie sich stellen sollten:
Schreibe ich eine Website oder eine Bewerbung?
Websites sind hauptsächlich seitenbasiert und die Ladezeiten der Seiten müssen so schnell wie möglich sein (z. B. Wikipedia). Webanwendungen sind AJAX-schwerer und führen viele Roundtrips durch, um dem Kunden schnelle Informationen zukommen zu lassen (z. B. ein Aktien-Dashboard).
Webseite
Das Senden weiterer Anforderungen vom Client nach Abschluss der ersten Anforderung ist langsam, da mehr HTTP-Anforderungen mit erheblichem Overhead erforderlich sind. Darüber hinaus ist Asynchronität erforderlich, da für eine AJAX-Anforderung ein Handler erforderlich ist, wenn sie abgeschlossen ist.
Ich würde nicht empfehlen, eine weitere Anfrage zu stellen, es sei denn, Ihre Site ist eine Anwendung zum Abrufen dieser Informationen vom Server.
Sie möchten schnelle Antwortzeiten, die einen großen Einfluss auf die Konvertierungs- und Ladezeiten haben. Das Erstellen von Ajax-Anforderungen ist in diesem Fall für die anfängliche Verfügbarkeit langsam und nicht erforderlich.
Sie haben zwei Möglichkeiten, um das Problem anzugehen
Das Setzen eines Cookies ist wirklich nicht sehr schwierig. Sie weisen ihm lediglich einen Wert zu:
Dann können Sie es mit JavaScript lesen, indem Sie
document.cookie
:Hier ist ein kurzer handgerollter Parser, aber die Antwort, die ich direkt darüber verlinkt habe, hat besser getestete:
Cookies sind gut für ein paar Daten. Dies ist, was Tracking-Dienste oft tun.
Sobald wir mehr Daten haben, können wir sie stattdessen mit JSON in einer JavaScript-Variablen codieren:
Angenommen, es
$value
istjson_encode
auf der PHP-Seite möglich (normalerweise). Diese Technik macht Stack Overflow beispielsweise mit seinem Chat (nur mit .NET anstelle von PHP).Anwendung
Wenn Sie eine Anwendung schreiben, ist die anfängliche Ladezeit plötzlich nicht mehr so wichtig wie die laufende Leistung der Anwendung, und es beginnt sich auszuzahlen, Daten und Code separat zu laden.
Meine Antwort hier erklärt, wie Daten mit AJAX in JavaScript geladen werden:
Oder mit jQuery:
Jetzt muss der Server nur noch eine
/your/url
Route / Datei enthalten, die Code enthält, der die Daten erfasst und etwas damit macht, in Ihrem Fall:Auf diese Weise fragt unsere JavaScript-Datei nach den Daten und zeigt sie an, anstatt nach Code oder Layout zu fragen. Dies ist sauberer und zahlt sich aus, wenn die Anwendung höher wird. Es ist auch eine bessere Trennung von Bedenken und ermöglicht das Testen des clientseitigen Codes ohne serverseitige Technologie, was ein weiteres Plus ist.
Nachtrag: Sie müssen sich der XSS-Angriffsvektoren sehr bewusst sein, wenn Sie etwas von PHP in JavaScript einfügen. Es ist sehr schwer, Werten richtig zu entkommen, und es ist kontextsensitiv. Wenn Sie sich nicht sicher sind, wie Sie mit XSS umgehen sollen, oder wenn Sie sich dessen nicht bewusst sind, lesen Sie bitte diesen OWASP-Artikel , diesen und diese Frage .
quelle
{}
ist ein gültiges JSON-Objekt - siehe json.org\u2028
usw. Sie müssten ausdrücklich anweisen, dies nicht zu tun.Normalerweise verwende ich Daten- * Attribute in HTML.
In diesem Beispiel wird jQuery verwendet, es kann jedoch für eine andere Bibliothek oder Vanille-JavaScript angepasst werden.
Weitere Informationen zur Dataset-Eigenschaft finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
quelle
div
ist in Ordnung, aber Sie können jedes beliebige Tag verwenden; muss in derbody
obwohl sein.json_encode () erfordert:
$PHPVar
codiert als UTF-8, Unicode.quelle
Verwenden Sie einfach eine der folgenden Methoden.
ODER
quelle
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Ich mag die Art und Weise, wie WordPress mit seinen Enqueue- und Lokalisierungsfunktionen arbeitet. Daher habe ich nach diesem Modell eine einfache Klasse geschrieben, um Skripte entsprechend den Skriptabhängigkeiten in eine Seite einzufügen und zusätzliche Daten für das Skript verfügbar zu machen.
Der Aufruf der
enqueue_script()
Funktion dient zum Hinzufügen eines Skripts, zum Festlegen der Quelle und der Abhängigkeiten von anderen Skripten sowie zum Hinzufügen zusätzlicher Daten für das Skript.Die
print_scripts()
Methode des obigen Beispiels sendet diese Ausgabe:Unabhängig von der Tatsache, dass das Skript 'jquery' nach dem 'jquery-ui' in die Warteschlange gestellt wird, wird es zuvor gedruckt, da es in 'jquery-ui' definiert ist, dass es von 'jquery' abhängt. Zusätzliche Daten für das 'benutzerdefinierte Skript' befinden sich in einem neuen Skriptblock und werden davor platziert. Es enthält ein
mydata
Objekt, das zusätzliche Daten enthält, die jetzt für 'benutzerdefiniertes Skript' verfügbar sind.quelle
Versuche dies:
- -
-Nachdem ich es eine Weile versucht habe
Es funktioniert zwar, verlangsamt jedoch die Leistung. Da PHP ein serverseitiges Skript ist, ist JavaScript eine Benutzerseite.
quelle
$phpVariable = '42"; alert("I am evil!");';
Es funktioniert nicht, weil
$val
es in Bezug auf JavaScript undefiniert ist, dh der PHP-Code hat nichts für ausgegeben$val
. Versuchen Sie, die Quelle in Ihrem Browser anzuzeigen. Folgendes wird angezeigt:Und
Dies funktioniert nicht, da PHP versucht,
myPlugin
als Konstante zu behandeln, und wenn dies fehlschlägt, versucht es, es als die Zeichenfolge zu behandeln,'myPlugin'
die es mit der Ausgabe der PHP-Funktion zu verketten versucht,start()
und da dies undefiniert ist, wird es einen fatalen Effekt erzeugen Error.Und
Dies funktioniert zwar am wahrscheinlichsten, da der PHP-Code gültiges JavaScript mit den erwarteten Argumenten erzeugt. Wenn dies jedoch fehlschlägt, liegt dies wahrscheinlich daran, dass es noch
myPlugin
nicht fertig ist. Überprüfen Sie Ihre Ausführungsreihenfolge.Beachten Sie auch, dass die Ausgabe des PHP-Codes unsicher ist und mit gefiltert werden sollte
json_encode()
.BEARBEITEN
Weil ich die fehlende Klammer in
myPlugin.start(<?=$val?>
: - \ nicht bemerkt habeWie @Second Rikudo betont,
$val
muss die schließende Klammer enthalten sein , damit es richtig funktioniert , zum Beispiel:$val="42);"
Dies bedeutet, dass das PHP jetzt produziert
myPlugin.start(42);
und wie erwartet funktioniert, wenn es vom JavaScript-Code ausgeführt wird.quelle
myPlugin.start(<?=json_encode($val)?>);
Ich habe eine einfache Methode gefunden, um JavaScript-Variablen mit PHP zuzuweisen.
Es verwendet HTML5-Datenattribute zum Speichern von PHP-Variablen und wird dann beim Laden der Seite JavaScript zugewiesen.
Ein vollständiges Tutorial finden Sie hier .
Beispiel:
Hier ist der JavaScript-Code
quelle
Beispiel:
SCHRITT 1
SCHRITT 2
quelle
Hier ist eine, die ich nicht als Option sehe. Es ähnelt der Verwendung von Ajax, unterscheidet sich jedoch deutlich.
Stellen Sie zunächst die Quelle eines Skripts direkt auf eine PHP-Datei ein.
Sie können sogar eine Variable an die PHP-Datei zurückgeben, wie in diesem Beispiel:
Dann in "your_php_file.php":
quelle
var1=value1
. So wie es aussieht, wird Ihr Skript unterbrochen, wenn die Daten ein'
Zeichen enthalten.var1 != [some HTML code]
... KLARvar1=="value1"
. Einfach gesagt, du liegst falsch, dass ich etwas verpasst habe. Das BEISPIEL-Skript ist vollständig und generiert, wie Sie sehen, keinerlei HTML - und das OP hat HTML nicht erwähnt. Es verdient keine Abwertung durch einen Trigger Happy Bypasser - Rückzug zurückziehen$val
und der manchmal funktioniert und manchmal nicht:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Hier ist der Trick:
Hier ist Ihr 'PHP' , um diese Variable zu verwenden:
Jetzt haben Sie eine JavaScript-Variable namens
'name'
, und hier ist Ihr JavaScript-Code, um diese Variable zu verwenden:quelle
Angenommen, Ihre Variable ist immer eine Ganzzahl. In diesem Fall ist dies einfacher:
Ausgabe :
Angenommen, Ihre Variable ist keine Ganzzahl, aber wenn Sie die obige Methode ausprobieren, erhalten Sie ungefähr Folgendes:
In JavaScript ist dies jedoch ein Syntaxfehler.
In PHP gibt es also einen Funktionsaufruf
json_encode
, der eine Zeichenfolge für ein JSON-Objekt codiert.Da
abcd
in JSON ist"abcd"
, sieht es so aus:Sie können dieselbe Methode für Arrays verwenden:
Und Ihr JavaScript-Code sieht folgendermaßen aus:
Konsolenausgabe
quelle
Nach langem Suchen stellte ich fest, dass die einfachste Methode darin besteht, alle Arten von Variablen einfach zu übergeben.
Im Serverskript haben Sie zwei Variablen, und Sie versuchen, sie an die Client-Skripte zu senden:
Rufen Sie in einem Ihrer auf der Seite aufgerufenen JavaScript-Code einfach diese Variablen auf.
quelle
Ich gehe davon aus, dass die zu übertragenden Daten eine Zeichenfolge sind.
Wie andere Kommentatoren angegeben haben, ist AJAX eine mögliche Lösung, aber die Nachteile überwiegen die Vorteile: Es hat eine Latenz und es ist schwieriger zu programmieren (es benötigt den Code, um den Wert sowohl auf Server- als auch auf Clientseite abzurufen), wenn dies einfacher ist Fluchtfunktion sollte ausreichen.
Also sind wir zurück auf der Flucht.
json_encode($string)
funktioniert, wenn Sie die Quellzeichenfolge zuerst als UTF-8 codieren, falls dies noch nicht geschehen ist, dajson_encode
UTF-8-Daten erforderlich sind. Wenn sich die Zeichenfolge in ISO-8859-1 befindet, können Sie sie einfach verwendenjson_encode(utf8_encode($string))
. Andernfalls können Sie immericonv
zuerst die Konvertierung durchführen.Aber es gibt eine große Sache. Wenn Sie es in Ereignissen verwenden, müssen Sie
htmlspecialchars()
das Ergebnis ausführen, damit es den richtigen Code enthält. Und dann müssen Sie entweder darauf achten, doppelte Anführungszeichen zu verwenden, um das Ereignis einzuschließen, oder immerENT_QUOTES
zu htmlspecialchars hinzufügen . Zum Beispiel:Sie können jedoch keinen
htmlspecialchars
normalen JavaScript-Code verwenden (Code in<script>
...</script>
Tags eingeschlossen).htmlspecialchars
Dadurch wird diese Funktion fehleranfällig, da beim Schreiben des Ereigniscodes das Ergebnis vergessen wird .Es ist möglich, eine Funktion zu schreiben, die dieses Problem nicht aufweist und sowohl in Ereignissen als auch in regulärem JavaScript-Code verwendet werden kann, sofern Sie Ihre Ereignisse immer in einfache Anführungszeichen oder immer in doppelte Anführungszeichen setzen. Hier ist mein Vorschlag, wonach sie in doppelten Anführungszeichen stehen müssen (was ich bevorzuge):
Die Funktion erfordert PHP 5.4+. Anwendungsbeispiel:
quelle
Gemäß Ihrem Code
Jetzt können Sie mit DOM einen Wert abrufen, innerHTML mit der Span-ID verwenden. In diesem Fall müssen Sie keinen Aufruf an den Server oder Ajax oder eine andere Sache ausführen.
Ihre Seite druckt sie mit PHP und Ihr JavaScript erhält Wert mit DOM.
quelle
<
und nicht entgeht>
. Ähnliche Lösungen wurden bereits vorgeschlagen.quelle
PHP
JS (yourexternal.js)
AUSGABE
quelle
Wenn Sie Probleme mit der Verwendung des folgenden Codes haben und dieser weiterhin
<?php echo $username?>
angezeigt wird, bearbeiten Sie die httpd.conf im Abschnitt mime_module, indem Sie diese 'AddType-Anwendung / x-httpd-php .html .htm' hinzufügen, da sie möglicherweise deaktiviert ist standardmäßig.quelle
$username === "hello"
, dann hast duvar myData = hello;
was schrecklich brechen wird.Verwenden:
und das wird funktionieren. Es wird lediglich eine JavaScript-Variable zugewiesen und dann der Wert einer vorhandenen PHP-Variablen übergeben. Da PHP hier die JavaScript-Zeilen schreibt, hat es den Wert der PHP-Variablen und kann ihn direkt übergeben.
quelle