時々、PHPからJSスクリプトにいくつかの変数を渡さなければなりません。今のところ私はこのようにしました:
var js-variable = "<?php echo $php-variable; ?>";
しかし、これは非常に醜く、PHPで解析する必要があるため、JSスクリプトを.jsファイルで非表示にすることはできません。これを処理するための最良の解決策は何ですか?
時々、PHPからJSスクリプトにいくつかの変数を渡さなければなりません。今のところ私はこのようにしました:
var js-variable = "<?php echo $php-variable; ?>";
しかし、これは非常に醜く、PHPで解析する必要があるため、JSスクリプトを.jsファイルで非表示にすることはできません。これを処理するための最良の解決策は何ですか?
PHP を使用して JavaScript を生成したくない場合 (および Web サーバーへの余分な呼び出しを気にしない場合) は、AJAX を使用してデータをフェッチします。
PHP を使用する場合は、出力する前に必ず json_encode でエンコードしてください。
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
rest/rpc API を使用して、json を js に渡してください。jquery を使用している場合、これは次の方法で実行できます。
残り.php
<?php echo "{name:biplav}" ?>
次に、js から次のような get 呼び出しを行います。
var js_var;
$.get("rest.php", function(data) {
js_var=data;
});
それは私が考えることができる最も単純な例です。
<?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>
JSON_HEX_TAG
<script> タグを介して html に埋め込む場合は必ず使用してください。そうしないと、xss インジェクション攻撃の危険があります。使用するコンテキストに応じて、セキュリティを強化するために使用する必要がある他のフラグもありますJSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS
。これらのフラグを使用すると、応答が読みにくくなりますが、一般的にセキュリティと互換性に優れているため、そのまま使用する必要があります。
コンテンツ タイプを宣言し、場合によってはフラグを使用することの重要性を強調したいと思いJSON_HEX_TAG
ます。どちらも xss インジェクションを軽減するのに役立つからです。
xss 攻撃を試みる場合を除き、これを行わないでください。
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
私の意見では、JSで変数を直接渡す必要がある場合、おそらくWebアプリケーションは適切に設計されていません。
したがって、2つのヒントがあります。*次のような一般的な構成にはJSONファイルを使用します。/js/conf/userprefs.json
{
"avatar": "/img/users/123/avatar.jpg",
"preferred_color": "blue"
// ...
}
Symfony2のようなPHPフレームワークでは、変数の出力をテンプレートエンジン(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(たとえば)をキャッシュできます。このように、ユーザー設定を読み取るたびにサーバーがクエリを実行する必要はありません。
.htaccess ファイルを変更して含める場合
AddType application/x-httpd-php .js
.js ファイルを使用することができ、必要なものの半分である PHP によって処理されます。
そのソリューションがどれほど醜いかという点では、これが最も醜いメカニズムだと思います。JS スクリプト全体を PHP スクリプトに文字列として渡し、挿入する必要のある変数を検索して置換することもできますが、これは現在使用しているソリューションよりも醜いことに同意すると思います。
すべての .js ファイルをフォルダーに配置し、それらのファイルへのすべての要求を、ファイルをロードして出力する PHP ファイルにリダイレクトするように HTTP サーバーを構成します。
Apache があり、.js ファイルが /js にあるとします。
RewriteRule /js /getjs.php
getjs.php:
<?php
header('Content-Type: text/javascript');
include_once($_SERVER['SCRIPT_NAME']);
?>
PHP パーサーを介して .js ファイルを実行することを回避する限りjs-variable
、AJAX 呼び出しを介して の値を取得する以外にできることはほとんどありません。
また、次のように値を出力することも検討できます。
var js_variable = <?php echo json_encode ($php_variable); ?>
JavaScriptを壊すすべてのものをエスケープします。
少なくとも、PHP ショートコードを使用して、「醜い」ソリューションを少しきれいにすることができます。
var js-variable = "<?= $php-variable ?>";