- 締切済み
cookie 記録方法について
こちらにかいてあるようなことをしたいのですが、 うまく作動しなかったのと、javaをoffにしている場合の懸念もあり phpや他の方法で同じようなことはできないでしょうか。 www.kagua.biz/sem/fukusu-profile-sokutei.html analyticsに詳しくない方でも、要するにリンク先に1つクッキー記録用の リダイレクトページをはさんで、リダイレクトページでは、クッキーを記録する という部分だけでもお分かりでしたら、初心者向けにわかりやすく教えて いただければ助かります。 よろしくお願いします。
- みんなの回答 (18)
- 専門家の回答
みんなの回答
- hogehoge78
- ベストアンサー率80% (433/539)
無事、一応の決着がついて、なによりでした。 今回の実装はある程度大雑把なものですので、今後もgerberaredさんの方で、PHPの学習をしていただき、 自らの力で、より良い実装に改修できることを祈ってます。 それでは、サイト制作、頑張ってください。 私もgerberaredさんに良いことがあることを祈ってます。
- hogehoge78
- ベストアンサー率80% (433/539)
【1】遷移の件 そうですね、問題だと思います。が、『要件次第』と前回書いたとおり、どの様な何をやりたいかによってそこは柔軟に対応するものではありますが、今回は、基本的には動作サンプルという位置づけのものをつくってますので、 link.php?id=1と遷移された場合に、complete.php?id=1が実行された場合に、logs.csvに記録する、というのが、仕様となってます。 【2】スクリプトの問題 すみません、いくつかPHPの仕様をちゃんと確認してなかったのと、タイプミスがありましたので訂正します。 ■仕様間違いの部分 $_SESSION[$id]['・・・・']; と直してもらった物link.php = 2個、complete.php = 5個を $_SESSION['analystics'][$id]['・・・']; に直してください。 ■タイプミスの部分 complete.phpの二番目に書いてある長いif文の記述が、カッコが一個すくなかったです。 if(isset($_SESSION['analystics'][$id]['ad_url']) && isset($_SESSION['analystics'][$id]['ad_name'])){ //link.phpで設定した値が存在したら に修正してみてください。 これで動くと思います。 【3】パラメータで引き継ぐかcookieで引き継ぐかの切り替え bbb.comではパラメータ引き継ぎをさせてもらえるという前提なのでしょうか。 ソレが前提であれば出来ないことはなさそうですが、ネックな部分がいくつかありまして、 ◎ブラウザの設定でCookieの受け入れが出来ないことを知る術がサーバ側(つまりPHPから)はない。 →コレを実現するためにjavascriptを使ったりすれば出来るのかもわかりませんが私にはわからない。 ◎ini_setでPHPの設定を書き換えて振り分けを行うことが出来ない →前回の回答で書いたとおりで、ini_set関数でPHPの設定書き換えが有効にならないのであれば、link.php相当のものを別でもう一つ用意して(ディレクトリごと)そこからリダイレクトさせるとか色々工夫が必要そうです。 といった感じで、結構難しそうです。
- hogehoge78
- ベストアンサー率80% (433/539)
とりあえずの一段落は付けているようで、なによりです。 【1】一度完了まで至ったユーザに関して これはそのような仕様になっています。 complete.phpでセッションを削除する、というものです。 そうしないと、complete.phpに直リンクで更新連打をして全部記録する、ということが可能になってしまいますね。 (どちらにしても現状、それに近い物ではあるんですが・・・) 細かい調整は、サービス内容によるのでなんとも言えないですが、現状が一応ベターかなと思います。 【2】link.phpを連発でクリック後、一つの完了が起こってももうひとつの未完了ステータスを残したい それでは、修正します。(修正の前にファイルのバックアップとっといてください。間違えたときに戻すの手間になっちゃいますので。) link.phpの $_SESSION['ad_id'] = $id; となっているところを削除して その下の二つを $_SESSION[$id]['ad_url'] = $url; $_SESSION[$id]['ad_name'] = $site_name; としてください。 complete.phpの session_start(); の下に、 if(!isset($_GET['id'])) exit(); $id = $_GET['id']; と追記してください。 そしてその下の行の、if(・・・・・の所を if(isset($_SESSION[$id]['ad_url'] && isset($_SESSION[$id]['ad_name'])){ //link.phpで設定した値が存在したら に書き換え、その下の行に追記してもらった3行文、 if(!isset($_GET['id']) || $_SESSION['ad_id'] != $_GET['id']){ exit(); } これを削除してください そして、 「書きこむデータを準備」とコメントしてあるところのすぐ下、 $write[] = $_SESSION['ad_id']; を、 $write[] = $id; に修正。そしてその下の二つを、 $write[] = $_SESSION[$id]['ad_url']; $write[] = $_SESSION[$id]['ad_name']; に修正。 「最後に、セッションにログが残りっぱ・・・・」と書いてあるしたの、 $_SESSION = array(); を unset($_SESSION[$id]); に修正。 その下の方の、 「Cookieが残るので削除」とかいてあるところから、 session_destroy(); までを削除してください。 これで、要件を満たすはずですが、いかがでしょう。 【3】参照出来なくなる件 今自分で書いたものを読み直したら、確かに分かりづらいですね。しばらくフリーズしてしまいました。 結局のところ、 link.php?id=1 から遷移した時に、Cookieが使えないためにリダイレクトURLにパラメータを付加するとします bbb.com/?param=nanikaUniqNaValue そして仮に、bbb.comのサイトのほうでパラメータが引き継ぐシステムを用意してくれたとして、Cookieなどのようにブラウザ自身がファイルとして保存してくれる仕組みがないとなると、 ブラウザをとじて、Googleなどで検索したり、bbb.comに直接訪問した時に、そのパラメータは無くなってしまいます。 って事を、言いたかったんですね、確か・・・・ まぁ、とにかくそういう事情のもと、仕様として結構無理がありそうって感じです。
補足
本当にご親切にありがとうございます。 1、言葉が足りなかったようで、申し訳なかったのですが、前回2の質問では、aaa.comのid=1からlink.phpを叩いただけで、id=2からは一度も遷移していない場合です。 でもその後検索エンジンなどから今度はサイト2の直接ddd.comを訪問して完了に至った場合、id=1からlink.phpを叩いているので完了ページにid=1とid=2があれば記録できたりするのかなと思ったのですが、今書きながらそんなことができると逆に問題??とも思いました・・・(笑)。ですよね? 2、ご回答いただいた【2】を試してみましたが、記録してくれません。。。パーミッションも前回同様にしているのですが。 csvや、リンク、完了ページのimgタグの変更はないのですよね? 3、パラメータの引継ぎの件で、ccc.comに完了ページにあるときは、bbb.comやccc.comの内容まで修正しなければならないのは大変だと思うので、bbb.comに完了ページがある場合に限って、cookieが使用できるときはcookieを使用した安全な方法で動作してくれて、cookieが使用できない時に代替方法として自動で動作することは今回のプログラムと組み合わせ可能なのでしょうか。 大変恐縮ですがもしお手数でなければ、教えていただくことは可能ですか。 hogehoge78さんには本当に感謝でいっぱいです!☆☆(^-^)☆☆
- hogehoge78
- ベストアンサー率80% (433/539)
【1】有効期限に関して ini_set関数で設定した値が上手く動作していないようなきがしますね。 利用しているサーバによって、出来る設定が違うんですが、 ini_set内の引数ですが、 session.gc_maxlifetime と 60 * 60 * 24 * 30(すなわち、2592000) は、基本的には、php.iniといったPHPの設定ファイルに各内容なんですが、 お使いのサーバで、php.iniの編集って出来ますか? もし可能なら、php.iniに session.gc_maxlifetime = 2592000 と追記、または上書きしてください。 また、レンタルサーバなどだと、セッションファイルを置いておく場所が共有の場所に成っていることがあるので、 session.save_path = gerberaredさんのホームディレクトリのどこか を設定してください。 尚、php.iniが設定出来ない場合は、.htaccessファイルに php_value session.gc_maxlifetime 2592000 php_value session.save_path "gerberaredさんのホームディレクトのどこか" を記述してください。 両者共に、どの様なサーバ構成になっているかで適当な判断を行う必要があります。 さくらインターネットだったら、サーバコントロールパネルから設定出来たりするんですが、如何でしょうか。 また、「gerberaredさんのホームディレクトリのどこか」と記述した箇所は、 FTPなどで接続した場合の最初のディレクトリのことで、そのディレクトリの中に、tmpとかsessとか適当なディレクトリを置く、ということです。 もし、そのフルパスがわからない場合は、Webのルート以下に test.php----------------------- <?php echo __FILE__; ?> とかといったものを設置してもらうと、そのファイルまでのフルパスが出てきますので参考になります。 【2】パラメータの引き継ぎ >bbb.comにあるカートへのすべてのリンクにそのパラメータを引き継がせるような設定をするようなかんじでしょうか。 そうです。設定、というよりもプログラムを書く、修正する、とかといったほうがいいですかね。 bbb.comもccc.comも自分の手の内になければどうにも。 それに、パラメータを引くという話だと、link.php以外からの遷移で全く参照出来なくなりますので、あまりよい方法でもないですね・・・
補足
.htaccessで無事に設定できました。本当にありがとうございます。 ここまででも大大満足なのですが、もしよろしければあと少しだけ質問させて下さい。 1、前回も書かせていただいたのですが、link.phpを一度通って、最後の完了まで至った後、一度完了まで至った同じユーザーが、ブラウザを閉じて今度は直接bbb.comから訪問してもう一度完了まで至った場合は、もうセッションがきれている?のか記録されないようなのですが、そんなことは可能だったりするのでしょうか。 最後の完了まで至らずに、ブラウザを閉じて直接bbb.comを訪問した場合は、記録されています。 2、おそらくこんなことはまず無理だと思うのですが、万が一と思ってお尋ねしたいのですが、次の3つのサイトについて 広告があるサイト aaa.com サイト1 bbb.com(id=1)+ ccc.com (完了ページid=1) サイト2 ddd.com (id=2)+ eee.com(完了ページid=2) aaa.comのid=1からlink.phpを叩いたあと、一度ブラウザを閉じます。その後検索エンジンなどから今度は直接サイト2のddd.comを訪問して完了に至った場合は、id=2なので記録されないと思うのですが、もしも完了ページにid=1とid=2があれば可能になったりするのでしょうか。もし可能ならどのように書けば良いですか。 3、前回のパラメータの引継ぎの件で、”link.php以外からの遷移で全く参照出来なくなる”ということがちょっと理解しずらかったのですが、cookieが使用できるときはcookieを使用した安全な方法で動作してくれて、cookieが使用できない時に代替方法として自動で動作するといったことができないというかんじ?でしょうか。 お手数をおかけして申し訳ありません・・・。
- hogehoge78
- ベストアンサー率80% (433/539)
【1】IE8の設定 は、gerberaredさんと同様、「中」なんですが、cookieを吐いている環境というのが、自前のPC(ローカル環境)なので、許可されているっぽいですね。 【2】遷移のお話 コレは、当然link.phpでcookieやらセッション変数を登録しているので、ここを一度も通っていない人が広告に申込んだ場合は記録されません。 っていう要件だとおもってたんですが・・・ どこを通しても、申し込み数がカウントされる仕組みであれば、特にcookieとかセッションで値を引き回す必要もなく、 complete.phpが実行されたら、機械的に申し込まれたという件数を記録誌ていけば良いということになります。 >ini_set('session.gc_maxlifetime', 24 * 60 * 60 * 30); を記入しましたが、session_set_cookie_params(60 * 60 * 24 * 30);と両方必要ですか これは両方必要です。セッションの有効期限とCookieの有効期限が別々に設定されているためです。 【3】URLのパラメータとしてセッションIDを付与する このパラメータをつけた状態で、bbb.comに遷移したとしても、bbb.comのカートはコレを引き回してくれません。 ソレを受け入れるようなプログラムを書いたり設定をしたりする必要があるものなので。
補足
hogehoge78さんが本当に親切な方で助かっております。 ありがとうございます。 1, 私の質問の仕方がまずかったのですが、link.phpを一度通った人のことです。 link.phpを一度通って、bbb.comを訪問した人がその日にカートまで行かず、後日お気に入りや、検索エンジンでaaa.comではなく、直接bbb.comを訪れ完了まで至った場合です。 if(!isset($_GET['id']) || $_SESSION['ad_id'] != $_GET['id']){ exit(); } とcomplete.php?id=カートのIDを追加して試しています。 直後なら大丈夫なようですが約30分後では記録されません。セッションとCookieの有効期限も両方(60 * 60 * 24 * 30)で記入しているのですが・・・。 あと、link.phpを一度通って、最後の完了まで至った後、一度完了まで至った同じユーザーが、ブラウザを閉じて今度は直接bbb.comから訪問してもう一度完了まで至った場合は、もうセッションがきれている?のか記録されないようなのですが、そんなことは不可能なのでしょうか。 2, URLのパラメータとしてセッションIDを付与する件ですが、なるほどaaa.comからbbb.comまでは付与されていても、ccc.comまでは無理なのですね。 ちなみにそれを受け入れるプログラムというのは、単なる想像ですがbbb.comにあるカートへのすべてのリンクにそのパラメータを引き継がせるような設定をするようなかんじでしょうか。 お手数をおかけして申し訳ありません。m(_ _)m
- hogehoge78
- ベストアンサー率80% (433/539)
【1】IEで正しく動作していないということ こちらでテストしたブラウザはIE8なんですが、正常に受け渡しできているんですよね。 つきまして、IEのセキュリティ設定とかの問題ではないかなぁと思うんですが、いかがでしょう。 インターネットオプションのプライバシーの項目のあたりとか。 すみません・・・IEの設定関連はあまり詳しくなくて、どうするとCookieが制限されてしまうかとかがよくわからないです・・・ 【2】広告を見たと確定するユーザに関して すみません、一つ設定を忘れてました。 下記を、link.phpとcomplete.phpの先頭(<?phpの下の行あたり)に挿入してください。 ini_set('session.gc_maxlifetime', 24 * 60 * 60); // 24 * 60 * 60の値はcookieの設定同様、秒です。好きな値に。 ということで、link.phpを叩いた後はユーザのブラウザには、スクリプトで設定したCookieの有効期限の間(かつ、IEのキャッシュ削除みたいなのでCookieを削除されてなければ)は、ずっと残っています。そして、サーバ側にあるセッションのデータも同じ時間に設定しておけば同じ時間だけずっと残っています。 つまりこれらが残っていれば、link.phpを叩いた後、ブラウザをとじて、Googleなどで広告を検索してきてカートを完了しても、データは記録されていくものになります。 >cookieが有効にされていない場合も記録されないのですよね? コレはそのとおりです。 ただ、現状cookie以外の方法でユーザの遷移のステータスを受け取ることが出来るシステムはないです。
補足
何度もありがとうございます。 1、ご指摘の通り、プライバシー項目を低にすると記録されました。でも確かデフォルトで中だったと思うので、低にしないと動作しないとなるとちょっと困りますね(>_<;)。でもこればっかりはどうしようもないのですよね。 ちなみにテストしていただいたIE8の設定は何でしたか?それはデフォルトなのでしょうか。 2、前回の質問2ですが、link.phpを叩いた後、ブラウザをとじて、今度は検索エンジンやお気に入りから、aaa.comの広告ではなくリンク先のbbb.comを直接訪問して完了に至った場合の記録という意味だったのですが、それができません。毎回link.phpを叩かないと記録されないようです。 ini_set('session.gc_maxlifetime', 24 * 60 * 60 * 30); を記入しましたが、session_set_cookie_params(60 * 60 * 24 * 30);と両方必要ですか。 3、cookie 以外の方法の件ですが、下記の記事をみてちょっと理解に苦しんでいるのでもしお分かりでしたらでけっこうですので教えていただければありがたく思います。 www.yc.tcu.ac.jp/~yamada/doc/php/0802.html q.hatena.ne.jp/1207968193 session.use_trans_sidが1というのは、相対パスのみのようなので不可能だと思うのですが、 session.use_trans_sidが0では、 <?=SID?>や、<?php echo htmlspecialchars(SID); ?>や、<? echo session_name().'='.session_id(); ?> でcookieが使用できるときはcookieを使用し、できない場合はURLにセッションIDが埋め込まれるので別ドメインでも可能というものでしょうか。 HTMLフォームのhiddenコントロールとしてセッションIDを引き渡すというものでも可能のようなのですが、こういった二つの方法は教えていただいたプログラムと組み合わせることなんかは可能なのでしょうか。 また、二つの方法とも遷移するすべてのURLにセッションIDがくっついてまわるというものですか。 cookieが使用できるときはcookieを使用した安全な方法で動作してくれて、cookieが使用できない時に代替方法として自動で動作してくれるのが理想なのですが、代替方法の場合はcookieがないため一回のセッションで終わりというものですね? お手数をおかけして申し訳ありませんがよろしくお願い致します。
- hogehoge78
- ベストアンサー率80% (433/539)
【1】パーミッションについて LinuxやUnixというOSは、書くファイルやディレクトリに作成者などの権限というものを持ちます。 それぞれのファイルやディレクトリにどの権限者がそれを呼び出してもいいか、また書きこんでもいいかを設定するのがパーミッションです。 レンタルサーバなどは、 ・WebサーバはApache(+suEXEC) ・PHPの動作はCGIモード で、動作するのが一般的で、 この設定の場合は、「ファイルの所有者」のみに呼び出しの権限を持たせれば動きます。 つまり、実行されるだけのPHPファイルは「400」、書き込みされるファイル(テキストファイルなど)は「600」で動作するハズです。 が、上記で書いた様にサーバの設定によって変わってきますので、詳しくはサーバの管理者、レンタルサーバであればレンタルサーバのマニュアルなどで確認しなければなりません。 【2】今回書いたプログラムに関して すみません、link.phpに一箇所ちょっと良くない記述があるので、そこだけ書き換えてもらっていいですか。 一番下の方の、 session_start(); から exit(); までを切り取って、 break; //そこで回転を止める のところに持ってきてもらってもいいですか。(break;は削除しても良いです) で、今回のプログラムのどこら辺がルーズだったか、の説明なんですが、 (1)link.php 一人のユーザがIDの違うlink.phpを二回開いた場合、最後に訪れたサイトのみが記録対象となる(上書きされる) また、complete.php側も、どのIDに対してどのカートを使うかを設定していないため、 id=1のカートが完了になっているのに、id=2のカートで完了する、ということがある。 これは、クリックされたら大概カートで申し込み完了になるというのが前提だったのですが、もし致命的だと思うのであれば complete.phpの最初のif文の次の行に下記を追加して、 if(!isset($_GET['id']) || $_SESSION['ad_id'] != $_GET['id']){ exit(); } そして各カートのcomplete.phpを complete.php?id=カートのID としてください。 これで回避できます。 (2)complete.php flock関数でファイルがロック出来ないタイミングが発生した時に記録されません。 ソレはどんなタイミングかといえば、完全に同時にアクセスされた場合などです。 一つの物を書き込んでいる最中はロックされているので、次のものを書き込む時にロック中となってしまうので 書き込めなくなってしまうためです。 ただ、よほどアクセスが集中されない限りは起こらないので、今回の実装はこの程度にしてあります。 (3)言い訳 基本的にPHPの質問での回答なので、大体の雰囲気を掴んでもらって、細かい調整などはgerberaredさん自身で行ってもらいたい、というのが趣旨なんです。 これらをちょっと作り込もうと思ったら、ある程度ブラウザなどの検証を行わなければならなかったり、もう少し作りも細かくする必要があるので、回答として書くにはプログラムとしても長くなりますし、作成者と設置者が違うのでは、デバッグも大変になってしまいます。 (4)結果が書きこまれていないタイミングがある もし、私の方で追記してもらったerrorが一個も表示出来ていないということであれば、理由は二つ。 ・error.txtのパーミッションが正しく設定されてなくてログが取れてない ・そもそもcomplete.phpを踏んでいないタイミングで完了している場合がある 今回のプログラムの欠点は、必ずimgタグがロードされている必要があることです。 せっかちなユーザが完了画面を開いて全部の画像がロードされる前にブラウザを閉じたりすると、成果として上がらない場合があります。またSSLなカートを実行した場合に、非SSLのパスのcomplete.phpが呼べているか確認する必要がありそうです。 【3】file_put_contents('./error.txt', 'xxxxxxx');を入れてもらった意図 一番簡単なデバッグ方法で、あるif文(条件分岐ですね)が失敗/成功した場合に、ちくいちどこかにその内容のログを吐き出すようにしておけば、どこでプログラムがこけたかが分かりやすいというものです。 なので、必ず入れておく必要のあるものではなくて、「どこでプログラムを抜けたのか」を確認するために書いただけのものなので、書かなくても良いです。
補足
大変ご親切にありがとうございました。 link.phpを書き直しました。Firefoxではログに記入されているし、sslの完了画面でも非sslパスで大丈夫なようです。 IEではssl、非sslに関わらず記入されません。エラーには、セッションがありませんでしたと記入されています。 ドメインにアンダースコアがあるとIEでは作動しないことがあるようですが、アンダースコアもないです。 考えられる原因はありますでしょうか。(>_<;) 最初にお伝えしておくべきだったのかもしれないのですが、このプログラムでは、一度広告をクリックしたユーザーが後日、リンク先である、広告とは別のサイトをお気に入りからや、直接google等で検索して訪れて申し込み完了まで至った場合は、最初に広告を見たユーザーとして記録されないのでしょうか。 また、cookieが有効にされていない場合も記録されないのですよね? これらについての方法も、もし可能なのであれば、お時間がありましたらご教授いただけると助かります。 大変恐縮ですがよろしくお願い致します。
- hogehoge78
- ベストアンサー率80% (433/539)
そしたら、念のため、まず、 link.phpでカートまで画面が遷移した後、 ブラウザに直接、complete.phpを叩いて実行してみてもらってもいいですか? その際エラーメッセージ等は出ますでしょうか。 でなかったら、complete.phpをちょっと書き換えてみてください。 ・exit(); //プログラムを止める と書いてある1行上に、 file_put_contents('./error.txt', 'ファイルがロック出来ませんでした。'); というものを挿入してください。 ・session_destroy();//セッショもおわらす と書いてある下の、「}」(閉じ括弧)を の下に、 else{ file_put_contents('./error.txt', 'ファイルが有りませんでした。'); } の三行を入れてください。 ・一番下にある「}」(閉じ括弧)を } の下に、 else{ file_put_contents('./error.txt', 'セッションがありませんでした。'); } の三行を入れてください。 そして、同じ場所に、error.txtといった空のファイルを置いておいておいてください。 ちなみに、前回ちょろっと言いましたが、パーミッション設定はきちんとされてますか? 使っているサーバによっては(特にレンタルサーバ)、パーミッション設定をチャンとしていないとファイルへ 書き込みができなかったりします。 っといったところが準備できたら、再度通常の画面遷移、試してみてください。 画面が全部遷移した後、error.txtに書き込みがあったら、その内容がエラーのもとになります。 一度お試しを。
補足
さすが!ご指摘の通りパーミッションの問題でした・・・すみません。 complete.phpと、logs.csvを777にすると記録できました。 ここまでご丁寧に教えていただけて、それだけでもとても感謝しており大変恐縮なのですが、もしご迷惑でなければ以下の件もご教授いただけると大変ありがたく思います。 1、パーミッションのことをあまりよく理解できてないのでセキュリティー上、大丈夫なのかなと不安になるのですが、この4つのファイルをうまく作動させるためのそれぞれのファイルの最低限のパーミッションなんかをもしご存知でしたらでけっこうですので教えていただけると助かります。 ちなみにlink.phpとlinks.csvは644にしてありました。 2、ちゃんと記録される時と、されない時があってかなり不安定なのですが、これがルーズなつくりになっているとおっしゃていたことでしょうか。 できれば厳密に集計できればと思うのですが、もしよろしければ教えていただくことは可能でしょうか。 ちなみに記録できなかったときにエラーは出ていません。 3、errorの件ですが、complete.phpに”exit(); //プログラムを止める”の部分が2箇所あるのですが、 ”if(!flock($fp, LOCK_EX)){ //ロックが掛けられなかったら”の下のみに ”file_put_contents('./error.txt', 'ファイルがロック出来ませんでした。');” を記入したのですが、大丈夫ですか。 よろしくお願い致します。m(_ _)m
- hogehoge78
- ベストアンサー率80% (433/539)
【1】 どの様なエラーが出てしまいましたか? もしよければ出たエラーをそのまま書いてみてください。 link.phpには特にHTMLのタグとか追記はしてないですよね? また、UTF-8で保存した場合は、先頭にBOMコードが付いてしまっていないか確認して下さい。 あと、links.csvとlink.phpの場所も同じ場所にありますよね? レンタルサーバなどをお使いだった場合は、パーミッション設定を正しく設定しなければならない場合もありますが ソレも問題ないでしょうか。 【2】 >session_set_cookie_params(60 * 60 * 24 * 30); これで問題ないです。 セッションの動作の理解に付いても問題ないです。 セッションが開始されるとランダムな文字列がsetcookieされて、然るべき有効期限ソレを持っていて その有効期限の間はブラウザを閉じたりPCを再起動してもcookieが残っていれば セッションに保存した内容はまた参照することが出来る、って感じです。 complete.phpでセッションをdestroyしたのは、logにデータを保存したらその情報は破棄して問題ないから、 って感じです。
補足
ありがとうございます。 BOMコードのようなものが見あたらなかったのですが、メモ帳で作ってわざわざUTF-8で保存してしまっていたので4つのファイルとも別のエディタで作成するとリダイレクトできました! 一難去ってまた一難なのですが、logs.csvに何も記入されていませんでした。 確認方法は、aaa.com/logs.csvにアクセスして開いてみるだけですよね? 完了画面に<img src="http://aaa.com/complete.php" width="1" height="1" />もあるし、IE,Firefoxともに確認しました。 追記はsession_start();の前のsession_set_cookie_params(60 * 60 * 24); だけで、phpパーミッションも大丈夫です。4つのファイル場所も同じです。 ちなみに、phpはshift_jis, links.csvは us-ascii, logs.csvは iso-8859-1に自動でなっているのですが、このコードは関係ありますか。 他に考えられる原因はありますでしょうか。 お手数をおかけして大変もうしわけありませんが、よろしくお願い致します。
- hogehoge78
- ベストアンサー率80% (433/539)
続きです。 【ファイル名】complete.php <?php /* 登録完了サイトに貼り付けるためのプログラム このプログラムで、ログファイルへの保存も行う */ /* ログファイルのパスを設定 */ define('AFFILIATE_LOG_CSV', './logs.csv'); session_start(); //セッションを開始する if(isset($_SESSION['ad_id']) === true && isset($_SESSION['ad_url']) && isset($_SESSION['ad_name'])){ //link.phpで設定した値が存在したら if(file_exists(AFFILIATE_LOG_CSV)){ //ログファイルがあったら $fp = fopen(AFFILIATE_LOG_CSV, 'a+');//追記モードで開く if(!$fp){ //開けてなかったら exit(); //プログラムを止める } /* 書き込んでる最中に別のアクセスがあってログが壊れないように ロックをかける */ if(!flock($fp, LOCK_EX)){ //ロックが掛けられなかったら exit(); //プログラムを止める } /* 書きこむデータを準備 */ $write = array(); $write[] = $_SESSION['ad_id']; $write[] = $_SESSION['ad_url']; $write[] = $_SESSION['ad_name']; $write[] = date('Y-m-d H:i:s', time());//現在時刻も保存しとく $write_string = implode(',', $write) . "\r\n";//配列をカンマ区切りで結合して改行コードを付加 fwrite($fp, $write_string); //ファイルへ書き込み fclose($fp); //ファイルを閉じる //最後に、セッションにログが残りっぱなしになっちゃうのでそれらを削除する $_SESSION = array(); //Cookieが残るので削除 if($_COOKIE[session_name()]){ setcookie(session_name(), '', time()-42000); } session_destroy();//セッションもおわらす } } ?> といった二つのファイルと、各種データ記録用のファイルが必要で 【名前】links.csv 1,url,サイトの名前 2,url,サイトの名前 というフォーマットで必要なリンク先を書いてください 【名前】logs.csv これは空のファイルを作って置いてください。 以上、あわせて4つのファイルを同じ場所に設置してください。 使い方は、大体前回の回答どおりで、 http://aaa.com/link.php?id=1 などとしてaタグにでも張ると、カートにリダイレクトして カートの完了画面で http://aaa.com/complete.php を貼り付けておけばデータが記録される感じです。 今回setcookieなどの記述がないのは、セッションを使う場合にセッションと連携して自動的にある一意なCookieが吐き出されるからです。書いてないけどつかっている、といった感じです。 ちなみに、プログラム上、Cookieに有効期限を付けていないので、ブラウザが閉じるとCookieも削除されます。 それが問題ある場合は、 session_start(); と記述のある場所の前に、 session_set_cookie_params(60 * 60 * 24); //有効期限となる秒数を書く を追記してください。 尚、管理画面までは作れないので、logs.csvをFTPでダウンロードして、Excelとかで開いてアクセス数を手動で集計する、 という想定です。 また、これはあまり厳密な数を集計したいということではないと判断し、ある程度ルーズなつくりになってます。 例外処理的な部分がいくつか抜けてるという意味で。 とりあえずサーバにUPして動かしてみてもらえますか。
補足
ご親切にここまで教えていただき本当にうれしいです。これを自分で作成するとなるとどんでもなく大変だったと思うので救われました。ありがとうございます。 1,まさかのリダイレクトでつまずいてしまいました(>_<;)・・・。 http://aaa.com/link.php?id=1としてあるのですが、エラーになってしまいます。 link.phpの header("Location: {$url}"); //リダイレクトする には特に記入せずに、 links.csvに 1,http://bbb.com,サイトb 2,url,サイトの名前 のようにリンク先を記入するだけでよいのでしょうか。 他にリンク先以外のことでも追加記入しなければいけないところはありますか。 2,cookieの有効期限ですが、例えば30日だと session_set_cookie_params(60 * 60 * 24 * 30); をlink.phpとcomplete.phpの両方に記入するのでしょうか。 これによって、ブラウザを閉じるとセッションは終わるけど cookieにIDがセットされていて、次回はこのIDのセッションが継続される?or またはじまるみたいなかんじですか。 自分なりにもいろいろ調べてみるのですが、なかなか難しいようで・・・すみません。 よろしくお願い致します。
- 1
- 2
お礼
無事に記録できました!hogehoge78さんのおかげです。 他の件はまた今後の検討課題になるかもしれませんが、ここまで実現できるなんて本当にうれしい限りです。 誰かのためにここまでご丁寧に、本当にご親切な方なんだなあと思い感謝感激です。 hogehoge78さんにたくさんいいことが訪れますように☆彡 本当にありがとうございました。\(^-^ )♪