有效的方式来传递从PHP变量的JavaScript [复制](Efficient way to Pa

2019-06-25 04:47发布

这个问题已经在这里有一个答案:

  • 如何传递变量和数据从PHP到JavaScript的? 18个回答

不时我不得不从PHP到JS脚本传递一些变量。 现在我做到了,是这样的:

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

但是,这是非常丑陋的,我不能在.js文件中隐藏我的JS脚本,因为它必须被PHP解析。 什么是处理这个最好的解决办法?

Answer 1:

如果你不想使用PHP来生成您的JavaScript(并且不介意你的web服务器的额外调用),使用AJAX来获取数据。

如果你想使用PHP,始终json_encode输出前进行编码。

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


Answer 2:

请使用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;
});

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



Answer 3:

<?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。 内容类型头告诉浏览器如何解释响应。

如果你的反应是真正的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>

可替代地,它可以方便地直接在HTML嵌入值,而不是使独立的http请求的。 做它像这样:

<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>


Answer 4:

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

所以,我有两个小技巧:*使用JSON文件一般的配置,像/js/conf/userprefs.json

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

有了这样的Symfony2 PHP框架,你可以决定你的路由配置留下一个变量的输出到模板引擎(就像嫩枝)的格式。

我做的一个例子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。 出于性能的目的,你可以使用缓存清漆JSONs(例如)。 这样,您的服务器并不需要每次读取用户的喜好时间做一个查询。



Answer 5:

如果修改.htaccess文件,包括

 AddType application/x-httpd-php .js

你可以使用一个.js文件,它会通过PHP,这是您所需要的一半来处理。

在该解决方案是如何丑陋的方面,我会说,这是最丑陋的机制。 你可以尝试通过一个PHP脚本作为一个字符串来传递你的整个JS脚本,做一个搜索和替换为你需要插入变量,但我认为你会同意,这比目前正在使用的解决方案丑陋。



Answer 6:

把你所有的.js文件的文件夹中,并配置HTTP服务器重定向所有的请求,这些文件加载​​文件并将其输出的PHP文件。

让我们假设你有Apache和你的.js文件在/ JS:

RewriteRule /js   /getjs.php

getjs.php:

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


Answer 7:

至于通过PHP解析器避免运行.js文件,没有什么可以做,除了可能获取的价值js-variable通过Ajax调用。

您也可以考虑outputing这样的价值:

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

逃避所有会破坏你的JavaScript的东西。



Answer 8:

最起码,你可以使用PHP简码,让您的“丑陋”的解决方案有点清洁:

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


文章来源: Efficient way to Pass variables from PHP to JavaScript [duplicate]