0

Web サイトでのチャット サポートに WebIM を使用しています。クライアントがチャット セッションを開始したときにタイマーを設定できるようにしたいと考えています。オペレーター/技術者が「x」秒以内に応答しない場合、クライアントがメッセージを残すことができる別のページにページをリダイレクトしたいと考えています。

「接続を試みている間、しばらくお待ちください」のようなものです。そうすれば、すべての技術者が忙しすぎたり、待っている他のクライアントをサポートしたりしている場合、クライアントは後でやり直すか、メッセージを残すことができます (チャットがオフラインの場合など)。

チャット スクリプトの作成者である mibew.org を詳しく調べましたが、この機能に関するものは何もありません。

Javascript setTimeout 関数を使用して、「x」時間後にいくつかの php を実行するというアイデアを思いつきました。php は基本的に DB にクエリを実行して、技術者が問題のセッションに入ったかどうかを確認し、そうでない場合は、クライアントを別のページにリダイレクトし、現在誰も利用できないことを説明しますが、メッセージを残すことができます。

問題は、JS の経験があまりないことです。

これは可能性がありますか?これを達成するためのより効果的/効率的な別の方法はありますか?

4

4 に答える 4

1

はい、できます。

タイムアウト関数を使用して、x秒ごとにjavascript関数を実行できます。

var time = 200;
setTimeout(function()
{ 
    func(); 
}, time);

次に、関数にajax呼び出しを実行させ、データベースからの結果を要求し、結果に応じて何かを実行します。

于 2013-03-01T18:56:41.447 に答える
0

それはまったく難しいことではありません。タイムアウト方法が指示する場合:

 $.post('url/of/phpscript', 
        $data /* data you'd like to send*/,
        function(returnData) { doSomethingWithThisPhpValue(data) });

 function doSomethingWithThisPhpValue(data) {
     if (data == signed_in) //...
 }

もちろん、値のテストと変数は最終的に、php メソッドから返されるデータに依存するため、これ以上正確なことは言えません。

于 2013-03-01T18:58:33.517 に答える
0

javascript と PHP を混同せずに連携させる使用方法の例 (ajax):

まず、JavaScript 関数が必要です。

function example()
{
    var select = true;
    var url = '../scripts/ajax.php';

    $.ajax(
    {
        // Post select to url.
        type : 'post',
        url : url,
        dataType : 'json', // expected returned data format.
        data : 
        {
                'select' : select // the variable you're posting.
        },
        success : function(data)
        {
            // This happens AFTER the PHP has returned an JSON array,
            // as explained below.
            var result1, result2, message;

            for(var i = 0; i < data.length; i++)
            {
                // Parse through the JSON array which was returned.
                // A proper error handling should be added here (check if
                // everything went successful or not)

                result1 = data[i].result1;
                result2 = data[i].result2;
                message = data[i].message;
                // Do something with result and result2, or message.
                // For example:
                $('#content').html(result1);
            }
        },
        complete : function(data)
        {
            // do something, not critical.
        }
    });
}

ここで、投稿された変数を ajax.php で受け取る必要があります。

$select = isset($_POST['select']) ? $_POST['select'] : false;

三項演算子は、設定されていない場合、$select の値を false にします。

ここでデータベースにアクセスできることを確認してください。

$db = $GLOBALS['db']; // En example of a PDO database connection

ここで、$select が要求されている (true) かどうかを確認してから、いくつかのデータベース要求を実行し、それらを JSON で返します。

if($select)
{
    // Fetch data from the database.
    // Return the data with a JSON array (see below).
]
else
{
    $json[] = array
    (
        'message' => 'Not Requested'
    );
}
echo json_encode($json);
flush();

データベースからデータを取得する方法はもちろんオプションです。JSON を使用してデータベースから単一の行を取得するか、それを使用して複数の行を返すことができます。

json を使用して複数の行を返す方法の例を示します (javascript (データ) で反復処理します)。

function selectMultipleRows($db, $query)
{
    $array = array();
    $stmt = $db->prepare($query);
    $stmt->execute();
    if($result = $stmt->fetchAll(PDO::FETCH_ASSOC))
    {
        foreach($result as $res)
        {
            foreach($res as $key=>$val)
            {
                $temp[$key] = utf8_encode($val);
            }
            array_push($array, $temp);
        }
        return $array;
    }
    return false;
}

次に、次のようなことができます。

if($select)
{
    $array = array();
    $i = 0;

    $query = 'SELECT e.result1, e.result2 FROM exampleTable e ORDER BY e.id ASC;';
    foreach(selectMultipleRows($db, $query) as $row)
    {
        $array [$i]["result1"] = $row['result1'];
        $array [$i]["result2"] = $row['result2'];
        $i++;
    }

    if(!(empty($array))) // If something was fetched
    {
        while(list($key, $value) = each($array))
        {
             $json[] = array
             (
                 'result1' => $value["result1"],
                 'result2' => $value["result2"],
                 'message' => 'success'
             );
       }
    }
    else // Nothing found in database
    { 
        $json[] = array
        (
             'message' => 'nothing found'
        );
    }
}
// ...

または、KISSしたい場合(単純に愚かにしてください):

データベースからいくつかの値を選択し、単一の行を返す基本的な関数を初期化します。

function getSingleRow($db, $query)
{
    $stmt = $db->prepare($query);
    $stmt->execute();
    // $stmt->execute(array(":id"=>$someValue)); another approach to execute.
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    if($result)
    {
        $array = (
            'result1' => $result['result1'], 
            'result2' => $result['result2']
        );
        // An array is not needed for a single value.
        return $array;
    }
    return false;
}

次に、行 (または単一の値) をフェッチし、JSON で返します。

if($select)
{
    // Assume that the previously defined query exists.
    $results = getSingleRow($db, $query);
    if($results !== false)
    {
         $json[] = array
         (
             'result1' => $results['result1'],
             'result2' => $results['result2'],
             'message' => 'success'
         );
    }
    else // Nothing found in database
    { 
        $json[] = array
        (
             'message' => 'nothing found'
        );
    }
}
// ...

とにかく、正確すぎて自分の足を撃たないことを願っていますが、このテクニックが大好きで、@Sabyreが例を求めていたので、ここにあります. 何かおかしなことを見つけたらコメントしてください。

于 2013-03-03T01:08:06.360 に答える
-1

このようなものはうまくいくでしょう

function callAfter5Seconds() {
  // your redirect or any other work goes here
}

// the second argument is the time, in milli-seconds (5000 = 5 seconds)
var myTimeout = setTimeout(callAfter5Seconds, 5000);

...そして、オペレーターがピックアップした場合は、タイムアウトをキャンセルすることを忘れないでください

clearTimeout(myTimeout);
于 2013-03-01T19:18:30.347 に答える