【问题标题】:Uncaught SyntaxError: missing ) after argument list ERROR ON JSUncaught SyntaxError: missing ) after argument list ERROR ON JS
【发布时间】:2019-05-13 13:19:40
【问题描述】:

我正在构建一个有按钮的表格。当用户单击此按钮时,行的统计信息会发生变化,在表中这表示具有 0 或 1 的字段。很好,我制作了按钮,但在某些行中出现错误,错误是 Uncaught SyntaxError: missing ) after argument列表,我很困惑,因为代码在 80% 的时间里都可以正常工作。

问题不在于数据库,因为我已经搜索了一些有问题的字段。

function enviaAssociado(CTITULAR) {
    if (CTITULAR) {
        $("#CTITULAR").remove();
        $.ajax({
            url: 'php_action/enviaAssociado.php',
            type: 'post',
            data: {
                CTITULAR: CTITULAR
            },
            success: function() {
                manageTable.ajax.reload();
                //$("#CTITULAR").val(response.CTITULAR);
            }
        });
    }
    manageTable.ajax.reload();
}

PHP

`

$CTITULAR = $_POST['CTITULAR'];


$sql = "UPDATE importsmiles4e.tb_conv
SET    STAT = CASE
     WHEN  STAT = 1 THEN 0
     WHEN  STAT = 0 THEN 1
     ELSE STAT
   END
WHERE  substring(CTITULAR,2,6) = '$CTITULAR'
";
$query = $connect->query($sql);

$CTITULAR = $_POST['CTITULAR'];


$sql = "UPDATE importsmiles4e.tb_conv3
SET    STAT = CASE
     WHEN  STAT = 1 THEN 0
     WHEN  STAT = 0 THEN 1
     ELSE STAT
   END
WHERE  substring(CTITULAR,2,6) = '$CTITULAR'";
$query = $connect->query($sql);


// close the database connection
$connect->close();

echo json_encode($sql);

`

桌子

while ($row = $query->fetch_assoc()) {

$active = '';

if($row['EMAIL'] != '') {
        $active = '<label class="label label-success">Cadastrado</label>';
    } else {
        $active = '<label class="label label-danger">Cadastrar</label>'; 
    }


$botao = '<a type="button" class="btn btn-default" onclick="enviaAssociado('.$row['CTITULAR'].') ">Alterar</a>';

$status = '';

if($row['STAT'] == '0'){
    $status ='<label class="label label-warning">Não</label>';  
}else{
    $status ='<label class="label label-success">Sim</label>';
}

$output['data'][] = array(
    $row['NOME'],
    $row['CPF'],
    $row['CEPRES'],
    $row['NROPROPOSTA'],
    $row['DTADMISSAO'],
    $row['DEPENDENTES'],
    $row['VLSMENS'],
    $status,
    $botao,
);

https://i.stack.imgur.com/KnD7w.png => 错误日志

https://i.stack.imgur.com/MhsDh.png => 出错时返回

成功时的返回相同,唯一的变化是值键,我已经检查了值是否损坏。

【问题讨论】:

  • 这是一个 JS 错误 .. 与 PHP 无关(简要查看)
  • 问题可能出在“onclick”属性值上。这些“CTITULAR”值是什么样的?
  • 查看产生错误的代码,而不是产生错误的代码。
  • @T.J.Crowder 哦,没看到 onclick ... 另一个原因 inline 很烂 xD
  • 好的,事实证明你有一个 onclick - 让你的 JS 和 PHP 完全分开会更好。它们的执行方式不同,并且可能导致意外行为。内联 JS 本身也是一种不好的做法

标签: javascript


【解决方案1】:

问题隐藏在您的一张屏幕截图中:

enviaAssociado(0516542.00)

前面的0 加上其中没有89 数字的事实(是的,really)使得legacy octal integer literal 处于松散模式。由于它是一个整数文字,它不能有小数点,所以从. 开始,这是一个语法错误。

如果这是一个数字,请让您的 PHP 代码从该数字中删除任何前导 0s。如果它是一个字符串,让你的 PHP 代码在引号中输出它。

如果您将数据从 PHP 输出到 JavaScript 代码,您通常最好通过 json_encode 这样做。如果您在属性中执行此操作(这不是最佳实践),您还需要htmlspecialchars。所以:

$botao = '<a type="button" class="btn btn-default" onclick="enviaAssociado('.htmlspecialchars(json_encode($row['CTITULAR'])).') ">Alterar</a>';

有时,该号码将包含 89,因此它会起作用(这就是您在此答案的已删除评论中给出的示例 0655178.00 起作用的原因)。这适用于松散模式,例如:

enviaAssociado(0655178.00)

注意8。 (9 会做同样的事情。)它之所以有效,是因为 8. 之前的数字部分,所以 JavaScript 解析器知道它不是传统的八进制整数文字,而是(尽量不要在这里笑)non-octal decimal integer literal,这是decimal integer literal 的一种特定类型,这意味着它可以是decimal literal 的第一部分,所以. 不是语法错误。这是 JavaScript 最黑暗的角落之一。 (使用严格模式是一个很好的理由,它不允许非八进制十进制整数文字。)

但这只是一个特殊情况,真正的问题是没有正确地从 PHP 输出到 JavaScript 代码(并且没有正确地转义放在 HTML 上下文中的东西,特别是在这种情况下是属性)。因此,尽管这个遗留的八进制整数文字是 JavaScript 的一个黑暗角落,但这不是真正的问题。真正的问题是确保在通过json_encode(在本例中为htmlspecialchars)从 PHP 输出到 JavaScript 时正确编码。

【讨论】:

  • 我尝试了 htmlspecialchars 没有成功这是在不改变结构的情况下解决这个问题的唯一方法吗?也谢谢你,至少问题找到了。
  • @MarcoFalcao - htmlspecialchars 绝对有效。你没有使用它,对吧?请参阅答案中的示例。 json_encode 部分很关键。
  • 我改变了,这个error 消失了,但仍然有相同的输出错误
  • @MarcoFalcao - 我不知道“相同的输出错误”是什么意思。如果您使用答案中的更新代码,您肯定不会再输出enviaAssociado(0516542.00)。它将是enviaAssociado(516542)enviaAssociado("0516542.00"),具体取决于$row['CTITULAR'] 是什么。显然,重要的是无论输出什么都是您的 ajax 端点期望看到的。
  • 你现在完全可以解决我在做更改时犯的错误错过了一个')',我很抱歉浪费了你的时间,但非常感谢你拯救我的一天,我快要发疯了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多