PHP、MySQL、jQuery、AJAX:json 数据返回正确响应但前端返回错误

Posted

技术标签:

【中文标题】PHP、MySQL、jQuery、AJAX:json 数据返回正确响应但前端返回错误【英文标题】:PHP, MySQL, jQuery, AJAX: json data returns correct response but frontend returns error 【发布时间】:2011-02-24 19:21:54 【问题描述】:

我有一个用户注册表单。我正在通过 AJAX 即时进行服务器端验证。我的问题的快速总结是,在验证 2 个字段时,第二个字段验证出现错误。如果我评论第一个字段,那么第二个字段不会显示任何错误。它有这种奇怪的行为。更多详情如下:

html、JS、php代码如下:

HTML 表格:

<form id="SignupForm" action="">
    <fieldset>
        <legend>Free Signup</legend>
        <label for="username">Username</label>
        <input name="username" type="text" id="username" /><span id="status_username"></span>
        <br />
        <label for="email">Email</label>
        <input name="email" type="text" id="email" /><span id="status_email"></span>
        <br />
        <label for="confirm_email">Confirm Email</label>
        <input name="confirm_email" type="text" id="confirm_email" /><span id="status_confirm_email"></span>
        <br />
    </fieldset>
    <p>
        <input id="sbt" type="button" value="Submit form" />
    </p>
</form>

JS:

<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>

<script type="text/javascript">
$(document).ready(function() 

  $("#email").blur(function() 
    var email = $("#email").val();
    var msgbox2 = $("#status_email");
    if (email.length > 3) 
      $.ajax(
        type: 'POST',
        url: 'check_ajax2.php',
        data: "email=" + email,
        dataType: 'json',
        cache: false,
        success: function(data) 
          if (data.success == 'y') 
            alert('Available');
           else 
            alert('Not Available');
          
        
      );
    
    return false;
  );

  $("#confirm_email").blur(function() 
    var confirm_email = $("#confirm_email").val();
    var email = $("#email").val();
    var msgbox3 = $("#status_confirm_email");

    if (confirm_email.length > 3) 
      $.ajax(
        type: 'POST',
        url: 'check_ajax2.php',
        data: 'confirm_email=' + confirm_email + '&email=' + email,
        dataType: 'json',
        cache: false,
        success: function(data) 
          if (data.success == 'y') 
            alert('Available');
           else 
            alert('Not Available');
          
        ,
        error: function(data) 
          alert('Some error');
        
      );
    
    return false;
  );
);
</script>

PHP 代码:

<?php //check_ajax2.php


if(isset($_POST['email']))

    $email = $_POST['email'];


    $res = mysql_query("SELECT uid FROM members WHERE email = '$email' ");
    $i_exists = mysql_num_rows($res);

    if( 0 == $i_exists )
    
        $success = 'y';
        $msg_email = 'Email available';
    
    else
    
        $success = 'n';
        $msg_email = 'Email is already in use.</font>';
    

    print json_encode(array('success' => $success, 'msg_email' => $msg_email)); 


if(isset($_POST['confirm_email']))

    $confirm_email = $_POST['confirm_email'];
    $email = ( isset($_POST['email']) && trim($_POST['email']) != '' ? $_POST['email'] : '' );



    $res = mysql_query("SELECT uid FROM members WHERE email = '$confirm_email' ");
    $i_exists = mysql_num_rows($res);


    if( 0 == $i_exists ) 
    
        if( isset($email) && isset($confirm_email) &&  $email == $confirm_email )
        
            $success = 'y';
            $msg_confirm_email = 'Email available and match';
        
        else
        
            $success = 'n';
            $msg_confirm_email = 'Email and Confirm Email do NOT match.';
               
    
    else
    
        $success = 'n';
        $msg_confirm_email = 'Email already exists.';
    

    print json_encode(array('success' => $success, 'msg_confirm_email' => $msg_confirm_email)); 


?>

问题:

只要我在 check_ajax2.php 文件中验证 $_POST['email']$_POST['confirm_email'],confirm_email 字段的验证总是会返回错误。然而,由于我对 Firebug 的了解有限,当我在字段中输入 email 和 confirm_email 时,我确实发现以下是响应:

回应 1: "success":"y","msg_email":"邮箱可用"

回应 2: "success":"y","msg_email":"Email available""success":"n","msg_confirm_email":"Email 和 Confirm Email 不匹配。"

虽然 RESPONSE 2 显示我们通过 msg_confirm_email 收到了正确的消息,但在前端,弹出“一些错误”警报(我已启用警报以进行调试)。我花了 48 小时尝试尽可能地更改代码的每一部分,但收效甚微。奇怪的是,如果我完全评论 $_POST['email'] 字段的验证,那么 $_POST['confirm_email'] 字段的验证会正确显示而没有任何错误。如果我重新启用它,它正在正确验证电子邮件字段,但是当它到达验证确认电子邮件字段时,它再次向我显示错误。

