【问题标题】:Efficient way to Pass variables from PHP to JavaScript [duplicate]将变量从 PHP 传递到 JavaScript 的有效方法 [重复]
【发布时间】:2012-06-08 23:51:36
【问题描述】:

有时我必须将一些变量从 PHP 传递到 JS 脚本。 现在我是这样做的:

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

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

【问题讨论】:

  • 我希望这只是一个例子,var js-variable 会产生语法错误,以及$php-variable...
  • 小心 php 变量中的双引号。

标签: php javascript cakephp cakephp-2.0


【解决方案1】:

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

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

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

【讨论】:

  • +1 json 是使用 PHP 脚本数据的最佳方式,无论是通过 ajax 还是在编译页面的同时。
  • 警告:这可能会杀死您的网站。示例:&lt;?php $myVarValue = '&lt;!--&lt;script&gt;'; ?&gt;。有关详细信息,请参阅this question。解决方案:使用JSON_HEX_TAG转义&lt;&gt;(需要PHP 5.3.0)。
  • 这样做的另一个缺点是会影响初始页面加载时间。
  • @Pang 和 biplav,请您说得更具体些。 stackoverflow.com/q/24855186/1951635
  • @biplav - 这对性能有何影响?我什么情况?谢谢!
【解决方案2】:

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

rest.php

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

然后从你的 js 中进行如下调用:

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

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

【讨论】:

  • +1 从服务器检索变量最好用服务调用来表示。
【解决方案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。 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>

或者,将值直接嵌入到您的 html 中而不是单独发出 http 请求会很方便。这样做:

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

如果通过 嵌入到您的 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>

【讨论】:

    【解决方案4】:

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

    所以,我有两个提示: * 使用 JSON 文件进行一般配置,例如 /js/conf/userprefs.json

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

    使用 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(例如)。这样,您的服务器就不需要在每次读取用户首选项时都进行查询。

    【讨论】:

      【解决方案5】:

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

       AddType application/x-httpd-php .js
      

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

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

      【讨论】:

        【解决方案6】:

        将所有 .js 文件放在一个文件夹中,并配置您的 HTTP 服务器以将所有对这些文件的请求重定向到一个 PHP 文件,该文件加载并输出它们。

        假设您有 Apache 并且您的 .js 文件位于 /js 中:

        RewriteRule /js   /getjs.php
        

        getjs.php:

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

        【讨论】:

          【解决方案7】:

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

          您也可以考虑像这样输出值:

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

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

            • 我不是反对者,但短代码存在可移植性问题,因此朋友应该避免使用。
            • 当您将 PHP 视为模板引擎时,这并不难看。不过,如果他能用 Ajax 解决这个问题,那就更好了,我同意。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-11
            • 2014-04-17
            • 1970-01-01
            • 2016-02-23
            相关资源
            最近更新 更多