2010-05-27 3 views
2

사용자 등록 양식이 있습니다. 나는 AJAX를 통해 즉시 서버 측 유효성 검사를하고있다. 내 문제에 대한 요약은 두 필드의 유효성을 검사 할 때 두 번째 필드 유효성 검사에 오류가 발생합니다. 첫 번째 필드에 주석을 달면 두 번째 필드에 오류가 표시되지 않습니다. 이 이상한 행동이 있습니다. 아래 자세한 내용은 :PHP, MySQL, jQuery, AJAX : json 데이터가 올바른 응답을 반환하지만 프론트 엔드가 오류를 반환합니다.

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

?> 

인한 문제 :

만큼 내가 check_ajax2.php 파일의 $_POST['email']뿐만 아니라 $_POST['confirm_email']의 유효성을 검사하고 같이 이메일 확인 필드에 대한 유효성 검사가 항상 오류를 반환합니다.

응답 : 1 : { "성공": "Y", "msg_email 나는 분야에서 이메일과 이메일 확인을 입력 할 때 방화범의 내 제한된 지식, 그러나, 나는 다음은 응답을했다 알아낼 않았다 ":"이메일 사용 가능 "}

응답 2 : {"성공 ":"Y ","msg_email ":"이메일 사용 가능 "} {"성공 ":"N ","msg_confirm_email ":"이메일 확인 이메일이 일치하지 않습니다. "}

응답 2는 msg_confirm_email을 통해 올바른 메시지를 수신하고 있음을 나타냅니다. nt end, 'Some error'라는 경고가 나타납니다 (디버깅을 위해 경고를 활성화했습니다). 가능한 한 코드의 모든 부분을 변경하려고 48 시간을 보냈지 만 성공은 거의 없습니다. 이상한 점은 $_POST['email'] 필드의 유효성 검증을 완전히 주석 처리하면 $_POST['confirm_email'] 필드의 유효성 검증이 오류없이 올바르게 표시된다는 것입니다. 다시 활성화하면 전자 메일 필드의 유효성을 올바르게 검사하지만 confirm_email 필드의 유효성 검사 시점에 도달하면 다시 오류를 표시합니다.

또한 check_ajax2.php 페이지에서 성공 변수 이름을 $_POST['email']$_POST['confirm_email']에 대한 다른 이름으로 바꾸려고 시도했지만 성공하지 못했습니다. 폼에 더 많은 필드를 추가하고 check_ajax2.php 페이지에서 유효성을 검사 할 것입니다. 따라서 각 필드의 유효성을 검사하기 위해 서로 다른 아약스 페이지를 사용할 계획이 아닙니다. 그런 식으로 그렇게하는 것이 현명하지 않다고 생각합니다. 나는 jquery 또는 AJAX 전문가가 아니기 때문에이 문제를 해결하는 데 도움을 주실 수 있습니다.

미리 감사드립니다.

답변

2

오류 처리기는 HTTP 상태 코드가 오류를 나타내며 응답 구문 분석에 실패 할 경우 호출됩니다.

{"success":"y","msg_email":"Email available"}{"success":"n","msg_confirm_email":"Email and Confirm Email do NOT match."}이 유효한 JSON이 아니기 때문에 오류 처리기가 RESPONSE 2를 받으면 호출되는 것 같습니다. 유효성 검사기는 http://jsonlint.com/에서 사용할 수 있습니다.당신의 PHP에서

, 당신은 상단에 $response_object 배열을 정의하고 하단에 json_encode($response_object)를 인쇄 할 수 있습니다 : 나는 mysql_real_escape_string에 전화를 추가

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

참고 SQL 주입을 방지 할 수 있습니다.

+0

+1. 해결책을 가져 주셔서 고맙습니다, 대니얼. 그것은 매력처럼 작동했습니다. 또한 json 응답의 유효성을 검사하기 위해 나에게 준 링크를 시도했지만 유효성 검사 단추를 누르면 파싱에 실패하여 결과가 나에게 표시됩니다. { "success": "y", "msg_email": "Email available"} { "success": "n", "msg_confirm_email": "이메일과 이메일 확인이 일치하지 않습니다."}. 나는 옳은 일을합니까? 미안 해요, 당신이 저에게 준 링크에 대한 총 초보자입니다. 따라서 질문을 던집니다. – Devner

+0

나는 그것이 기뻤다. 네, 옳은 일을하고 있습니다. { "success": "y", "msg_email": "Email available"} { "success": "n", "msg_confirm_email": "전자 메일 및 전자 메일 확인은 일치하지 않으므로 구문 분석에 실패했습니다" "}'은 (는) 유효한 JSON이 아닙니다. 기본적으로 jsonlint 웹 사이트에서 "Parsing failed"라고 표시되면 jQuery가 오류 처리기를 호출한다는 것을 알 수 있습니다. –

+0

설명해 주셔서 감사합니다. 고맙습니다. 또한 개별 필드에 대한 PHP 오류 검사 코드를 단축하는 데 사용할 수있는 방법을 알고 있는지 궁금합니다. 이것이 의미하는 바는 현재 유효성을 검사해야하는 각 필드에 대해 JS 및 PHP 처리에 해당 코드를 추가해야한다는 것입니다. 그렇다면 각각의 코드를 별도로 작성하지 않고 JS (선호) 및 PHP에서 코드를 간단하게 유지할 수있는 방법이 있습니까? 어떤 것이 있는지 알려주세요. 이미 개별 코드 및 오류 검사를 입력하는 데 너무 많은 문제가 있습니다! – Devner

관련 문제