我正在建立一个有按钮的桌子。当用户单击此按钮时,行的状态发生变化,在表中该字段代表具有0或1的字段。很好,我做了按钮,但在某些行中遇到错误,错误是参数后出现Uncaught SyntaxError:missing)列表,我非常困惑,因为代码在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 =>错误返回
成功相同时返回的唯一值就是值键,我已经检查了值是否损坏。
答案 0 :(得分:5)
问题被隐藏在您的其中一张屏幕截图中:
enviaAssociado(0516542.00)
前导0
与其中没有8
或9
数字(是的,really)相结合的事实使得legacy octal integer literal宽松模式。由于它是整数文字,因此不能有小数点,因此自.
起,这是语法错误。
如果这是一个数字,请让您的PHP代码删除该数字中的所有前导0
。如果要使用字符串,则将您的PHP代码用引号引起来。
如果您从PHP将数据输出到JavaScript代码,通常最好通过json_encode
这样做。如果要在属性中执行此操作(这不是最佳做法),则还需要htmlspecialchars
。所以:
$botao = '<a type="button" class="btn btn-default" onclick="enviaAssociado('.htmlspecialchars(json_encode($row['CTITULAR'])).') ">Alterar</a>';
有时,数字将包含8
或9
,因此它将起作用(这就是为什么您在此答案中删除了评论的示例0655178.00
起作用的原因)。可以在宽松模式下使用,例如:
enviaAssociado(0655178.00)
请注意8
。 (9
会做同样的事情。)之所以起作用,是因为8
位于.
之前的数字部分,因此JavaScript解析器知道它不是旧的八进制数整数文字,而不是non-octal decimal integer literal(这是decimal integer literal的一种特殊类型,decimal literal),这意味着它可以是{{3}}的第一部分,因此.
不是语法错误。这是JavaScript的深深黑角之一。 (这也是使用严格模式的充分理由,严格模式不允许使用非八进制十进制整数文字。)
但是,这只是一个特殊情况,即真正的问题没有正确地从PHP输出到JavaScript代码(并且没有正确地转义HTML上下文中放置的某些内容,在这种情况下特别是属性)。因此,尽管这种传统的八进制整数文字内容是JavaScript的一个深深黑角,但这并不是真正的问题。真正的问题是,确保通过json_encode
(在本例中为htmlspecialchars
)从PHP输出到JavaScript时,正确编码内容。