Ich habe diesen Code:
<script type="text/javascript">
var foo = 'bar';
<?php
file_put_contents('foo.txt', ' + foo + ');
?>
var baz = <?php echo 42; ?>;
alert(baz);
</script>
Warum schreibt dies nicht "bar" in meine Textdatei, sondern meldet "42"?
NB: Frühere Versionen dieser Frage bezogen sich ausdrücklich auf PHP auf dem Server und JavaScript auf dem Client. Das Problem und die Lösungen sind im Wesentlichen für jede Sprache gleich, wenn die eine auf dem Client und die andere auf dem Server läuft (selbst wenn es sich um dieselbe Sprache handelt). Bitte berücksichtigen Sie dies, wenn Sie Antworten sehen, die sich auf bestimmte Sprachen beziehen.
Ihr Code ist in zwei völlig unterschiedliche Teile aufgeteilt, die Serverseite und die Client-Seite.
|
---------->
HTTP request
|
+--------------+ | +--------------+
| | | | |
| browser | | | web server |
| (JavaScript) | | | (PHP etc.) |
| | | | |
+--------------+ | +--------------+
|
client side | server side
|
<----------
HTML, CSS, JavaScript
|
Die beiden Seiten kommunizieren über HTTP-Anfragen und -Antworten. PHP wird auf dem Server ausgeführt und gibt etwas HTML und eventuell JavaScript-Code aus, der als Antwort an den Client gesendet wird, wo das HTML interpretiert und das JavaScript ausgeführt wird. Sobald PHP die Ausgabe der Antwort beendet hat, wird das Skript beendet und auf dem Server passiert nichts mehr, bis eine neue HTTP-Anfrage eingeht.
Der Beispielcode wird wie folgt ausgeführt:
<script type="text/javascript">
var foo = 'bar';
<?php
file_put_contents('foo.txt', ' + foo + ');
?>
var baz = <?php echo 42; ?>;
alert(baz);
</script>
Schritt 1, PHP führt den gesamten Code zwischen <?php ?>
Tags aus. Das Ergebnis ist dieses:
<script type="text/javascript">
var foo = 'bar';
var baz = 42;
alert(baz);
</script>
Der Aufruf file_put_contents
hat zu nichts geführt, er hat nur " + foo + " in eine Datei geschrieben. Der Aufruf <?php echo 42; ?>
führte zu der Ausgabe "42", die nun an der Stelle steht, an der dieser Code vorher war.
Dieser resultierende HTML/JavaScript-Code wird nun an den Client gesendet, wo er ausgewertet wird. Der Aufruf "alert" funktioniert, während die Variable "foo" nirgendwo verwendet wird.
**Der gesamte PHP-Code wird auf dem Server ausgeführt, bevor der Client überhaupt mit der Ausführung des JavaScript beginnt. In der Antwort ist kein PHP-Code mehr vorhanden, mit dem JavaScript interagieren könnte.
Um einen PHP-Code aufzurufen, muss der Client eine neue HTTP-Anfrage an den Server senden. Dies kann mit einer von drei möglichen Methoden geschehen:
Hier finden Sie eine Frage, die diese Methoden genauer beschreibt
Sie können auch JavaScript verwenden, um den Browser dazu zu bringen, eine neue Seite mit window.location
zu öffnen oder ein Formular abzuschicken, was die Möglichkeiten 1. und 2. emuliert.
Um festzustellen, warum PHP-Code nicht mit JavaScript-Code funktioniert, müssen wir verstehen, was Client-Side und Server-Side-Sprachen sind und wie sie funktionieren.
Server-seitige Sprachen (PHP usw.): Sie rufen Datensätze aus Datenbanken ab, verwalten den Status über die zustandslose HTTP-Verbindung und erledigen eine Menge Dinge, die Sicherheit erfordern. Sie befinden sich auf dem Server, der Quellcode dieser Programme ist für den Benutzer nicht sichtbar.
Sie können also leicht erkennen, dass serverseitige Sprachen HTTP-Anfragen bearbeiten und verarbeiten, und, wie @deceze sagte, PHP wird auf dem Server ausgeführt und gibt etwas HTML und vielleicht JavaScript-Code aus, der als Antwort an den Client gesendet wird, wo das HTML interpretiert und JavaScript ausgeführt wird.
Andererseits befinden sich Client-Side-Sprachen (wie JavaScript) im Browser und werden im Browser ausgeführt. Der Begriff Client-Side-Scripting bezieht sich im Allgemeinen auf die Klasse der Computerprogramme im Internet, die clientseitig, d. h. vom Webbrowser des Benutzers, und nicht server-seitig ausgeführt werden.
JavaScript ist für den Benutzer sichtbar und kann leicht verändert werden, so dass wir uns aus Sicherheitsgründen nicht auf JavaScript verlassen dürfen.
Wenn Sie also eine HTTP-Anfrage auf dem Server stellen, liest der Server zuerst die PHP-Datei sorgfältig, um zu sehen, ob es irgendwelche Aufgaben gibt, die ausgeführt werden müssen, und sendet dann eine Antwort an die Client-Seite. Auch hier gilt, wie @deceze sagte: Wenn PHP mit der Ausgabe der Antwort fertig ist, wird das Skript beendet und auf dem Server passiert nichts mehr, bis eine neue HTTP-Anfrage eingeht.
Was kann ich nun tun, wenn ich PHP aufrufen muss? Das hängt davon ab, wie Sie es machen wollen: entweder durch Neuladen der Seite oder durch einen AJAX-Aufruf.
Gut gelesen:
Ihr Javascript wird auf dem Client ausgeführt, nicht auf dem Server. Das bedeutet, dass "foo" nicht auf der Serverseite ausgewertet wird und sein Wert daher nicht in eine Datei auf dem Server geschrieben werden kann.
Am besten stellt man sich diesen Vorgang so vor, als würde man eine Textdatei dynamisch erzeugen. Der Text, den Sie erzeugen, wird erst dann zu ausführbarem Code, wenn der Browser ihn interpretiert. Nur das, was Sie zwischen <?php
-Tags einfügen, wird auf dem Server ausgewertet.
Übrigens kann die Gewohnheit, willkürliche Teile der PHP-Logik in HTML oder Javascript einzubetten, zu sehr unübersichtlichem Code führen. Ich spreche aus leidvoller Erfahrung.