1

編集:最終的には自分でこれを解決できました。(下記参照。)

私は現在、購入前に製品を構成するための多くのオプションがあるオンライン ショップを構築しています。すべての構成データは、サーバー上の PHP セッションに保存されます。新しい構成を開始するための別のボタンがありますが、クライアントをサポートするときに、多くの従業員が Chrome の新しいタブを開いて、そこから新しい構成を開始することがわかっています。先に進んで構成データを保存しようとすると、すべての構成が の同じデータ配列に保存されるため、単一のタブ内のすべての構成が混同されます$_SESSION

インターネット (SO を含む) でいくつかの調査を行った後、 のようなスクリプトの実行ごとに設定されるアプリケーション ID を決定しました$app_id = time();。その後、ID はページに含まれ、クライアント側で構成を処理するスクリプト内の JavaScript プロパティとして設定されます。すべての AJAX 要求で、変更を正しい構成に適用できるように、ID が他のデータと共に送信されます。

これで、構成データが混同されることはなくなりましたが、ユーザーがページをリロードするたびに、新しい ID が設定され、標準構成が読み込まれます。Google と SO は、次の投稿のように、Cookie を使用して問題を解決する方向に私を再び指摘しました: http://www.tedpavlic.com/post_detect_refresh_with_javascript.phpと呼ばれる Cookie へのすべてのアンロードの ID 。次に、この Cookie の存在を確認するように PHP スクリプトを次のように変更しました。onunload="prepareForRefresh()"<body>APP_ID

if (isset($_COOKIE['APP_ID'])) { // ID has been set on unload

    $app_id = $_COOKIE['APP_ID']; // set ID to previous value
    $cookie = setcookie('APP_ID', '', time() - 4800); // unset cookie
    echo 'refresh';

} else {

    $app_id = time(); // set ID to new value
    echo 'new page';
}

JavaScript はページのアンロード時に Cookie を正しく設定し、PHP スクリプトは保存された値にアクセスできます。残念ながら、私は何かを見逃したに違いないと思います。私のサイトは、更新のたびに 2 つの構成を切り替えるようになりました。JavaScript のように Cookie の設定を解除して<body onload="deleteCookie"...も機能しませんでした。ある時点で間違った ID が Cookie に書き込まれ、これら 2 つの値が交互に繰り返されるように思えます。

どうすればそれを防ぐことができますか? またはmax-age、Cookie に 15 秒を設定して、ページがリロードされないときに有効期限が切れるようにするのに役立ちますか?

編集:さらに掘り下げた後、私の問題は、この回答に示されているクライアントとサーバー間の要求応答構造に関連している可能性が最も高いと思います。onloadしたがって、または PHP スクリプトで Cookie の設定を解除しても、何も変わらないと思います。しかし、ページのリロード時に ID を記憶させるにはどうすればよいでしょうか?


解決策(または少なくとも私のために働いたもの):

PHP で ID を設定する部分を次のように変更しました。

if (isset($_COOKIE['APP_ID']) && $_COOKIE['APP_ID'] != '') { // ID has been set on beforeunload

    $app_id = $_COOKIE['APP_ID']; // set ID to previous value

} else {

    $app_id = uniqid(); // set ID to new value
}

次に、JavaScript で次の 2 つの関数を記述しました。

function unsetCookie() {

    document.cookie = 'APP_ID=;'; // unset cookie
}

function setCookie() {

    document.cookie = 'APP_ID=' + $('#my-element').data('app-id') + ';';
}

これらをHTMLに登録しました:<body onbeforeunload="setCookie();" onload="unsetCookie();">

これは非常に汚い回避策かもしれませんが、うまくいきます。コメント、ヒント、ヒントは高く評価されています。私は学び、改善したいと思っています。:)

4

0 に答える 0