【问题标题】:"SyntaxError: unterminated string literal" error when embedding php variable in javascript在 javascript 中嵌入 php 变量时出现“SyntaxError:未终止的字符串文字”错误
【发布时间】:2013-01-08 09:54:17
【问题描述】:

这是一个简单的嵌入,我不明白为什么会出现此错误。

在动作类中...

$TESTME = "what";

在视图中......

<script type="text/javascript">
    $(document).ready(function () {
        var someVale = "<?php echo $TESTME; ?>";
        alert(someVale);
    });
</script>

错误指向 var 赋值后的第一个引号

即。 var someVale = "....

【问题讨论】:

标签: php javascript embed


【解决方案1】:

您需要检查$TESTME 的内容。它要么包含换行符,要么包含双引号。您看到的错误通常表明有问题的字符串被破坏了几行,或者引号的数量不匹配。

在你的情况下,它可能是换行符......

var someVale = "< br />
<tag>
<tag>
<tag>";

这显然是行不通的,你需要处理字符串,这样你最终得到...

var someVale = "< br />\n<tag>\n<tag>\n<tag>";

您可以使用类似...的方式转换您的 PHP 变量

$TESTME = str_replace(chr(13), "\n", $TESTME);

(根据所涉及的操作系统,您的换行符也可能是chr(13) . chr(10)。)

【讨论】:

  • 我在那里定义了 $TESTME。它只包含“什么”。它会在哪里损坏?我也试着把它变成一个数字。同样的错误
  • 换行很好。他也应该做一个nl2br()
  • 只使用 JSON 编码工具可能是个好主意。
  • nl2br() 不起作用 json_encode 不起作用 str_replace 技术不起作用。还有其他想法吗?
  • 您仍然需要目视检查$TESTME 的内容。如果您在此处发布实际内容,我们可以提供更好的帮助。即便如此,它也会让您更好地了解问题可能是什么。您还应该在字符串中查找错误的"s。尝试将您的代码修改为var someVale = '&lt;?php echo $TESTME; ?&gt;';
【解决方案2】:

大多数情况下,您可以避免使用回显变量,但有时这些回显字符串包含行终止符或引号(也称为字符串分隔符)。您可以测试并再次测试,但您只是必须保护自己免受“恶意”和“不可预测”的输入。在这个答案中,我同时使用了单引号和双引号
您可以str_replaceurlencode 您的字符串,这将解决您的问题,但老实说……json_encode 到底有什么问题?它非常适合服务器 客户端数据,就像您正在使用的那样:

var someVal = JSON.parse(<?= json_encode(array('data' => $someVar));?>).data;

所有需要转义的字符都将被转义...工作完成,并使用“本机”PHP 函数。

更新:
正如下面的 cmets 所示,由于范围问题,这可能是 PHP 错误。与其在类中声明变量,不如声明一个属性:

class Foo
{
    public $theProperty = null;
    public function __construct($argument = null)
    {
        $this->theProperty = $argument;//assign a variable, passed to a method to a property
        $someVar = 123;//this variable, along with $argument is GC'ed when this method returns
    }
}
//end of class
$instance = new Foo('Value of property');
echo $instance->theProperty;//echoes "value of property"
$anotherInstance = new Foo();//use default value
if ($anotherInstance->theProperty === null)
{//is true
    echo 'the property is null, default value';
    $anotherInstance->theProperty = 'Change a property';
}

基本上就是这样。我不知道你是如何使用你的视图脚本的,所以下面的代码可能不适用于你的情况(这是你可以在 Zend Framework 中的控制器中做的):

public function someAction()
{
    $instance = new Foo('Foobar');
    $this->view->passedInstance = $instance;//pass the instance to the view
}

然后,在您的视图脚本中,您将执行以下操作:

var someVal = JSON.parse('<?= json_encode(array('data' => $this->passedInstance->someProperty)); ?>').data;

但为了让我的回答适用于您的情况,我必须看看您是如何渲染视图的……您使用的是框架吗?你使用的是经典的 MVC 模式,还是视图脚本只是你include 的东西?

【讨论】:

  • @James 显示出现错误的整个脚本标记(生成的代码)。当你得到一个 php 错误时,它看起来会导致 js 错误。
  • @James: ??你的意思是?您自己编写了 PHP 代码,对吧?另外,我刚刚再次阅读了您的问题...我是否正确地说您在视图脚本中回显了一个在类中声明的 PHP 变量?在这种情况下:您超出范围/运气...类是“自包含”,您只能访问公共属性,而不是变量。
  • 苏。我认为你是对的,这是一个范围问题。如何将该 php 变量放入视图中?!?!
  • 将该类的实例传递给视图,将变量分配为属性,然后像这样访问它......我会更新我的答案
  • 问题已解决。我是 symfony 的新手,我必须有 $this->TESTME。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2015-07-25
相关资源
最近更新 更多