次のようなコードがあります:
<script type="text/javascript">
var foo = 'bar';
<?php
file_put_contents('foo.txt', ' + foo + ');
?>
var baz = <?php echo 42; ?>;
alert(baz);
</script>
なぜテキスト ファイルに「bar」が書き込まれず、「42」が警告されるのでしょうか?
注意: この質問の以前の改訂版では、サーバー上の PHP とクライアント上の JavaScript について明確に述べられていました。問題と解決策の本質は、1 つがクライアント上で実行され、もう 1 つがサーバー上で実行されている言語のペア (同じ言語であっても) で同じです。特定の言語について言及している回答を見るときは、この点を考慮してください。
ベストアンサー1
コードは、サーバー側とクライアント側という完全に別々の 2 つの部分に分割されます。
|
---------->
HTTP request
|
+--------------+ | +--------------+
| | | | |
| browser | | | web server |
| (JavaScript) | | | (PHP etc.) |
| | | | |
+--------------+ | +--------------+
|
client side | server side
|
<----------
HTML, CSS, JavaScript
|
両者は HTTP リクエストとレスポンスを介して通信します。PHP はサーバー上で実行され、HTML と JavaScript コードを出力します。このコードはクライアントへのレスポンスとして送信され、クライアントでは HTML が解釈され、JavaScript が実行されます。PHP がレスポンスの出力を完了すると、スクリプトは終了し、新しい HTTP リクエストが到着するまでサーバー上では何も起こりません。
サンプルコードは次のように実行されます。
<script type="text/javascript">
var foo = 'bar';
<?php
file_put_contents('foo.txt', ' + foo + ');
?>
var baz = <?php echo 42; ?>;
alert(baz);
</script>
ステップ 1: PHP は<?php ?>
タグ間のすべてのコードを実行します。結果は次のようになります。
<script type="text/javascript">
var foo = 'bar';
var baz = 42;
alert(baz);
</script>
このfile_put_contents
呼び出しでは何も起こりませんでした。単に「 + foo + 」がファイルに書き込まれただけです。<?php echo 42; ?>
呼び出しの結果は「42」という出力で、これは以前そのコードがあった場所にあります。
結果として得られた HTML/JavaScript コードはクライアントに送信され、評価されます。呼び出しalert
は機能しますが、foo
変数はどこにも使用されません。
すべての PHP コードは、クライアントが JavaScript の実行を開始する前にサーバー上で実行されます。応答には、JavaScript が対話できる PHP コードは残っていません。
PHP コードを呼び出すには、クライアントはサーバーに新しい HTTP リクエストを送信する必要があります。これは、次の 3 つの方法のいずれかを使用して実行できます。
- ブラウザに新しいページを読み込むリンク。
- フォーム送信。データをサーバーに送信し、新しいページを読み込みます。
- アンアヤックスrequest は、現在のページを離れずに、サーバーに通常の HTTP リクエスト (1. および 2. と同様) を送信する JavaScript テクニックです。
また、JavaScript を使用して、可能性 1 と 2 をエミュレートし、ブラウザでフォームを使用して新しいページを開いたりwindow.location
、フォームを送信したりすることもできます。