人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【超至急】PHPにおいて、リロード対策のための方法がうまくいかず困っております。

a.php実行後、b.phpに遷移してからリロードすると以下結果となります。
★の動作を期待していますが、原因不明でどこに問題があるか困っております。
ソースはそのまま動作します。推測ではなく、実際に動作確認の上でご教授をお願いいたします。

■実行結果(a.phpからの流入時)
window.name : http://www.xxxx.com/a.php
window.href : http://www.xxxx.com/b.php
result : not reload
■実行結果(b.php遷移後にリロード)
window.name : http://www.xxxx.com/b.php
window.href : http://www.xxxx.com/b.php
result : not reload ← ★ここが"result : reload"となることを期待しています
■ソース(a.php)
<?php
echo '<script type="text/javascript">window.name="http://www.xxxx.com/a.php";
</script>';
echo '<a href="http://www.xxxx.com/b.php">link</a>';
?>
■ソース(b.php)
<?php
$w_name = '<script language="JavaScript">document.write(window.name);</script>';
$w_href = '<script language="JavaScript">document.write(window.location.href);</script>';
echo "window.name :" . $w_name . "<br>";
echo "window.href :" . $w_href . "<br>";

if ($w_name !== $w_href) {
echo "result : not reload";
echo '<script language="JavaScript">window.name = window.location.href;</script>';} else {
echo "result : reload";
}
?>

●質問者: cochoo
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●500ポイント ベストアンサー

コメントで書かれているセッションに目印をつけておく方法以外では、こんな方法もあるようです。
https://www.yourhowto.net/detect-page-refresh-php/

<?php
$pageWasRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) && $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
 
if($pageWasRefreshed ) {
 //do something because page was refreshed;
} else {
 //do nothing;
}

stackoverflow なんかでも、ちょいちょい回答に使われているコードのようです。

質問のコードに合わせて書くと、b.php は、こんな感じ。

<?php
$pageWasRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) && $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
 
if($pageWasRefreshed ) {
 echo "result : reload";
} else {
 echo "result : not reload";
}
?>

セッションに目印を持っておくやり方は、「いつ、目印を外すか」というのが、結構 難しい。
先に引用したふたつの方法のうちのふたつ目がセッションに目印を持っておくやり方ですけれど、このままでは、別のところに行って戻ってきた場合にもリロードと判定されてしまいます。

a.php
 ↓
b.php : セッションに目印をつける
 ↓
b.php : 目印があるので、リロードと判定
 ↓
c.php : 別のところに行く
 ↓
b.php : セッションの目印が残ってるので、リロードと判定されてしまう

b.php で、期待通りの操作をされたときの飛び先のページ(例えば、「完了しました」みたいなページ)で、セッションの目印を消してあげる必要があります。


a-kuma3さんのコメント
>> 質問のソースでwindow.nameとwindow.location.hrefの値がb.php遷移後に同じ値で取れているにも関わらず、if ($w_name !== $w_href)にヒットしてしまうことが混乱の原因で、未だにわかりません。モヤモヤが残りますが、 << php のスクリプトはどこで解釈されて、javascript はどこで解釈されているでしょうか。 >|| a.php のリンクをクリックされる ↓ Webサーバにリクエストが送信され、b.php が Web サーバで実行される(javascript を PHP は解釈できない) ↓ b.php は、以下のレスポンスをブラウザに返す >> window.name:<script language="JavaScript">document.write(window.name);</script><br> window.href:<script language="JavaScript">document.write(window.location.href);</script><br> result : not reload <script language="JavaScript">window.name = window.location.href;</script> << ↓ b.php のレスポンスを受けて、javascript が実行される。 script タグの内側が解釈されて、以下のように表示される。 >> window.name: window.href:http://foo.com/b.php result : not reload << ||< b.php を Webサーバで処理しているときには、PHP は javascript を解釈(実行)できないので、 $w_href は "[]http://foo.com/b.php[]" ではなく、"&lt;script language="JavaScript"&gt;document.write(window.location.href);&lt;/script&gt;" という文字列なんです($w_name も同様)。

cochooさんのコメント
a-kuma3様 いろいろと丁寧なご回答をいただきありがとうございます。仰る通りでPHPを誤解しておりました。 業務でSESSION変数やSERVER変数が使えないため、どうすればよいか悩んでおりました。 ご指摘を受けてすべてjavascriptで実装し、XMLHttpRequestで状態をPOSTして自身のPHP側に渡すことで解決できました。 b.php <script language="JavaScript"> if (window.name != window.location.href) { //alert("not reload"); var xhr = new XMLHttpRequest(); xhr.open('POST', 'b.php'); xhr.send(); window.name = window.location.href; // ここで初期化 } else { //alert("reload"); } </script> 明確なご指摘をいただいたため、ベストアンサーとさせていただきます。ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