使用PHP插入JavaScript时获得意外的换行符

时间:2013-07-23 15:44:34

标签: php javascript

我正在尝试将项目插入到自动完成功能的javascript数组中。我从数据库中获取数组所需的值,因此我使用PHP获取它们。然后我只是将每个项目推入javascript数组。但是,它一直告诉我,我有一个“意外的令牌ILLEGAL”,看起来它指向插入的单个“引号”字符,然后有一个换行符,然后继续到实际值。

我的javascript / PHP

<script type="text/javascript">
        $(function() {
           var availableTags = [];
           <?php

              foreach ($modelList as &$model)
                 echo "availableTags.push('$model');" . "\n";
           ?>
           $("#devicemod").autocomplete({
                 source: availableTags
           });
        });


        </script>

然后是错误消息......

$(function() {
               var availableTags = [];
               availableTags.push('
***Uncaught SyntaxError: Unexpected token ILLEGAL***
ODEL: T]422P');availableTags.push('');availableTags.push('!');availableTags.push('!6.1/120{ MODEL: TM402P');availableTags.push('!A`$');availableTags.push('!DP1110   CREATED ON: JAN 29 2002');availableTags.push('!MODEL: TM402P');

结果应该是......

availableTags.push('ODEL:T]422P');
availableTags.push('');
etc...

2 个答案:

答案 0 :(得分:1)

这是个坏主意:

   echo "availableTags.push('$model');" . "\n";

如果$model包含任何javascript元字符,尤其是',则会引入语法错误并终止整个<script>块。永远不要直接将任意文本输出到Javascript上下文中 - 你基本上容易受到SQL injection attack的JS等价物的攻击。<​​/ p>

至少,您应该使用json_encode()来保证您的文本在语法上对您正在使用它的上下文有效:

echo 'availableTags.push(' . json_encode($model) . ");\n";

或更好......为什么当你可以自动生成一个数组时所有这一切都在推动?

<?php
$data = array();
foreach ($modelList as $model) {
   $data[] = $model;
}
?>
var availableTags = <?php echo json_encode($data); ?>;

答案 1 :(得分:1)

使用json_encode(),您可以在单个(安全)步骤中执行此操作:

<script type="text/javascript">
$(function() {
   $("#devicemod").autocomplete({
       source: <?php echo json_encode($modelList); ?>
   });
});
</script>

json_encode()函数可确保根据JavaScript表示法的规则正确转义值。这可以防止在这种情况下值包含单引号时出现令人讨厌的意外。

如果$modelList不是真正的列表(即密钥没有按顺序编号),您应首先应用array_values()

...
       source: <?php echo json_encode(array_values($modelList)); ?>
...