544

私はこのコードを持っています:

<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 について明示的に説明していました。問題と解決策の本質的な性質は、一方がクライアントで実行され、もう一方がサーバーで実行されている場合 (同じ言語であっても)、どの言語ペアでも同じです。特定の言語に関する回答が表示された場合は、この点を考慮してください。

4

4 に答える 4

508

コードは、サーバー側クライアント側の 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 つの方法のいずれかを使用して発生する可能性があります。

  1. ブラウザに新しいページをロードさせるリンク。
  2. データをサーバーに送信し、新しいページをロードするフォーム送信。
  3. AJAXリクエスト。これは、サーバーに対して通常の HTTP リクエスト (1. や 2. のように) を作成する Javascript 手法ですが、現在のページを離れることはありません。

これらの方法をより詳細に概説する質問があります

JavaScript を使用してwindow.location、可能性 1. と 2. をエミュレートして、フォームを使用してブラウザーに新しいページを開いたり、フォームを送信したりすることもできます。

于 2012-12-12T13:03:00.063 に答える
177

PHPコードがJavaScriptコードで機能しない理由を判断するには、クライアント側サーバー側の言語とは何か、またそれらがどのように機能するかを理解する必要があります。

サーバー側言語 (PHP など) : データベースからレコードを取得し、ステートレスHTTP接続を介して状態を維持し、セキュリティを必要とする多くのことを行います。それらはサーバー上に存在し、これらのプログラムのソース コードがユーザーに公開されることはありません。

wikipedia_http://en.wikipedia.org/wiki/File:Scheme_dynamic_page_en.svg からの画像 画像属性

したがって、サーバー側の言語が HTTP リクエストを処理して処理することを簡単に確認できます。@deceze が述べたように、PHP はサーバー上で実行され、クライアントへの応答として送信される HTML とおそらく JavaScript コードを出力します。 HTML が解釈され、JavaScript が実行されます。

一方、クライアント側言語 (JavaScript など)はブラウザーに常駐し、ブラウザーで実行されます。クライアントサイド スクリプティングとは、一般に、サーバーサイドではなく、ユーザーのウェブ ブラウザによってクライアントサイドで実行される、ウェブ上のコンピュータ プログラムのクラスを指します。

JavaScript はユーザーに表示され、簡単に変更できるため、セキュリティに関しては JavaScript に依存してはなりません。

したがって、サーバーでHTTP要求を行うと、サーバーは最初に PHP ファイルを注意深く読み取って、実行する必要のあるタスクがあるかどうかを確認し、クライアント側に応答を送信します。繰り返しますが、@deceze が言ったように、*PHP が応答の出力を終了すると、スクリプトは終了し、新しいHTTP要求が来るまでサーバーでは何も起こりません。*

グラフ表示

画像ソース

では、PHP を呼び出す必要がある場合はどうすればよいでしょうか。ページをリロードするか、AJAX 呼び出しを使用するかによって、どのように行う必要があるかによって異なります。

  1. これを行うには、ページをリロードしてHTTPリクエストを送信します。
  2. JavaScript を使用して AJAX 呼び出しを行うことができます。これには、ページのリロードは必要ありません。

よく読んだ:

  1. ウィキペディア : サーバーサイド スクリプティング
  2. ウィキペディア : クライアント側のスクリプト
  3. うちはマダラ : クライアントサイドプログラミングとサーバーサイドプログラミングの違い
于 2013-07-01T11:52:42.377 に答える
36

Javascript は、サーバーではなくクライアントで実行されます。これはfoo、サーバー側で評価されないため、その値をサーバー上のファイルに書き込むことができないことを意味します。

このプロセスについて考える最良の方法は、テキスト ファイルを動的に生成しているかのように考えることです。生成しているテキストは、ブラウザが解釈して初めて実行可能コードになります。<?phpタグの間に配置したものだけがサーバー上で評価されます。

ところで、HTML や Javascript にランダムな PHP ロジックを埋め込む習慣を身につけると、非常に複雑なコードになる可能性があります。辛い経験からお話します。

于 2012-12-12T13:46:38.433 に答える
3

Web アプリケーションでは、すべてのタスクが要求と応答の方法で実行されます。

クライアント側のプログラミングは、Java スクリプトとそのフレームワークを使用した html コードを使用し、ライブラリは Internet Explorer、Mozilla、Chrome ブラウザで実行されます。Java シナリオのサーバー側プログラミング サーブレットは、Tomcat、web-logic、j Boss、WebSphere サーバーで実行されます。

于 2016-07-13T09:26:43.153 に答える