4

次のメソッドを使用してphpを呼び出しています:

function validateEmaiAjax(email){
    val = null;
    $("#warning").load("https://localhost/Continental%20Tourism/register_ajax.php",{email: email}, function(rspns, stat, xml){
        val = rspns;
    });

    if(val == ".")
        return true;
    else {
        return false;
    }
}

私のphpコードは次のとおりです。

<?php
    $dbc = mysqli_connect("localhost","root","pass","continental_tourism") OR die(mysqli_connect_error());

    $email = $_REQUEST['email'];

    $query = "SELECT email FROM customer_info WHERE email = '$email' ";

    $r = mysqli_query($dbc, $query) OR die(mysqli_error($dbc));

    if(mysqli_num_rows($r) > 0)
        echo "Email address exists!";
    else
        echo ".";   
?>

基本的に、これはデータベースをチェックし、電子メールが存在する場合は「電子メールアドレスが存在します!」と表示されます。そうでない場合はreturn true(だから「.」をエコーし​​て比較します)。奇妙なことは、プログラムの近くでfirebugを使用してブレークポイントを配置すると、if(val == ".")正しく動作し、trueを返すことです。そのブレークポイント関数を削除すると、常に false が返されます。なぜこれが起こるのか理解できません。助けてください!ありがとう。

4

4 に答える 4

7

この問題が発生する理由は、非同期リクエストを実行したためです。これはif(rspns == ".")、応答がサーバーから受信される前に に到達し、結果が常に になることを意味しますfalse

このコードをブール値を返し、コールバック関数 (ブロッキング プロシージャ) を必要としない関数でラップするには、同期要求を使用する必要があります。

function validateEmaiAjax(email) {

  // This is the correct way to initialise a variable with no value in a function
  var val;

  // Make a synchronous HTTP request
  $.ajax({
    url: "https://localhost/Continental%20Tourism/register_ajax.php",
    async: false,
    data: {
      email: email
    },
    success: function(response) {
      // Update the DOM and send response data back to parent function
      $("#warning").html(response);
      val = response;
    }
  });

  // Now this will work
  if(val == ".") {
    return true;
  } else {
    $("#warning").show();
    return false;
  }

}
于 2012-04-17T17:20:11.727 に答える
2

そのコードを機能させたい場合は、loadの代わりに$ .ajaxメソッドを使用し、asyncをfalseに設定して、応答を待機させる必要があります。

http://api.jquery.com/jQuery.ajax/

$.ajax({
 url:"https://localhost/Continental%20Tourism/register_ajax.php",
 async: false,
 data: {email: email}, 
 success: function(rspns, stat, xml){ 
   val = rspns; 
  }
 });
于 2012-04-17T17:16:05.053 に答える
2

なぜこれ

else {
    return false;
    $("#warning").show();
}

$("#warning").show();実行されることはありません。

編集:そこに行きます:

function validateEmaiAjax(email){
    var URL     = 'https://localhost/Continental%20Tourism/register_ajax.php';
    var Args    = {email: email}

    $('#warning').load(URL, Args, function(html){
        if(html == '.'){
            return true;
        } else {
            $('#warning').show();
            return false;
        }
    });

    return false;
}

または、これも試すことができます:

function validateEmaiAjax(email){
    var URL     = 'https://localhost/Continental%20Tourism/register_ajax.php';
    var Args    = {email: email}

    $.ajax({
        url:     URL,
        type:    'GET'
        data:    Args,
        success: function(html){
            if(html == '.'){
                return true;
            } else {
                $('#warning').show();
                return false;
            }
        }
    });

    return false;
}
于 2012-04-17T17:07:20.103 に答える
0

これは、関数が実行され続けif(val == ".")、ajax 応答が返される前にヒットするためです。ajax コールバック関数内の if ステートメント全体が必要です。

function validateEmaiAjax(email){
    var success;
    $("#warning").load("https://localhost/Continental%20Tourism/register_ajax.php",{email: email}, function(rspns, stat, xml){
        if(rspns == ".")
            success = true;
        else {
            $("#warning").show();
            success = false;
        }
    });
    return success;
}

また、実行されるように、警告の表示と戻りを交換しました

于 2012-04-17T17:08:24.173 に答える