这个问题已经在这里有一个答案:
- 如何传递变量和数据从PHP到JavaScript的? 18个回答
不时我不得不从PHP到JS脚本传递一些变量。 现在我做到了,是这样的:
var js-variable = "<?php echo $php-variable; ?>";
但是,这是非常丑陋的,我不能在.js文件中隐藏我的JS脚本,因为它必须被PHP解析。 什么是处理这个最好的解决办法?
这个问题已经在这里有一个答案:
不时我不得不从PHP到JS脚本传递一些变量。 现在我做到了,是这样的:
var js-variable = "<?php echo $php-variable; ?>";
但是,这是非常丑陋的,我不能在.js文件中隐藏我的JS脚本,因为它必须被PHP解析。 什么是处理这个最好的解决办法?
如果你不想使用PHP来生成您的JavaScript(并且不介意你的web服务器的额外调用),使用AJAX来获取数据。
如果你想使用PHP,始终json_encode输出前进行编码。
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
请使用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;
});
这就是最简单的例子,我能想到的。
<?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>
在我看来,如果你需要直接在你的JS传递变量,可能是你的web应用程序是不是好的设计。
所以,我有两个小技巧:*使用JSON文件一般的配置,像/js/conf/userprefs.json
{
"avatar": "/img/users/123/avatar.jpg",
"preferred_color": "blue"
// ...
}
有了这样的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(例如)。 这样,您的服务器并不需要每次读取用户的喜好时间做一个查询。
如果修改.htaccess文件,包括
AddType application/x-httpd-php .js
你可以使用一个.js文件,它会通过PHP,这是您所需要的一半来处理。
在该解决方案是如何丑陋的方面,我会说,这是最丑陋的机制。 你可以尝试通过一个PHP脚本作为一个字符串来传递你的整个JS脚本,做一个搜索和替换为你需要插入变量,但我认为你会同意,这比目前正在使用的解决方案丑陋。
把你所有的.js文件的文件夹中,并配置HTTP服务器重定向所有的请求,这些文件加载文件并将其输出的PHP文件。
让我们假设你有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调用。
您也可以考虑outputing这样的价值:
var js_variable = <?php echo json_encode ($php_variable); ?>
逃避所有会破坏你的JavaScript的东西。
最起码,你可以使用PHP简码,让您的“丑陋”的解决方案有点清洁:
var js-variable = "<?= $php-variable ?>";