2016-06-23 15 views
1

指定された登録番号の人が既にデータベースに登録されているかどうかをサーバー側で確認する必要があります。この人物がすでに登録されている場合、私はプログラムの流れを正常に進めます。しかし、番号がまだ登録されていない場合、オペレータが入力された番号の新しい人物を登録したいかどうかを確認する確認ダイアログを表示し、オペレータが「はい」と答えた場合、その人物はフォーム上に提出された番号。AJAXリクエスト後のJQuery確認ダイアログ

私は

サーバー側(PHP)試した:私も、私は入れたかったところだ、警告を表示することはできません

function submit(){ 
    var data = $('#myForm').serialize(); 

    $.ajax({ 
     type: 'POST' 
     ,dataType: 'json' 
     ,url: 'myPHP.php' 
     ,async: 'true' 
     ,data: data 
     ,error: function(response){ 
     alert('response'); 
     } 
    }); 
    return false; 
} 

if (!$exists_person) { 
    $resp['success'] = false; 
    $resp['msg'] = 'Do you want to register a new person?'; 
    echo json_encode($resp); 
} 

クライアント側を私の確認のダイアログは、サーバー側で書かれたメッセージです。その他の問題は、オペレータの答えを追加したフォーム全体をどのように再提出するのですか?サーバーはこの新しい人物を登録する答えが「はい」だったかどうかを確認できますか?

EDIT

私は、このような問題を解決することができました:

サーバー側(PHP):

$person = find($_POST['regNo']); 
if ($_POST['register_new'] === 'false' && !$person) { 
    $resp['exists'] = false; 
    $resp['msg'] = 'Do you want to register a new person?'; 
    die(json_encode($resp)); //send response to AJAX request on the client side 
} else if ($_POST['register_new'] === 'true' && !$person) { 
    //register new person 
    $person = find($_POST['regNo']); 
} 

if($person){ 
    //proceed normal program flow 
} 

クライアント側:

function submit(e) { 
    e.preventDefault(); 
    var data = $('#myForm').serialize(); 
    var ajax1 = $.ajax({ 
     type: 'POST' 
     , dataType: 'json' 
     , async: 'true' 
     , url: 'myPHP.php' 
     , data: data 
     , success: function (response) { 
      if (!response.exists && confirm(response.msg)) { 
       document.getElementById('register_new').value = 'true'; //hidden input 
       dados = $('#myForm').serialize(); //reserialize with new data 
       var ajax2 = $.ajax({ 
        type: 'POST' 
        , dataType: 'json' 
        , async: 'true' 
        , url: 'myPHP.php' 
        , data: data 
        , success: function() { 
         document.getElementById('register_new').value = 'false'; 
         $('#myForm').unbind('submit').submit(); 
        } 
       }); 
      } else if (response.success) { 
       alert(response.msg); 
       $('#myForm').unbind('submit').submit(); 
      } 
     } 
    }); 
} 
+0

あなたは 'confirm()'を探していると思いますか? – Naruto

+0

アラートはエラー時にのみ表示されます。あなたのAjaxリクエストが成功している可能性があります。 – Moob

+0

'error:コールバックの前に' success:function(response){alert(response);} 'を追加します。 '警告 'が表示されるはずです。 'alert'が表示されたら' alert'を 'confirm'に置き換えることができます。 – Venky

答えて

0

は確認を追加します内部送信機能

function submit(){ 
    var data = $('#myForm').serialize(); 
if (confirm('Are you ready?')) { 
    $.ajax({ 
     type: 'POST' 
     ,dataType: 'json' 
     ,url: 'myPHP.php' 
     ,async: 'true' 
     ,data: data 
     ,error: function(response){ 
     alert('response'); 
     } 
    }); 
} 
    return false; 
} 
+0

それは私が求めていたものではありません。この方法では、要求をサーバーに送信する前にクライアント側でのみ確認します。私は新しい人が登録されるかどうかを確認するダイアログを表示する前に、サーバー側で検証する必要があります。 –

2

PHPに問題はないようです。

問題は次のとおりです。(1)エラーコールバック内でアラートを行い、リクエストが失敗していないため、アラートが表示されません。 (2)変数responseの代わりに文字列'response'を警告しています。

