JSON输入的意外结束 - 未捕获的SyntaxError

时间:2016-08-29 10:17:14

标签: php jquery json ajax

大家。我有一个AJAX调用,它返回标题中提到的错误。我相信这是导致错误的行:NavigationPage也许我错误地构建了var obj = jQuery.parseJSON(data);

这是我的jQuery:

userData

这是getInfo.php:

var userData = 'email=' + email + '&password=' + password; 

$.ajax({
    type: 'POST',
    url: './api/getInfo.php',
    data: userData,
    success: function(data){
        var obj = jQuery.parseJSON(data); 

        $('#name').html(obj.firstName + ' ' + obj.lastName);
        ...
    },
    error: function(){
        alert('ERROR');
    }
});

有人可以告诉我,我做错了吗?

更新

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
     $email = prepareInput($_POST['email']);
     $password = prepareInput($_POST['password']);

     $stmt = $connection->conn->prepare('SELECT firstName,lastName,... FROM tb_users WHERE email = ? AND password = ?');
     $stmt->bind_param('ss',$email,$password);

     $stmt->execute();

     $result = $stmt->get_result();

     $obj = $result->fetch_assoc();

     echo json_encode($obj);
}

即使function prepareInput($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } 包含值(我通过回显它们来检查),从PHP传递的数据也是空的,因此它必须是$obj语句的问题。

我终于找到了答案 - Link 。这是编码问题。如果某些字符串不是UTF-8 echo json_encode($obj);将返回空字符串以便处理此字符串,则需要将这些字符串转换为UTF-8。

2 个答案:

答案 0 :(得分:3)

因为你提到:成功函数没有收到任何数据

服务器响应似乎是空的,因为(a)凭据错误或(b)PHP中存在错误,您的代码永远不会到达echo行。

在PHP中添加一些错误处理/确认,并确保$ obj在返回之前有一个值。

try {
  // ... sql code

  if ( $obj && is_array( $obj ) ) {
    echo json_encode( $obj );
  } else {
    echo json_encode( array( 'error' => 'wrong username or password' ) );
  }
} catch (Exception $ex) {
  echo json_encode( array( 'error' => $ex->getMessage() ) );
}

<强>更新;用于调试SQL的注释

测试SQL:

  1. 作为条件中的第一行(method == POST)添加echo json_encode(array('resp'=>'test')); exit;并运行Ajax代码。 您的console.log()现在应该显示{resp:test} JSON对象。这样你就知道你的ajax调用实际上是通过SQL到达的部分。如果你仍然没有得到任何输出,那么你的代码中还有其他错误......

  2. 首先使用硬编码的SQL:只需在WHERE中输入电子邮件/密码即可获得结果。不要使用->bind_param()$_POST数据,只需执行纯SQL语句并查看AJAX是否返回值。

  3. 如果Ajax现在可以使用,则修改硬编码的SQL以将静态电子邮件/密码字符串移动到bind_param()。现在仍然没有使用$_POST数据,但我们检查bind_param方法是否有效。再次检查Ajax是否仍在工作。

  4. 如果仍然有效,那么在bind_param()调用中使用direkt $ _POST数据,如->bind_param('ss', $_POST['email'], $_POST['password']) - 如果这样做,那么你知道它有问题prepareInput()函数。

  5. 在测试每个步骤时,您应该快速找出哪个部分无效。

答案 1 :(得分:0)

在使用结果之前,您似乎无法检查execute是否成功。

如果我是你,我会在使用console.log(data)之前尝试jsonParse。我想你会发现一些惊喜。

另外,请检查您的apache日志。也许PHP会给你一些警告。