【问题标题】:Custom JSON error response fails when no error没有错误时自定义 JSON 错误响应失败
【发布时间】:2020-08-21 17:37:41
【问题描述】:

这对我来说是一个新领域。

我创建了自定义 JSON 错误输出,以在用户输入已存在的姓名和/或电子邮件时提醒用户。我正在尝试吐出错误,然后如果不存在错误,请继续。 不幸的是,我在 Firefox 控制台中收到以下消息:“未捕获的语法错误:JSON.parse:JSON 数据第 2 行第 1 行的 JSON 数据后出现意外的非空白字符。”这很奇怪,因为我设置了 3 个 JSON 错误变体,它们正在工作(1 个姓名、2 个电子邮件、3 个姓名和电子邮件),但只有当这些条件都不满足时才会失败。

我尽可能地精简了下面的代码。经过多次测试,除上述问题外,其他一切正常。

HTML 表单

<form method='post' id='part03'>
  <input type='text' id='name' placeholder='Enter your name'>
  <input type='email' id='email' placeholder='Enter your email'>
  <input type='button' id='submit'>
</form>

PHP

<?php
header('Content-type: application/json');

// Get name & check if exists
$name = mysqli_real_escape_string($con_usr_pub, $_POST['name']);
$check_name = mysqli_query($con, "select name from table where name='$name'");
if (mysqli_num_rows($check_name) > 0)
{
    $name_error = true;
}
else
{
    $name_error = false;
}

// Get email & check if exists
$email = mysqli_real_escape_string($con_usr_pub, $_POST['email']);
$check_email = mysqli_query($con, "select email from table where email='$email'");
if (mysqli_num_rows($check_name) > 0)
{
    $name_error = true;
}
else
{
    $name_error = false;
}

// JSON name error
if ($name_error == true && $email_error == false)
{
    $response = "Sorry, the name you entered is already in use.";
}
// JSON email error
if ($name_error == false && $email_error == true)
{
    $response = "Sorry, the email you entered is already in use.</p>";
}
// JSON name & email error
if ($name_error == true && $email_error == true)
{
    $response = "Sorry, both the name and email you entered are already in use.";
}
// JSON no error
if ($name_error == false && $email_error == false)
{
    $response = "continue";
}

echo json_encode($response);
?>
 

JS

// AJAX - Name & Email
$(document).on('click', '#submit', function() {
  var name = $("#name").val();
  var email = $("#email").val();
  $.ajax({
    url: "myserverfile.php",
    method: "POST",
    data: {
      name: name,
      email: email
    },
    dataType: "text",
    success: function(response) {
      var json = $.parseJSON(response);
      if (json === "continue") {
        alert("YES");
      } else {
        alert(json);
      }
    }
  });
});

使用: jQuery 3.4.1 PHP 7.4

【问题讨论】:

标签: javascript php jquery json ajax


【解决方案1】:

问题是,当您期望 JSON 响应并从后端返回编码为 json 的字符串时,您使用的是 dataType: text,而是使用 ``dataType: json` 并在后端,JSON 编码一个数组,如:

    $response=[];

    // JSON name error
    if ($name_error == true && $email_error == false)
    {
        $response['text'] = "Sorry, the name you entered is already in use.";
    }
    // JSON email error
    if ($name_error == false && $email_error == true)
    {
        $response['text']  = "Sorry, the email you entered is already in use.</p>";
    }
    // JSON name & email error
    if ($name_error == true && $email_error == true)
    {
        $response['text']  = "Sorry, both the name and email you entered are already in use.";
    }
    // JSON no error
    if ($name_error == false && $email_error == false)
    {
        $response['text']  = "continue";
    }

    echo json_encode($response);

然后将你的成功方法改为:

dataType: "json",
success: function(response) {
      var json = $.parseJSON(response);
      if (json.text === "continue") {
        alert("YES");
      } else {
        alert(json.text);
      }
    }

【讨论】:

  • 感谢您的示例,我尝试了此操作,但出现错误:“未捕获的语法错误:JSON.parse:JSON 数据的第 2 行第 1 列的 JSON 数据后出现意外的非空白字符”同样的事情是不满足三个条件时发生。不知道发生了什么。
  • @SJacks啊,请把dataType: "text",改成dataType: "json",
  • PS:var json = $.parseJSON(response); 设置时不需要dataType: "json",因为response.text 已经存在可以使用。
  • @WesleySmith 停止了一切工作。在查看了关于 JSON 解析的 jQuery 信息并让它现在工作之后,我又搞砸了一些。感谢您的帮助:)
【解决方案2】:

在查看 jQuery 文档并将我的变量名更改为“e”而不是“json”后想通了。

工作 JS

 // AJAX - Name & Email
 $(document).on('click','#submit',function() {
 var name=$("#name").val();
 var email=$("#email").val();
 $.ajax({
 url:"myserverfile.php",
 method:"POST",
 data:{name:name,email:email},
 dataType:"text",
 success:function(response) {
 var e = jQuery.parseJSON(response);
 if (e == "continue") {
 // Continue on
 alert("YES");
 } else {
 alert(e);
 }
 }
 });
 });

注意:有一个小问题,它有点慢/反应迟钝(双关语不是故意的) - 我已经通过删除 php 中的 json 数组来解决这个问题,因为它不是必需的。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多