web-dev-qa-db-ja.com

変数をPHPからJavaScriptに渡す効率的な方法

時々、PHPからJSスクリプトにいくつかの変数を渡す必要があります。今のところ、次のようにしました。

var js-variable = "<?php echo $php-variable; ?>";

しかし、これは非常にいため、JSスクリプトをPHPで解析する必要があるため、.jsファイルでJSスクリプトを隠すことはできません。これを処理する最適なソリューションは何ですか?

23
user606521

PHPを使用してjavascriptを生成したくない場合(およびWebサーバーへの余分な呼び出しを気にしないでください)、AJAXデータ。

PHPを使用する場合は、出力する前に必ずjson_encodeでエンコードします。

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
35
ilanco

Rest/rpc apiを使用してjsonをjsに渡します。 jqueryを使用している場合、これは次の方法で実行できます。

rest.php

<?php echo "{name:biplav}" ?>

次に、jsから次のようにget呼び出しを行います。

var js_var;
$.get("rest.php", function(data) {
         js_var=data;
});

それは私が考えることができる最も簡単な例です。

8
biplav
<?php
// filename: output-json.php
header('content-type:application/json;charset=utf-8');
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));

json_encodeは、有効なjavascript/jsonとして出力がエンコードおよびフォーマットされることを保証する堅牢な関数です。 content-typeヘッダーは、ブラウザーに応答の解釈方法を指示します。

応答が次のような本当にJSONである場合:

{"foo": 5}

次に、content-type:application/json;charset=utf-8として宣言します。 JSONは解析が高速で、javascriptと比較した場合にxssが悪用される可能性がはるかに低くなります。ただし、次のような実際のjavascriptを応答で使用する必要がある場合:

var obj = {foo: 5};

次に、content-type:text/javascript;charset=utf-8として宣言します

ファイルのようにリンクできます:

<script src="output-json.php"></script>

または、別のhttp要求を作成する代わりに、値をHTMLに直接埋め込むと便利な場合があります。次のようにします:

<script>
    <?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?>
</script>

<script>タグを使用してhtmlに埋め込む場合は、必ずJSON_HEX_TAGを使用してください。そうしないと、xssインジェクション攻撃のリスクがあります。また、使用するコンテキストに応じて、セキュリティを強化するために使用する必要のある他のフラグもあります:JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS。これらのフラグを使用すると、応答の可読性が低下しますが、一般にセキュリティと互換性に優れているため、おそらくそれらを使用する必要があります。

コンテンツタイプを宣言し、場合によってはJSON_HEX_TAGフラグを使用することの重要性を強調したいと思います。どちらもxssインジェクションの軽減に役立つからです。

あなたがxss攻撃を誘惑したくない限り、これを行うnot

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
7
goat

私の意見では、変数をJSに直接渡す必要がある場合、おそらくWebアプリケーションは適切に設計されていません。

したがって、2つのヒントがあります。* /js/conf/userprefs.jsonなどの一般的な構成にはJSONファイルを使用します

{
    "avatar": "/img/users/123/avatar.jpg",
    "preferred_color": "blue"
    // ...
}
  • または(より良い方法)AJAX呼び出しでjson confを取得できます。

PHP Symfony2のようなフレームワークを使用すると、変数の出力をテンプレートエンジン(Twigなど)に残してルーティング構成の形式を決定できます。

Symfony2ユーザー向けの例を示していますが、これはどのプログラマーでも使用できます。

routing.yml

userprefs:
    pattern: /js/confs/userprefs.{_format}
    defaults: { _controller: CoreBundle:JsonPrefs:User, _format: json }
    requirements:
        _format: json
        _method: GET

コントローラー内では、変数を取得してビューに入れるために必要なすべてのクエリを実行できます。

Resources/Views/JsonPrefs/User.json

{
    "avatar": "{{ user.avatar }}",
    "preferred_color": "{{ user.preferred_color }}"
    // ...
}

JS内で、簡単なAJAX呼び出しでJSONを取得できます。パフォーマンスのために、VarnishでJSONをキャッシュできます。このようにして、サーバーはユーザー設定を読むたびにクエリを実行する必要があります。

3

.htaccessファイルを変更して含める場合

 AddType application/x-httpd-php .js

.jsファイルを使用できます。これは、必要なものの半分であるPHPによって処理されます。

その解決策がどれほどいのかという点では、これは最もthisいメカニズムではないと思います。 JSスクリプト全体をPHPスクリプトとして文字列として渡し、挿入する必要のある変数を検索および置換することを試みることができますが、これはugいことに同意すると思います現在使用しているソリューションよりも。

2
Eliot Ball

すべての.jsファイルをフォルダーに入れ、それらのファイルへのすべての要求を、ファイルをロードして出力するPHPファイルにリダイレクトするようにHTTPサーバーを構成します。

Apacheがあり、.jsファイルが/ jsにあるとします。

RewriteRule /js   /getjs.php

getjs.php:

<?php
header('Content-Type: text/javascript');
include_once($_SERVER['SCRIPT_NAME']);
?>
2
MaxArt

PHPパーサーを介して.jsファイルを実行することを回避する限り、できることはほとんどありません。ただし、js-variable AJAX呼び出し。

また、次のような値の出力を検討することもできます。

var js_variable = <?php echo json_encode ($php_variable); ?>

あなたのjavascriptを壊すすべてのものを逃れるために。

1
wroniasty

少なくとも、PHPショートコードを使用して、「ugい」ソリューションを少しきれいにすることができます。

var js-variable = "<?= $php-variable ?>";
0
Kevin