2

データベースにエントリを挿入する PHP ファイルを実行しています。条件が満たされた場合 (たとえば、$rows>500)、実行を停止し、2 つのボタンを表示したいと考えています。

スクリプトの実行を停止した場所から続行する場合は「続行」という値があり、スクリプトを介して今まで挿入されたエントリを削除する場合は「キャンセル」の値があります。

問題は、実行を停止し、2 つのボタンを表示し、オプションに応じてアクションを実行する方法が思いつかないことです。

Javascript と AJAX が必要ですか?

前もって感謝します!どんな助けでも大歓迎です!

4

5 に答える 5

5

exit()を使用してみましたか。スクリプトで?これによりコードが終了し、コードが停止します。続行するには、セッションで使用していた位置を保存できます。

$i = 0;
while () {

     if ($rows > 500) {
             echo '<div id="continueAction" class="someButton">Continue</div>';
             echo '<div class="someButton">Cancel</div>';
             $_SESSION['pos'] = $i;
             exit();
     }
     // Store some value in DB here
     $i++;
}

次に、ajaxリクエストを使用して、セッションに保存されている「pos」を使用して、中断した場所から再開できます。

編集:ajaxの場合、phpスクリプトとボタンからスクリプトを呼び出す方法が必要になります。私はそれにjqueryを使用します。あなたはすでにあなたのサイトにそれを持っている可能性があるので、あなたはただ使うことができます:

 $('#continueAction').click(function(){
      $.get('ajax/test.php', function(data) {
         $('.result').html(data);
      });
 });

これは、スクリプトtest.phpを呼び出し、データをdata ..というjavascript変数に戻し、このデータを.result要素内に配置します。
アプリケーションの種類によっては、必要な場所にデータを取得するために、これを少しいじる必要があります。しかし、これはあなたを正しい方向に導くはずです。

これがお役に立てば幸いです。

于 2012-09-25T08:04:28.400 に答える
1

m90 saisのように、phpを使用するだけではできません。

ロールバックできる構造のようなトランザクションを操作します。条件が満たされた場合は、ajax呼び出しを行います。出力に何かを送信し、応答を受信し、ユーザーの操作を要求します。新しい呼び出しを続行し、トランザクションまたはロールバックをコミットします。

編集:

jQueryを使用したajax呼び出しの簡単な例:

function runthescript(continue,rollback){
    $.ajax({
       type: "POST",
       url: "yourphpscript.php",
       data: {
         "isContinueing": (continue===true), 
         "isRollback": (rollback===true)
       },
       success: function(msg){
         if(msg === "calling for user interraction"){// replace this by Enum or something more performant this is just for illustration
              var answer = confirm("Want to continue?");
              if(answer){
                  runthescript(true, false);
              } else {
                  runthescript(false, true);
              }
         } else if(msg === "completed"){// replace this by Enum or something more performant this is just for illustration
              alert('completed');
         } else if(msg === "rolled back"){// replace this by Enum or something more performant this is just for illustration
              alert('rolled back');
         }
       }
     });
}
runthescript();

PHPの例

<?php 
function checkStates(){
    if($rows>500){
         echo "calling for user interraction"; // replace this by Enum or something more performant this is just for illustration
         //exit(); //you can use exit if absolutely necessary, avoid if not needed.
    }
    if($finished_condition_is_met){
         echo "completed";// replace this by Enum or something more performant this is just for illustration
         //exit(); //you can use exit if absolutely necessary, avoid if not needed.
    }
}

if($_POST['isContinueing'] === true){
    //run some continuing php


    checkStates();

} else if($_POST['isRollback'] !== true){

    //run some rolling back code   
    echo "rolled back";// replace this by Enum or something more performant this is just for illustration
    //exit(); //you can use exit if absolutely necessary, avoid if not needed.

} else {

    //run some starting php

    checkStates();

}
于 2012-09-25T08:04:53.470 に答える
1

You must save the state of the application in a way or another so you can resume it, if you get to send some info to the client, like the form containing the two buttons, the php script will be way over, or if it will not, it will still require another request for submitting the form values ("continue" or "Cancel").

One way to do that is websockets and maybe node.js. Or a good IPC between two php scripts. But your best option is still AJAX.

Just make the script return a status code, as "not done", and make javascript show two buttons when this happens, save where you left in a session variable, echo "not done", or echo "{'status':'continue?'}"; and then a die();

And in javascript just ask the user what to do further.

于 2012-09-25T08:07:49.843 に答える
0

わかりました、これを試してみましょう。

if($rows>500)
{
    echo '<div id="cancel">Cancel</div>';
    echo '<div id="continue">Continue</div>';
    exit();
}

次に、インデックス ページに jquery を含めて、次のようにします。

$(document).ready(function() {
    $("#cancel").click(function() {

        var data_to_send = what you want to send

        $.ajax({
            type: "POST",  // might be too long to use GET
            url: "cancel.php", // script you want to carry out this action
            data: data_to_send,
            success: function(data) {
                $('#results').html('<p>Previously inserted rows have been deleted</p>');
                // data is just what cancel.php echos out
            }
        });
        return false;
    });

    $("#continue").click(function() {

        var data_to_send = what you want to send

        $.ajax({
                type: "POST",
                url: "continue.php",
                data: data_to_send,
                success: function(data) {
                    $('#results').html('<p>Continuing!</p>');
                }
        });
        return false;
    });
});

結果の div は、ajax リクエストで何が起こっているかを出力するために使用される空または非表示の div にするか、データを既存の div に追加することを選択できます。

私が作る唯一の批判は、divを実際のボタンに交換することですが、同じように機能し、divのスタイルを好むだけです...

于 2012-09-25T08:18:57.123 に答える
0

私が考えることができる最も簡単な解決策は、PHP スクリプトを 2 つに分割し、「続行」ボタンで計算を進める 2 番目のスクリプトを呼び出すことです。

リクエスト パラメータをテストする場合は、1 つのスクリプトで実行することもできます。

于 2012-09-25T08:06:27.413 に答える