1

皆さん!

Trigger.io で HTML アプリを実行しようとしています。このアプリは ajax を呼び出して、PHP ページからデータを読み込みます。この時点で、ユーザーを認証してセッションを開始します。この後、別の PHP ページを呼び出す必要があります。そのため、セッションが開始されたことを確認したところ、セッションがアクティブではないことがわかりました。2 番目の呼び出しは、最初の呼び出しの直後に行われます。

これは、iOS シミュレーターを使用して Trigger.io ToolKit からアプリを実行しようとすると発生します (私は Mac - OS X Mountain Lion を使用しています)。同じアプリを Safari でテストすると、完全に動作します。私の PHP サーバーは、以前に開始されたセッションを認識し、2 番目のページが ajax によって読み込まれます。

設定しなければならないパラメータはありますか? または、Trigger.io は PHP セッションをサポートしていませんか?

ありがとうございました。

マルシオ

4

2 に答える 2

2

iOSforge.request.ajax(params)では Forge アプリが URL としてロードされるため、クロスドメイン制限のため、ajax リクエストを作成するために使用する必要があります。file://

forge.ajax.requestは jQuery の $.ajax と同様の入力を受け取るため、Forge アプリだけでなく Web サイトでも同じコードを使用したい場合は、それらを簡単に切り替えることができます。

その他のドキュメントは、http: //docs.trigger.io/en/v1.4/modules/request.html#ajaxのドキュメントで入手できます。

于 2012-11-05T09:41:34.357 に答える
0

@Connorhd、助けてくれてありがとう!

まず、ユーザーを認証するために「app_authUser.php」にajaxリクエストを実行します。次に、[OK]の場合、サーバーからデータをロードするために「app_loadFeed.php」に対して別のajaxリクエストを実行します。

最初のajaxリクエストでは、postパラメーターにユーザーデータ(ログインとパスワード)を渡して、データベースでユーザーを認証します。phpファイル「app_authUser.php」で最初に呼び出すコマンドは、次のように「session_start()」です。

サーバー側の「app_authUser.php」のコード:

<?php
    session_start();

    // Just for test;
    $idSession = session_id(); 
    echo $idSession;

    /*
     Test user authenticate. If ok, then I assign idUser to $_SESSION['idUser'] variable.
    */

    if( $loginOk == true ){
        $_SESSION[ 'idUser' ] = $User->idUser;
    }
?>    

上記のコードでは、ユーザーが認証され、$ _SESSION['idUser']が正しく開始されています。2番目のajaxリクエストでは、変数$_SESSION['idUser']が設定されているかどうかをテストします。それがポイントです:それはもう設定されていません。繰り返しますが、最初は「session_start()」を呼び出します。

サーバー側の「app_loadFeed.php」のコード:

<?php
    session_start();

    // Just for test;
    $idSession = session_id(); 
    echo $idSession;

    if( isset( $_SESSION[ 'idUser' ] ) ){
        /* Load data from database to return to user.... */
        echo ...
    }
    else{
        echo '0';
    }
?>

Trigger.ioコンパイラからアプリを呼び出すと、上記のテストは常にfalseを返します。しかし、Safariからアプリを呼び出すと、常にtrueが返されます。

Trigger.ioコンパイラで実行されているアプリから呼び出しが行われると、関数 "session_id()"が両方のajaxリクエストで異なる値を返すことがわかりましたが、アプリがSarariで実行されている場合は同じ値です。

例:

  • Trigger.ioからのリクエスト:最初のリクエスト:echo $idSessionは"m7dbsv7qqem92os39lv5ao2ta1"を返します2番目のリクエスト:echo$idSessionは"h49pble06n7ao9pum06kt4dph0"を返します

  • Safariからのリクエスト:
    最初のリクエスト:echo $idSessionは"2cbhin1185fm5ehvbb15k6n0b1"を返します2番目のリクエスト:echo$idSessionは"2cbhin1185fm5ehvbb15k6n0b1"を返します

つまり、最初の例ではセッションが同じではありません。なぜこれが起こるのですか?

アプリでforge.request.ajaxを使用していません。これが私のjavascriptのajaxコードです:

<script>

function openAjax()
{
    try
    {
        var ajax = new XMLHttpRequest();
    }
    catch(e)
    {
        try
        {
            var ajax = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(ee)
        {
            try
            {
                var ajax = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(eee)
            {
                var ajax = false;
                alert("Seu navegador não suporta AJAX!")
            }
        }
    }   
    return ajax;
}

// This is the function called at second time, just after I authenticate my user and have session opened.
function loadFeed(){
    var url = CT_URLBase + 'app_loadFeed.php'; // CT_URLBase = 'http://192.168.1.100/' in my local environment.
    var parameters = '';

    var ajax = openAjax();

    ajax.open('POST', url, true);
    ajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=iso-8859-1');

    ajax.onreadystatechange = function(){

        if (ajax.readyState == 4){

            if (ajax.status == 200){

                var retorno = ajax.responseText;

                if( retorno != '0' ){

                    /* Return OK!!! */

                }
                else{

                    /* Error: return is 0 (zero), that means session is not started.

                }
            }
        }
    }

    ajax.send(parameters);

}    

</script>

私が最も誤解しているのは、同じコードがSafariでは完全に機能しますが、Trigger.ioでは機能しないということです。

ちなみに、私はあなたのウェブサイトconnorhd.co.ukにアクセスしました!よくやった!「おもしろいもの」を見つけるのに最適な場所です!おめでとう!

手伝ってくれてどうもありがとう!!!

マルシオ・クルーム

于 2012-11-04T18:26:57.270 に答える