みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javascriptの変数をPHPに渡したい

環境
 サーバLinux、Apache2.0.47、PHP4.3.2で使用しています

質問
 リンク元の取得のためgetenv("HTTP_REFERER")を使っていますが情報が取得できません。
 クライアント側のファイアウォール(ノートンなど)が無効になっているときにしか情報が取得できませんでした。
 Javascriptのdocument.referrerを使ったところ、ファイアウォール関係なく情報が取得できました。
 ログ保存のためにPHPの変数にdocument.referrerを渡したいのですがどのようにすればよいのでしょうか?
 下のように書いたところブラウザには正常に表示されましたが、
 ログはJavascriptの制御文そのものが保存されました。

 $link="<SCRIPT language='JavaScript'><!--
   document.write(document.referrer);
   --></SCRIPT>";

よろしくお願いします。

投稿日時 - 2006-06-06 16:27:54

QNo.2199081

すぐに回答ほしいです

質問者が選んだベストアンサー

#2です。

「どこからトップページに来たか(逆アクセスログ?)」
ということをログに残したいということでしょうか。

外部サイトから来た場合もどこから来たかを
特定したいのであれば、セッションではなく、
ほかの方がおっしゃっているような方法になると思います。


もし、外部サイトを特定する必要がなく、
ひとまとまりで「外部サイト」などの代名詞を
ログに残すのであれば、セッションでもできます。

------------------------------------------------------
初期アクセス時にはセッションに値が保持されないので、
  セッションに値がない=「外部サイト」
といった考え方です。
------------------------------------------------------

投稿日時 - 2006-06-07 17:53:09

お礼

度重なる回答ありがとうございます。

ログに残したい内容は回答いただいたとおりです。
google検索結果からきたとか、関連リンクからきたとか、そのような使い方です。
サイト内からのアクセスは考えていません。
(また同じブラウザでは1回しかログを取らないようにしています)

やはりトップページでdocument.referrerを使いログ書き込みページにジャンプ、
ログを書いた後トップページにジャンプということになるのでしょうか。

現在の取得ログは日時、IP(ホスト名)、ブラウザ種類、リンク元の5つです。
リンク元以外はすべて取得できています。
PHPの関数で取得できず、Javascriptの関数で取得できるので、
Javascriptで取得したデータをPHPの変数として渡せないかと考えたまでです。
また同一ページでログを保存した方が良いということと、
トップページ→ログページ→トップページでは動作が不安定かなと考えていました。

CGIを使わないアクセスカウンターでは通常どのようになっているのでしょうか。
リンク元にこだわるのであればオールJavascriptにした方がようのでしょうか。
もう少し検討してみます。

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

投稿日時 - 2006-06-09 10:25:42

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

というか、javascriptで解釈されるほうが、PHPで
データを送り出すよりあとだから、とれないのでは?
副次的にやるのであればajaxで別途データを送らせる
など考えられないことはないですが・・・

投稿日時 - 2006-06-06 22:51:50

お礼

おはようございます。

回答いただいた件が気になり
Javascript文を削除しPHPのみ確認しましたが同じでした。
Nortonファイアウォールで情報が取得できない理由・セキュリティルールは分かりません。

Ajaxを使わなければ出来ないというのであればすぐに対応しなければなりませんが、
Web1.0でも出来そうなので変更は難しいです。
Ajaxにつきましては、私の知識も環境も整っていませんので
すぐに対応ということはできなそうです。

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

投稿日時 - 2006-06-07 09:27:57

ANo.4

反則かもしれませんが。

document.referrer用のフォームを作って、
TARGETを指定して、
BODYのonloadでログ書出しphpに飛ばす。(別ウインドウが開く)
で、開いたウインドウは、onloadで閉じる。


…見た目が汚くなります。

投稿日時 - 2006-06-06 18:06:04

お礼

おはようございます。

別ページで処理をするのであれば、回答いただいた方法で出来そうですね。
別ウィンドウを開いた方が良いのか、index→ログ書き出し→indexに戻るのが良いのかは
体裁的な問題なので...

リンク元の取得以外はうまくいっているのでdocument.referrerだけに
index.php→access.php→index.phpとするのが納得いかないでいました。
ページ1つで処理をしようとこだわっていましたが、
出来なそうなことが分かったので納得しました。

