0

登録フォームを設置しています。このフォームには、検証のためにテストされている 7 つのフィールドがあります。そのうちの 2 つは特別な検証があります。このクラスに email_string を送信する PHP クラスへの Ajax 呼び出しがあり、そのような電子メールがデータベースに既に存在するかどうかをテストします (重複を回避します)。

params = {};
params['source'] = 'checkEMail';
params['email']  = email
$.ajax({
    type: 'POST',
    url : 'some_class.php',
    data : params,
    success: function(msg)
    {
        if(msg > 0) /* email exists */
            is_error = true;
    }
});

そして私のPHPクラスでは、次のようなものを手に入れました:

$final = mysql_fetch_assoc(foo);
echo ($final) ? 1 : 0;

私はデータをテストしていましたが、実際には、電子メールが存在する場合は「1」を取得し、存在しない場合は「0」を取得します。

面白いことに、このスニペットは、このフォームに他のエラー (ユーザー名が空の場合など) がある限り問題なく機能ます。「is_error」はブール値で、スクリプトの開始時に false に設定され、1 つの検証が失敗すると true になります。そして、最終的に、私はこれを得ました:

if(is_error)
{
    error.show();
    error.empty().append('some html foo');
}
else
{
    $('form').submit();
    error.empty().hide();
}

では、is_error が true に設定されているにもかかわらず、フォームが送信されるのはどうしてでしょうか? 私が考えることができる唯一の理由は、「is_error」がテストされる前にフォームが送信されているということですが、フォームの送信はスクリプトの一番下にあります。

ああ、私はそれをこのように呼んでいます:

<script type="text/javascript">
            $("#reg_submit").click(function(event) {
                event.preventDefault(); 
                checkReg();
            });
</script>
4

2 に答える 2

1

スクリプトの最後にその部分を含める代わりに、if(is_error){競合状態を回避するために、ajaxリクエストの完了時にそれを行うことをお勧めします。

$.ajax({
    type: 'POST',
    url: 'some_class.php',
    data: params,
    success: function(msg) {
        if (msg > 0) /* email exists */
        is_error = true;
    },
    complete: function() {
        if (is_error) {
            error.show();
            error.empty().append('some html foo');
        } else {
            $('form').submit();
            error.empty().hide();
        }
    }
 });
于 2012-11-22T14:14:46.210 に答える
1

一致させようとしている出力タイプが異なることが原因である可能性があります...

まず、PHP 出力を次のように変更します。

echo json_encode($final ? true : false);

次に、JSON を操作するために、この行を ajax 呼び出しメソッドに追加します。

$.ajax({
    type: 'POST',
    dataType:'json',
    ...
    success: function(msg)
    {
        if(msg!==true){
            is_error = true;
        }
    }
});
于 2012-11-22T14:13:05.603 に答える