PHP, MySQL, jQuery, AJAX: json veri döner, doğru cevap ama önyüz döndürür hata

1 Cevap php

Ben bir kullanıcı kayıt formu var. Ben AJAX yoluyla anında sunucu tarafı doğrulama yapıyorum. Benim sorunun kısa bir özeti 2 alanları doğrulayarak üzerine, ben ikinci alan doğrulama hatası olsun. Ben ilk alan yorumda, daha sonra 2 alan herhangi bir hata görünmüyor. Bu garip davranışları vardır. Daha fazla detaylar aşağıda:

HTML, JS ve PHP kod aşağıda:

HTML FORM:

<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 code:

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

?>

THE PROBLEM:

Sürece Ben check_ajax2.php dosyasındaki $_POST['email'] gibi $_POST['confirm_email'] doğrulayarak olduğum gibi, confirm_email alan için doğrulama daima bir hata döndürür. Firebug benim sınırlı bilgi ile, ancak, ben alanlarında e-posta ve confirm_email girildiğinde aşağıdaki tepkiler olduğunu öğrendin:

RESPONSE 1: {"success":"y","msg_email":"Email available"}

RESPONSE 2: {"success":"y","msg_email":"Email available"}{"success":"n","msg_confirm_email":"Email and Confirm Email do NOT match."}

YANIT 2 biz ön sonunda, msg_confirm_email aracılığıyla doğru mesajı alan olduğunu göstermektedir rağmen, uyarı 'Bazı hatası' (Ben hata ayıklama için uyarı etkinleştirdikten) popping edilir. Ben mümkün kodun her bölümünü değiştirmek için çalışıyoruz 48 saat geçirdim, ama sadece çok az bir başarı ile gelmiştir. Bu konuda ne garip ben tamamen $_POST['email'] alanın doğrulama yorum varsa, o zaman $_POST['confirm_email'] alanın doğrulama hataları olmadan görüntüleme doğru olmasıdır. Onu geri etkinleştirirseniz, doğru e-mail alanını doğrularken, ancak confirm_email alan doğrulama noktasına ulaştığında, tekrar bana hata gösteriyor.

Ayrıca diğer iki farklı $_POST['email'] ve $_POST['confirm_email'] için isimler ancak başarı için check_ajax2.php Sayfası başarı değişken adlandırma çalıştık. Ben formda fazla alan ekleyerek ve check_ajax2.php sayfa içinde doğrulayarak edilecektir. Yani bu alanların her biri doğrulanması için farklı ajax sayfalarını kullanarak planlama değilim (ve ben bunu bu şekilde yapmak için akıllı olduğunu sanmıyorum). Ben bir jquery veya AJAX guru değilim, bu yüzden bu sorunu çözme konusunda tüm yardım son derece takdir edilmektedir.

Şimdiden teşekkür ederim.

1 Cevap

Tepki başarısız bir ayrıştırma olduğunda HTTP durum kodu hata göstergesi olarak ise, hata işleyicisi denir.

I {"success":"y","msg_email":"Email available"}{"success":"n","msg_confirm_email":"Email and Confirm Email do NOT match."} geçerli bir JSON değil çünkü hata işleyicisi YANIT 2 aldıktan sonra çağrıldığını olduğunu düşünüyorum. Sen de validator kullanabilirsiniz: http://jsonlint.com/.

Lütfen PHP, sen alt ve üst baskı json_encode($response_object) bir $response_object dizi tanımlayabilirsiniz:

<?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);

I mysql_real_escape_string SQL enjeksiyonu önlemek için çağrı eklenen unutmayın.