PHP, MySQL, jQuery, AJAX: данные json возвращают правильный ответ, но интерфейс возвращает ошибку - PullRequest
2 голосов
/ 27 мая 2010

У меня есть форма регистрации пользователя. Я делаю проверку на стороне сервера на лету через AJAX. Краткое изложение моей проблемы состоит в том, что после проверки 2 полей я получаю ошибку для проверки второго поля. Если я прокомментирую первое поле, то во 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">

$(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)); 
}

?>

ПРОБЛЕМА:

Пока я проверяю $_POST['email'], а также $_POST['confirm_email'] в файле check_ajax2.php, проверка для поля verify_email всегда возвращает ошибку. Однако, обладая ограниченными знаниями о Firebug, я узнал, что при вводе адреса электронной почты и verify_email в полях были следующие ответы:

ОТВЕТ 1: {"success": "y", "msg_email": "Электронная почта доступна"}

ОТВЕТ 2: {"success": "y", "msg_email": "Электронная почта доступна"} {"success": "n", "msg_confirm_email": "Электронная почта и подтверждение электронной почты НЕ совпадают."}

Хотя RESPONSE 2 показывает, что мы получаем правильное сообщение через msg_confirm_email, во внешнем интерфейсе появляется предупреждение «Некоторая ошибка» (я включил предупреждение для отладки). Я потратил 48 часов, пытаясь изменить каждую часть кода везде, где это возможно, но без особого успеха. Что странно в этом, так это то, что если я прокомментирую валидацию для поля $_POST['email'] полностью, то валидация для поля $_POST['confirm_email'] будет отображаться корректно без каких-либо ошибок. Если я включу его обратно, оно корректно проверяет поле электронной почты, но когда оно достигает точки проверки поля verify_email, оно снова показывает мне ошибку.

Я также пытался переименовать переменную успеха на странице check_ajax2.php в другие имена для $_POST['email'] и $_POST['confirm_email'], но безуспешно. Я буду добавлять дополнительные поля в форму и проверять их на странице check_ajax2.php. Поэтому я не планирую использовать разные страницы ajax для проверки каждого из этих полей (и я не думаю, что это разумно делать так). Я не гуру JQuery или AJAX, поэтому вся помощь в решении этой проблемы очень ценится.

Заранее спасибо.

1 Ответ

2 голосов
/ 27 мая 2010

Обработчик ошибок вызывается, если код состояния 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...