我还尝试将 check_ajax2.php 页面中的成功变量重命名为 $_POST['email']$_POST['confirm_email'] 的其他不同名称,但没有成功。我将在表单中添加更多字段并在 check_ajax2.php 页面中进行验证。所以我不打算使用不同的 ajax 页面来验证每个字段(而且我认为这样做并不明智)。我不是 jquery 或 AJAX 专家,因此非常感谢所有帮助解决此问题的人。

提前谢谢你。

【问题讨论】:

【参考方案1】:

如果 HTTP 状态代码指示错误以及响应解析失败,则会调用错误处理程序。

我认为在收到 RESPONSE 2 时会调用您的错误处理程序,因为 "success":"y","msg_email":"Email available""success":"n","msg_confirm_email":"Email and Confirm Email do NOT match." 不是有效的 JSON。您可以在以下地址使用验证器:http://jsonlint.com/。

在您的 PHP 中,您可以在顶部定义一个 $response_object 数组并在底部打印 json_encode($response_object)

<?php //check_ajax2.php

$response_object = array('success' => 'y');

if(isset($_POST['email']))

    $email = $_POST['email'];


    $res = mysql_query("SELECT uid FROM members WHERE email = '" . mysql_real_escape_string($email)  . "' ");
    $i_exists = mysql_num_rows($res);

    if( 0 == $i_exists )
    
        $msg_email = 'Email available';
    
    else
    
        $response_object['success'] = 'n';
        $msg_email = 'Email is already in use.';
    

    $response_object['msg_email'] = $msg_email; 


if(isset($_POST['confirm_email']))

    $confirm_email = $_POST['confirm_email'];
    $email = ( isset($_POST['email']) && trim($_POST['email']) != '' ? $_POST['email'] : '' );



    $res = mysql_query("SELECT uid FROM members WHERE email = '" . mysql_real_escape_string($confirm_email) . "' ");
    $i_exists = mysql_num_rows($res);


    if( 0 == $i_exists ) 
    
        if( isset($email) && isset($confirm_email) &&  $email == $confirm_email )
        
            $msg_confirm_email = 'Email available and match';
        
        else
        
            $response_object['success'] = 'n';
            $msg_confirm_email = 'Email and Confirm Email do NOT match.';
              
    
    else
    
        $response_object['success'] = 'n';
        $msg_confirm_email = 'Email already exists.';
    

    $response_object['msg_confirm_email'] = $msg_confirm_email; 


print json_encode($response_object);

请注意,我添加了对 mysql_real_escape_string 的调用以帮助防止 SQL 注入。

【讨论】:

+1。非常感谢您的解决方案,丹尼尔。它就像一个魅力。此外,我尝试了您为验证 json 响应提供的链接,但是当我点击验证按钮时,它给了我解析失败的结果。我给它输入了 "success":"y","msg_email":"Email available""success":"n","msg_confirm_email":"Email and Confirm Email do NOT match." .Did我做正确的事?抱歉,我是您提供给我的链接以及问题的新手。 我很高兴它成功了!是的,你在做正确的事。它显示“解析失败”,因为字符串 "success":"y","msg_email":"Email available""success":"n","msg_confirm_email":"Email and Confirm Email do NOT match." 不是有效的 JSON。基本上,如果 jsonlint 网站显示“解析失败”,那么您就知道 jQuery 会调用您的错误处理程序。 非常感谢您花时间解释它。欣赏它。另外我只是想知道您是否知道我可以使用任何方法来缩短各个字段的 php 错误检查代码?我的意思是,目前对于我需要验证的每个字段,我将不得不在 JS 和 PHP 处理中添加相应的代码。那么有什么方法可以让 JS(首选)和 PHP 中的代码保持简单,以验证这些代码,而无需分别为每个代码编写代码?如果有的话请告诉我。输入单独的代码和错误检查已经太麻烦了! 是的。 PHP 框架可以帮助您减少必须编写的验证代码量。我建议您花时间学习几个 PHP 框架:CakePHP(当您的网站高度依赖数据库驱动时(CRUD:创建、读取、更新和删除))和 CodeIgniter(适用于全方位的优秀框架)。学习和设置它们需要一些时间,但是即使您只使用其中的一些功能,框架的好处也值得投入时间。例如,请参阅codeigniter.com/user_guide/libraries/form_validation.html 您好丹尼尔,非常感谢您提供的链接。 PHP 验证在某种程度上是易于管理的,而我正在尝试真正解决的是 JS 验证。是否有任何可能引用缩短 JS 验证代码的链接?

以上是关于PHP、MySQL、jQuery、AJAX:json 数据返回正确响应但前端返回错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 AJAX + jQuery + PHP 将数据发送到 MySQL

复选框状态更改时如何更新mysql字段?使用 jquery (ajax)、php 和 mysql

使用 PHP、MySQL、Jquery 和 Ajax 创建 5 星评级系统

使用 Jquery、AJAX 和 PHP 从 MySQL 数据库中检索数据

AJAX PHP MYSQL 更新/编辑记录 (jQuery)

使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能