1ページで処理したかったので、PHPのgetenv[HTTP_REFERER]で情報を取得できるようにするか
Javascriptで処理するかを悩んでいたのですが、回答を見る限りその考え方が柔軟でないことがわかりました。

他にも方法がないか検討してみます。
回答ありがとうございました。

投稿日時 - 2006-06-07 09:13:09

$_SERVER['HTTP_REFERER']では駄目でしたか。

PHPに渡す場合にはいくつかの方法が考えられますが、JavaScriptはクライアント側で初めて実行されるので、同じスクリプトを使ってサーバサイドで取得するのは無理だと思います。
JavaScriptのアクセスカウンターのようにJavaScriptを設置し、別スクリプトで取得すれば良いと思います。

例えば

<script language="JavaScript">
<!--
document.write("<img src='http://www.hogehoge.com/access.php?ref=");
document.write(document.referrer+"&pname=");
document.write(document.title+"&puri=");
document.write(document.URL+"' />");
// -->
</script>

としておいて、access.phpで
$referer = $_GET[ref];
$page_title = $_GET[pname];
$page_uri = $_GET[puri];
で取得出来ると思います。
この場合、JavaScriptを書き込んだ全てのページをaccess.phpで一括管理が出来るメリットもあります。

投稿日時 - 2006-06-06 18:05:13

お礼

おはようございます。
回答ありがとうございます。

回答いただいた方法で出来そうです。
やはりページを2つにしないといけなそうですね。
リンク元の取得以外はうまくいっているのでdocument.referrerだけに
index.php→access.php→index.phpとするのが納得いかないでいました。
ページ1つで処理をしようとこだわっていましたが、
出来なそうなことが分かったので納得しました。

他にも方法がないか検討してみますが、こちらの案を参考にさせてもらいます。。
ありがとうございました。

投稿日時 - 2006-06-07 09:05:34

ANo.2

wipeさん、こんにちは。


$_SERVER[HTTP_REFERER]により、前ページのアドレスを取得できます。
ただし、マニュアルにもあるとおり、信用できる情報ではありません。
http://jp.php.net/manual/ja/reserved.variables.php#reserved.variables.server


ログ保存というのが実際どのようなものなのかが分かりませんが、
私ならセッションを使います。

例えば・・・

1.Aページ
  現在のページのアドレスをセッションに保存

2.AページからBページに遷移

3.Bページ
  セッションに保存されたアドレス(Aページ)をログに書き込む

といった方法です。

投稿日時 - 2006-06-06 17:00:37

補足

回答ありがとうございます。
下の方と同じ返答になりますが、下の4つで確認し取得できないという状況でした。
 getenv[HTTP_REFERER]
 getenv[QUERY_STRING ]
 $_SERVER[HTTP_REFERER]
 $_SERVER[QUERY_STRING ]

ログの保存は、アドレス、時間、リンクURLなどをデータベースもしくはテキストファイルに保存するというものです。

サイトのトップページのログを保存したいと思っています。説明でいうAページは外部のサイトになってしまいます。
現在のトップページがBページになるように、変更すればできそうですが、あまり一般的ではない感じがするのでトップベージアドレスは変えたくないという気持ちがあります。このような変更はよく行われることなのでしょうか。

経験の未熟なものですが、ご指導お願いいたします。
よろしくお願いします。

投稿日時 - 2006-06-06 17:43:45

ANo.1

ご要望には添えないですが…。

$_SERVER[HTTP_REFERER]
では、取得できませんか?

投稿日時 - 2006-06-06 16:34:44

補足

回答ありがとうございます。
下の4つで確認したのですが、同じ状況でした。
 getenv[HTTP_REFERER]
 getenv[QUERY_STRING ]
 $_SERVER[HTTP_REFERER]
 $_SERVER[QUERY_STRING ]

またファイアウォールOFF(ノートン)ですべて見えました。
原因は分かりません。
そこから調べるべきでしょうか?
解決の指針がありましたら、よろしくお願いいたします。

投稿日時 - 2006-06-06 17:28:48

あなたにオススメの質問