将变量从PHP传递到JavaScript的有效方法

时间:2012-06-04 22:22:52

标签: php javascript cakephp cakephp-2.0

我不时要将一些变量从PHP传递给JS脚本。 现在我这样做了:

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

但这非常难看,我无法在.js文件中隐藏我的JS脚本,因为它必须由PHP解析。处理这个问题的最佳解决方案是什么?

8 个答案:

答案 0 :(得分:35)

如果您不想使用PHP生成您的javascript(并且不介意对您的网络服务器进行额外调用),请使用AJAX来获取数据。

如果您确实想使用PHP,请在输出前始终使用json_encode进行编码。

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

答案 1 :(得分:8)

请使用rest / rpc api并将json传递给你的js。 如果您使用jquery,可以通过以下方式完成此操作:

rest.php

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

然后从你的js拨打这样的电话:

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

这是我能想到的最简单的例子。

答案 2 :(得分:7)

<?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。与javascript相比,JSON解析速度更快,并且使用xss的可能性要小得多。但是,如果您需要在响应中使用真正的javascript,例如:

var obj = {foo: 5};

然后将其声明为content-type:text/javascript;charset=utf-8

您可以像文件一样链接到它:

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

或者,可以方便地将值直接嵌入到html中,而不是单独生成http请求。这样做:

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

如果通过&lt; script&gt;嵌入到您的html中,请务必使用JSON_HEX_TAG标记,否则会冒xss注入攻击的风险。根据您在其中使用的上下文,还可能需要使用其他标志以获得更高的安全性:JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS。这些标志使响应的可读性降低,但通常对安全性和兼容性有好处,所以你应该只使用它们。

我真的想强调声明内容类型和可能使用JSON_HEX_TAG标志的重要性,因为它们都可以帮助缓解xss注入。

除非你想引诱xss攻击,否则这样做:

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

答案 3 :(得分:3)

在我看来,如果你需要直接在JS中传递变量,可能你的web应用程序设计得不好。

所以,我有两个提示: *将JSON文件用于常规配置,例如/js/conf/userprefs.json

{
    "avatar": "/img/users/123/avatar.jpg",
    "preferred_color": "blue"
    // ...
}
  • 或(更好的方法)你可以通过AJAX调用检索你的json confs。

使用像Symfony2这样的PHP框架,您可以在路由配置中确定一种格式,将变量的输出留给模板引擎(如Twig)。

我为Symfony2用户做了一个例子,但任何程序员都可以使用它:

的routing.yml

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

在控制器内部,您可以执行检索变量所需的所有查询,并将这些变量放在视图中:

资源/查看/ JsonPrefs / User.json

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

在JS中,您现在可以通过简单的AJAX调用来检索JSON。 出于性能目的,您可以使用Varnish缓存JSON(例如)。这样,每次阅读用户首选项时,您的服务器都不需要进行查询。

答案 4 :(得分:2)

如果您修改.htaccess文件以包含

 AddType application/x-httpd-php .js

你可以使用.js文件,它将由PHP处理,这是你需要的一半。

就解决方案的难度而言,我会说这是最不丑陋的机制。您可以尝试将整个JS脚本作为字符串传递给PHP脚本并对需要插入的变量进行搜索和替换,但我认为您会同意这比您当前使用的解决方案更加丑陋。 / p>

答案 5 :(得分:2)

将所有.js文件放在一个文件夹中,并将HTTP服务器配置为将所有请求重定向到加载文件并输出文件的PHP文件。

假设你有Apache,你的.js文件在/ js:

RewriteRule /js   /getjs.php

getjs.php:

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

答案 6 :(得分:1)

至于避免通过PHP解析器运行.js文件,除了可以通过AJAX调用获取js-variable的值之外,你几乎无能为力。

您也可以考虑输出如下值:

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

逃避所有会破坏你的javascript的事情。

答案 7 :(得分:0)

至少,您可以使用PHP短代码使您的“丑陋”解决方案更清洁:

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