また、.done().fail()約束の方法(http://api.jquery.com/jquery.ajax/#jqXHR)を使用する必要があります。ここで

が固定JSです:

function submit() { 

    var data = $('#myForm').serialize(); 

    // Same as before, with the error callback removed 
    var myAjaxRequest = $.ajax({ 
    type: 'POST', 
    dataType: 'json', 
    url: 'myPHP.php', 
    async: 'true', 
    data: data 
    }); 

    // The request was successful (200) 
    myAjaxRequest.done(function(data, textStatus, jqXHR) { 
    // The data variable will contain your JSON from the server 
    console.log(data); 
    // Use a confirmation dialog to ask the user your question 
    // sent from the server 
    if (confirm(data.msg)) { 
     // Perform another AJAX request 
    } 
    }); 

    // The request failed (40X) 
    myAjaxRequest.fail(function(jqXHR, textStatus, errorThrown) { 
    console.log(errorThrown); 
    }); 

    return false; 
} 

また、あなたは、PHPでのステータス 'を設定し、JSに(私は推測)することを確認します。あなたは以下のように、サーバーからのHTTPステータスコードを設定してやって欲しいもの:次に

if (!$exists_person) 
{ 
    $resp['msg'] = 'Do you want to register a new person?'; 

    // 400 - Bad Request 
    http_response_code(400); 

    echo json_enconde($resp); 
} 

を、jQueryの要求はあなたがで応答ステータスコードに基づいて、失敗したかどうかを判断します。 200は成功した要求であり、400の数値は失敗します。

完全なリストについては、このページをチェックしてください:https://httpstatuses.com/

+0

これは彼の質問の2番目の部分には答えていない* "他の問題、オペレータの答えが付加されたフォーム全体をどのように再提出すれば、この新しい人物を登録する答えが"はい "だったかどうかをサーバが確認できるのですか?* – TheZanke

+0

@ Alex'TheZanke'Howardあなたは正しいです。オペレータが与えた答えに古いデータを追加する必要があるので、フォームをmyPHP.phpに再送信すると、何をすべきかを知るための答えがチェックされます。以前に提出されたデータに回答を追加する方法はありますか? –

+0

@LeandroJacquesこの関数をonsubmitイベントハンドラとして使用しているようです。関数引数に 'e'(_event_用)を代入し、関数の先頭に' e.preventDefault(); 'を呼び出す必要があります。あなたはこれを行う方法の例とあなたの質問の第二の部分への答えのために私の答えを見ることができます。 – TheZanke

1

わかりましたので、この2つの部分の質問です。

パート1:成功が偽であることを検出して確認ポップアップを起動するにはどうすればよいですか?

jQuery.ajaxでは、エラーハンドラはレスポンスコードに基づいてトリガされます。これはおそらくあなたが望むものではありません。成功ハンドラを使用して値res.successをテストして、それが真か偽かを調べることができます。

function submit(e) { 
    e.preventDefault(); 

    var data = $('#myForm').serialize(); 

    $.ajax({ 
    type: 'POST', 
    dataType: 'json', 
    url: 'myPHP.php', 
    async: 'true', 
    data: data 
    }).done(function(res) { 
    if (!res.success) { 
     alert(res.msg); 
    } 
    }); 
} 

パート2:それはの線に沿って何かになるにはどうすれば確認して再送信しますか?

submit()には、registerNewという引数を渡すことができるように、前のコードを変更します。 registerNewがtrueの場合は、PHPのajaxハンドラにパラメータとして渡しますので、新しい人物を登録したいと考えています。 Javascriptが次のようになります:あなたがここに見ることができるように、私たちは、AJAXのオプションのデータに新しいregister_newのparamを渡している

function submit(e, registerNew) { 
    if (e) e.preventDefault(); 

    var data = $('#myForm').serialize(); 
    var ajax_options = { 
    type: 'POST', 
    dataType: 'json', 
    url: 'myPHP.php', 
    async: 'true', 
    data: data 
    }; 

    ajax_options.data.register_new = !!registerNew; 

    $.ajax(ajax_options).done(function(res) { 
    if (!res.success && confirm(res.msg)) { 
     submit(null, true); 
    } 
    }); 
} 

。今私たちはこれをPHP側で検出する必要があります。これは簡単です(これはあなたのPHP ajaxハンドラにあります):

if ($_POST["register_new"]) { 
    // new user registration code goes here 
} else { 
    // your existing ajax handler code 
} 
+0

フォームのオンサブミットではなく、送信ボタンのonclickで作っていました。今、onsubmitに変更しようとしましたが、関数は呼び出されず、e.preventDefault()を実行できません。私のHTML

+0

まだ送信ボタンのクリックイベントで動作する可能性があります。 – TheZanke

+0

イベントハンドラとして使用したい場合は、javascriptを使用してjavascriptファイルのリスナとして追加することをお勧めします。あなたは 'document.getElementById( 'myForm')。addEventListener( 'submit'、submit);'と言って、あなたのマークアップから 'onsubmit =" submit() "'を削除したいでしょう。これは、マークアップとロジックをもう少し分けるのにも役立ちます。 – TheZanke

関連する問題