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";
}
?>
コメントで書かれているセッションに目印をつけておく方法以外では、こんな方法もあるようです。
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 で、期待通りの操作をされたときの飛び先のページ(例えば、「完了しました」みたいなページ)で、セッションの目印を消してあげる必要があります。
php のスクリプトはどこで解釈されて、javascript はどこで解釈されているでしょうか。
b.php を Webサーバで処理しているときには、PHP は javascript を解釈(実行)できないので、
2017/04/19 00:36:53$w_href は "http://foo.com/b.php" ではなく、"<script language="JavaScript">document.write(window.location.href);</script>" という文字列なんです($w_name も同様)。
a-kuma3様
2017/04/19 00:55:01いろいろと丁寧なご回答をいただきありがとうございます。仰る通りでPHPを誤解しておりました。
業務でSESSION変数やSERVER変数が使えないため、どうすればよいか悩んでおりました。
ご指摘を受けてすべてjavascriptで実装し、XMLHttpRequestで状態をPOSTして自身のPHP側に渡すことで解決できました。
b.php
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>
明確なご指摘をいただいたため、ベストアンサーとさせていただきます。ありがとうございました。