在回显时连接PHP和JS

时间:2013-12-23 06:56:35

标签: javascript php escaping concatenation

我有一个JS选项var如此:

$output .= 
        '<script type="text/javascript">
         // <![CDATA[

                var options = {
                        render: "canvas", 
                        size: "100",
                        radius: "0.5",
                        };

         // ]]>
         </script>';

但是我需要用PHP变量输出它(echo),它不能在一个单独的文件中,所以我使用常规连接和点.进行输出,例如'.$var.'但由于我的JS需要双引号",我还将它们放入混合中,从而产生双单引号序列。

var options = {
        render: "'.$q_render.'", // Canvas, Div ,Image
        size: "'.$q_size.'",
        radius: "'. $q_corner_r.'",
        };

就我的测试而言,它起作用。

当我需要将$q_corner_r的特定值乘以一个因子时,情节会变浓:

var options = {
        render: "'.$q_ender.'", // Canvas, Div ,Image
        size: "'.$q_size.'",
        radius: "'. ($q_corner_r )* 3 .'",
        };

哪个也有效。 但真正的问题是我需要是十进制值,因此需要乘以十进制因子。

var options = {
        render: "'.$q_ender.'", // Canvas, Div ,Image
        size: "'.$q_size.'",
        radius: "'. ($q_corner_r )* 0.3 .'",
        };

此时,PHP抛出错误,因为据他所知,0.3中的小数点实际上是end concatenation点。

我解决这个问题的外行解决方案是将问题包裹在json_encode()中并将其发送到裸体战斗并且毫无防御能力。

radius: "'. json_encode( ($q_corner_r )* 0.1 ) .'",

,非常令人惊讶,工作正常。

所以现在一切都有效(不要惊慌) - 但我的怀疑仍然存在。

我该如何处理这种情况? (我知道我在JS之前 CAN 在PHP中做$qr_corner_r = ($qr_corner_r )* 0.1但是我应该?)

我的代码只能用于纯粹的运气(或愚蠢,或两者兼而有之)。

是否有适合这些情况的其他解决方案/方法?

我们只是在观察一个简单的“错误逃脱”案件吗? (或者在我的情况下没有逃避)

3 个答案:

答案 0 :(得分:1)

答案是将您的代码更改为如下所示:

var options = {
    render: "'.$qr_ender.'", // Canvas, Div ,Image
    size: "'.$q_size.'",
    radius: "'. ($q_corner_r * 0.3) .'",
    };

您添加了()但仅在变量周围添加了这些内容,这使它们变得毫无用处。

实际上,您正在执行数学运算,因此通过添加(),您将在剩下的数据之前隔离要计算的数学,就像在任何其他数学情况下一样。

答案 1 :(得分:1)

你的主要问题是假设JavaScript需要用引号括起来的值,这只是字符串值所需要的,对于数字 - 尤其是你将在计算中使用的数字 - 你应该不加引号。

$output .= 
  '<script type="text/javascript">
   // <![CDATA[

    var options = {
      render: "canvas", 
      size: 100,
      radius: (' . $q_corner_r . ' * 0.3)
    };

   // ]]>
   </script>';

这样,JavaScript会将它们解释为类型Number,允许您执行数学计算,而无需依赖JavaScript将字符串值转换回可能产生不确定结果的数字。

作为一项规则,如果您发现自己对转义或多级报价感到困惑,最好重新考虑您的方法。上述内容可以通过json_encoding整个PHP对象轻松处理,并在PHP端执行乘法。

$data = (object) array(
  'render' => 'canvas',
  'size' => 100,
  'radius' => ($q_corner_r * 0.3),
);

$output .= 
  '<script type="text/javascript">
   // <![CDATA[

    var options = ' . json_encode($data) . '

   // ]]>
   </script>';

答案 2 :(得分:-1)

试试:

$var = ($q_corner_r* 0.3);
$str ="
      var options = {
                render: "'.$q_ender.'", // Canvas, Div ,Image
                size: "'.$q_size.'",
                radius: "'. $var .'",
                };
";