【问题标题】:Unexpected end of JSON input - Uncaught SyntaxErrorJSON 输入的意外结束 - 未捕获的 SyntaxError
【发布时间】:2017-01-05 08:09:22
【问题描述】:

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

这是我的 jQuery:

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');
    }
});

这是getInfo.php:

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;
}

即使$obj 包含值,从 PHP 传递的数据也是空的(我通过回显它们检查了这一点)所以这一定是echo json_encode($obj); 语句的问题。

解决方案

我终于找到了答案 - Link。这是编码问题。如果某些字符串不是 UTF-8,json_encode() 将返回空字符串,因此您需要将这些字符串转换为 UTF-8。

【问题讨论】:

  • 在成功处理程序中添加console.log(data) 作为第一行以检查服务器响应。我敢打赌,在您的 JSON 字符串的末尾/之前有一些额外的代码会导致错误...
  • 尝试在你的 ajax 调用中添加 dataType:"json"
  • 您应该使用对象作为 ajax data 而不是自己构建字符串。像这样:data: { email: email, password: password }.
  • @Philipp 我试过了,但没有响应。 @Mir 如果我添加 dataType: 'json' 会发生错误。
  • @eisbehr 如果更改此设置,错误仍然存​​在。

标签: php jquery json ajax


【解决方案1】:

既然你提到:成功函数没有收到任何数据

服务器响应似乎是空的,因为 (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. 作为条件(方法 == 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. 1234563 () 函数。

在测试每个步骤时,您应该快速找出哪个部分不工作。

【讨论】:

  • 我已经测试了这四个步骤,一切正常。数组 $obj 有值(我通过回显它的值来检查它)但不知何故 echo json_encode($obj); 没有返回任何 AJAX。
【解决方案2】:

您似乎没有在使用结果之前检查您的execute 是否成功。

如果我是你,我会先尝试console.log(data),然后再使用jsonParse。我想你会发现一些惊喜。

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

【讨论】:

  • 我已经尝试过console.log(data),但没有任何内容写入控制台。 Apache 日志中也没有错误或警告。
  • 我怀疑SQL是错误的;也许您的prepareInput() 修改了密码或电子邮件地址,SQL 没有返回任何结果。
猜你喜欢
  • 2023-03-03
  • 2015-08-05
  • 2021-01-09
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多