• 締切済み

cookie 記録方法について

こちらにかいてあるようなことをしたいのですが、 うまく作動しなかったのと、javaをoffにしている場合の懸念もあり phpや他の方法で同じようなことはできないでしょうか。 www.kagua.biz/sem/fukusu-profile-sokutei.html analyticsに詳しくない方でも、要するにリンク先に1つクッキー記録用の リダイレクトページをはさんで、リダイレクトページでは、クッキーを記録する という部分だけでもお分かりでしたら、初心者向けにわかりやすく教えて いただければ助かります。 よろしくお願いします。

みんなの回答

回答No.8

リンク先を動的に振り分ける、データを記録するという処理そのものはさほど難しくはないんですが、要件をどれだけ詰めるか、 使い勝手を考えるかで、大分変わってきます(管理画面が必要とかそういう意味でも。) とりあえず、必要最低限、データを記録する、という方法に関しまして、ちょっと作ってみました。 【ファイル名】link.php <?php /* このファイルがredirect.phpです。 ファイル名を変えたのは特に理由はないですので、好きな名前で。 */ /* CSVを置いてある場所 置き場所を変えたかったら適当にパスを変えてください。 */ define('AFFILIATE_LINKS_CSV', './links.csv'); /* このPHPファイルに、パラメータ付きでアクセスされてきたか確認する http://example.com/links.php?id=xxxxxx とある場合の、[id=xxxxx]部分。 */ if(isset($_GET['id']) === false){ //idが付いてなかったら exit(); //PHPをここで終了させる } /* 次にパラメータに応じてリンク先を変更する */ if(file_exists(AFFILIATE_LINKS_CSV)){//もしCSVファイルが存在したら $data = file(AFFILIATE_LINKS_CSV); //CSVファイルを開いて配列にして開く。 foreach($data as $datum){ //配列を回す $datum = rtrim($datum); //右はじに改行コードが残っちゃうので取り除いて list($id, $url, $site_name) = explode(',', $datum); //カンマのところでさらに分解 if($_GET['id'] == $id){ //パラメータと同じ数値が見つかったら、 break; //そこで回転を止める } } session_start(); //今回はセッション使います $_SESSION['ad_id'] = $id; //セッション変数にIDを保存し $_SESSION['ad_url']= $url; //URLも記録 $_SESSION['ad_name']=$site_name; //念のためサイト名も session_write_close(); //セッションを書きこんでからとじて header("Location: {$url}"); //リダイレクトする exit(); } ?> 書ききれないので続きます。

回答No.7

【1】 申し込み完了数をどこかに記録する必要がある、ということだったら、これはもう、カウンタとかサーバにファイルやデータベースで保存出来るような仕組みを作らないといけませんね。 【2】 Cookieは、各ユーザのパソコン(ブラウザ)に保存される設定値なので、各ユーザごとにそれぞれが持つことになります。 【3】 っと、言うことではないです。check.phpが実行された時点で、記録されてます。 【4】 これについてはphpファイルにパラメータを引いたりして対処すればちょっと簡単になりますかね。 【5】 $hidukeの所は、書き換え可能です。PHPでは、「$」から始まる英数を「変数」としてもつので、 <?php $hiduke = '何か文字'; ?> とすれば良いです。 【6】 実は私も未検証だったので、実際やってみました。 ローカルの環境にredirect.phpとcheck.phpをおいて、 レンタルサーバに、申し込みページ的なものをおいてその中にimgタグという構成。 結論として、正常にcookieがセットされているようでした。 ちなみに、imgタグなんですが、display:none;とかスタイルシートとかで制御とかはしていないですよね? display:none;とか非表示にすると、ロードされないので、念のため。 とりあえず、【6】のあたり確認してみていただいてもいいですか?

gerberared
質問者

補足

わざわざ検証までしていただき本当にありがとうございます。 cssでimgを制御しているわけでもなくどうしてもできなかったのでもしやと思い、IE7を使用していたのですが、Firefoxで試してみるとcompleteがでてきました! そこで”admita1” と”complete1”の組み合わせでやっていたのをもとの”admita” と”complete”に戻してもう一度IEでやってみると以前の日付で両方でてきました。でも、別のパソコンのIEで試すとやっぱり”complete”の日付がでてこなかったので、IEが原因なのか何なのかよくわかりません。 たくさん質問がでてきてしまい、あまりにもお手数をおかけしてしまっているので大変申し訳ないです。 そろそろ新しい質問ページで質問しなおすべきなのでしょうが、もし可能でしたらでけっこうですのでお時間がありましたらご教授いただければありがたく思います。。。 1、前回の質問1の”カウンタとかサーバにファイルで保存できる仕組み”は、かなり高度なスクリプトになってくるのでしょうか。(>_<;)・・・。 もし、そのような仕組みの作成方法が説明されているサイト記事なんかをご存知でしたら教えていただけると大変助かります。 2、質問4のパラメータに関しても同様に、もし可能でしたらお願い致します。 3、前回の質問5ですが、 <?php $hiduke = date('Y-m-d', time()); + '何か文字'; ?> のように両方を入れたかったのですが、それは無理なのですね? せめてものお礼として、hogehoge78様に良いことがいっぱいありますように心よりお願いしておきます!(*^-^)

回答No.6

【1】今回のご質問 今回はCookieを引き回したい、という意図のみが明確だったので、とりあえず必要なタイミングでCookieを記述する、 という部分だけをクローズアップした感じですね。 アフィリエイトでは、実際にはセッション、というものを使ったりします。 セッションが開始されると一意なIDが生成されます(他と衝突しない必ずユニークな値)。 そのIDと関連づけて、様々な情報をそのセッションの中に格納していって、ブラウザのCookieにそのIDだけを渡してあげます。 そうすると、ブラウザがそのIDを持っている限り、サーバの中にあるセッションデータが常に参照出来るっていう仕組みです。 アフィリエイトの場合、大体ログインした自分のサイトの会員とかですよね。 その会員が、redirect.phpにアクセスしたときに、セッションにアクセスしたよといったフラグを書いてやって、 完了画面でcheck.phpが実行されます。 check.phpでは、そのセッションにフラグがあるかどうか、をチェックして、フラグがあって且つ、自分のサイトの会員だったら、 データベースなどに登録したよっていうデータを保存して管理します。 【2】check.phpの意義 コレは感覚的に分かりづらいのかもしれないですが、 Webサイトは、例えば、http://www.aaa.com/index.htmlがあった場合、リクエストして、ブラウザに表示されるのは、 index.htmlだけじゃないですよね? 実際には、http://aaa.com/index.htmlの中にcssの外部リンクがあれば、http://aaa.com/layout.cssだとか、そういったものも芋づる式に読みだしてきてますよね。 imgタグの中にもhoge.jpgなんてものがあったら、http://aaa.com/hoge.jpgも読みだしてますし、 インラインフレーム使ってれば、インラインフレームの中に書いたHTMLも読みます。 今回はその性質を利用してます。完了画面のHTMLの中に、imgタグで、画像以外のものを書いたとしても、 ブラウザは、imgタグの内容が正しかったら読み込むとかそういう細かい制御はしていないので、imgタグのsrcにURLが書いてあればとりあえず読みます。 なので、完了画面にaaa.com/check.phpをおいてやってcheck.phpの中にCookieに記録する記述をすれば、 上記の理由でcookieが正しく記録されるはずなんです。 ということで、check.phpを直接ブラウザでURL叩くと、今回意図した動作が出来ているかどうかのチェックの妨げになるので、 とりあえずしないほうがいいですね。 そして、check.phpの中にはcookieを書きこむという事以外の記述は書かないようにしてください。 test.phpで確認する必要があるのは【1】で説明した通り、通常アフィリエイトやらというのはcheck.phpが叩かれた時点で データベースなどに記録するのですが今回は特にそういうことしてないので、後でtest.phpで確認しているだけです。 【3】PHPの構文に関して <?php echo $_COOKIE['admita']; echo $_COOKIE['complete']; ?> この、「echo」というのは、後ろに続く文字列(とか変数とか)を出力しろという命令で、 $_COOKIE['admita']; の中には、当然改行のない文字列しか入っていないので、 その後にもう一度echoしたら、文字が連結したように見えます。 なので、 <?php echo $_COOKIE['admita']; echo '<br />'; echo $_COOKIE['complete']; ?> としてやってBRタグを出力するようにすれば改行されて見えます。 【4】setcookie setcookieの第一引数が、Cookieの変数名になるので、そこをhidukeとしたものを書いてやればOKです。 【5】は、その認識で問題ないです。 と、とりあえず回答してみましたが、【2】でcookieがチャンとセットされていない、ということなんですかね? imgタグがちゃんと読み込みできているか、ソースを見たりして確認してみてください。

gerberared
質問者

補足

いつも根気よく教えてくださり本当に感謝致します。 私の先生になっていただきたいくらいです・・・。(*^-^) 再度確認したのですがどうしても、completeの日付が出てこず、他にも誤解している点があるかもわからないので再確認させていただきたいのですが、わかりやすように、箇条書きで書かせていただきます。 1、特に、会員制のサイトでもなく、ただ単に別サイトに掲載してある特定の広告からきた申し込み完了数を知りたいだけであれば、セッションを使った方法でなくても、教えていただいてる方法で大丈夫なのでしょうか。 2、1に関連して広告から申し込み完了まで至ったユーザの数を知りたいのですが、test.phpで"2011-01-122011-01-17"の数によって確認できるのでしょうか。 それとも上書きされていってしまうのですか。数がわかる方法がありますか。 3、教えていただいてる方法では、広告をみたユーザーが申し込み完了ページを開いた時点でサイト管理者がtest.phpをみるとcompleteの日付とともに確認でき、特にこのユーザーが予約完了後もう一度aaa.comを訪問しないとtest.phpに反映されないということではないですよね? 4、複数の広告があって広告ごとに完了数を把握したい場合、redirect.php,check.php,test.phpのセットは広告ごとにファイル名を変更してsetcookieの第1引数も変更して使うというかんじになりますか。 他に簡単な方法はありますか。 5、前回の質問4ですが、test.phpで日付と、どの広告かといった文字の情報も見たいのでsetcookie('admita', $hiduke, time()+(60 * 60 * 24 * 30));で第2引数のところに$hidukeと文字をいれたりすることはできるのでしょうか。あるいは他に方法がありますか。 6、test.phpで、admitaの日付のみしかでてこない件で、check.comにアクセスしたらcompleteが記入されて、その後のtest.phpでもcompleteの日付がでてきたということは、<img src="http://aaa.com/check.php" width="1" height="1" />に問題があるように思うのですが、以下の記述で間違いはないでしょうか。ちゃんとソースからも確認したのですが・・・。 他に考えられる原因はありますでしょうか。 ccc.comの完了ページ <html> <head> 省略 </head> <body> <img src="http://aaa.com/check.php" width="1" height="1" /> </body> </html> お時間を割いていただき大変恐縮なのですが、よろしくお願い致します。

回答No.5

>あと、「申し込み完了ページからはCookieがセットされたか、セットした値は何か、を出力して確認することは出来ません。」との ことですが、申し込み完了ページでjavascript:document.cookie;によってcookieを見ているのですが、これでは確認できないということではないですよね? もしくは他に確認方法があるのでしょうか。 はい、これでは確認することが出来ません。 申し込み完了ページは、ccc.comのドメインのサイトなので、aaa.comでaaa.com用に記録しているcookieは、ccc.comでは参照出来ないため、javascriptでも当然参照出来ません。 なので、check.phpに、Cookieを記録した後に、別のtest.phpとかそういったものをaaa.comの何処かにおいて、cookieが記録されているかチェックをする、といった流れになります。 aaa.com/redirect.php→bbb.com→ccc.com(imgでaaa.com/check.php) と一連の流れがあった後、 aaa.com/test.phpを見てみる、って感じですね。 test.phpには、 <?php /* まずredirect.phpを通しているかが入っているものと */ echo $_COOKIE['admita']; /* それが前提で申し込み完了が行われたかが書かれているチェック項目(これは前回の回答でいったやつですね。) もしまだcheck.phpに記述していないなら、追加で完了しましたフラグを書きこんでください。 */ echo $_COOKIE['complete']; ?> といったものを書いておく感じです。

gerberared
質問者

補足

そうだったのですね~。ありがとうございます。 さっそく、test.phpを設置してcheck.php には以下のよう記入しました。 <?php //クッキー有無を調べます if(isset($_COOKIE['admita']) === true){ //広告を見た日付 $hiduke = date('Y-m-d', time()); setcookie('complete', $hiduke, time()+(60 * 60 * 24 * 30), '/'); } ?> 予約完了ページまでいった後、test.phpを開いてみると、admitaの日付のみでてきました。 もしお分かりでしたら下記の質問にお答えいただけると大変ありがたく思います。 1、根本的なことが理解できていないのかも知れませんが、これは予約完了ページのcheck.phpではcookieをセットするだけで、このユーザーが予約完了後もう一度aaa.comを訪問したときに初めてtest.phpに反映されるということでしょうか??。 もしそうであれば、アフィリエイトとして利用されている方法としては??のように思うのですが広告をみたユーザーが予約完了ページを開いた時点でサイト管理者が確認できるようにするにはどうしているのでしょうか。 2、test.phpでは、admitaの日付のみだったためcheck.phpを開いて、javascript:document.cookie;によってcookieを見るとcompleteと日付がcookieに記入されていたので、check.phpのbodyに <?php echo $_COOKIE['admita']; echo $_COOKIE['complete']; ?> を記入すると ”2011-01-122011-01-17 ”のようにcheck.phpにcompleteの日付もでてきました。そこでもう一度test.phpを開いてみると”2011-01-122011-01-17 ”のようにcompleteの日付がでてきました。 check.phpのbody にechoを記入するのと、別にtest.phpを作成するのとどのような違いがあるのでしょうか。 3、”2011-01-122011-01-17 ”を”2011-01-12 2011-01-17 ”のように半角や全角スペースもしくは他のわかりやすく表示する方法はありますか。 4、setcookieの値にhidukeと文字を加えることは可能ですか。 5、completeの日付がでてくるということは、if(isset($_COOKIE['admita']) === true){ によって、広告以外から訪れたユーザーはcheck.phpでcomplete のcookieをセットされず、必ずredirect.phpを通ってきたユーザーのみにセットされているという認識で大丈夫ですよね。 度々申し訳ありませんがよろしくお願い致します。

回答No.4

この話はどうも説明しづらい話なので、私の書き方が雑なのも相まって、分かりづらいですね。すみません。 まず、おさらい的な話なんですが、 『Cookieは、有効期限を1日、とか30日とかに設定してあると、 一度ブラウザをとじても、もう一度ブラウザを開いてそのサイトに訪れたとき、 Cookieの有効期限内であれば、設定したCookieを参照することが出来る』 この部分の知識は大丈夫ですよね。 今回行おうとしている試みは、この特性を使ったものになります。 仮に、 A = gerberaredさんのサイト(http://aaa.com/) B = 別ドメインのカートサイト(http://bbb.com/) としたとき、 AサイトからリダイレクトしてBサイトに行く = AサイトでCookieを発行してブラウザを閉じるのと一緒のイメージ Bサイトで申し込み完了してIMGタグを吐く = 再びブラウザを起動してAサイトに訪れるのと一緒のイメージ となります。とりあえずこれを前知識としてイメージしてください。 【質問1】imgタグの事 >共有サーバの完了ページに<img src="http://aaa.com/check.php" width="1" height="1" />にすることも可能なのでしょうか。 と、おっしゃられてますが、コレはむしろそうしなきゃいけません。 前知識、のところで書いたとおり、Aサイトにもどってこなきゃいけないので、ここはAサイトに設置したcheck.phpを叩く必要があるからです。 【質問2】完了ページがhttpsの場合の対策 そうすると、リダイレクトを行うAサイトをSSLにしておく必要があります。(レンタルサーバとかだと共有SSLだったりするんでしょうか。) なので、しょっぱなからアクセスされるべき、Aサイトに設置したredirect.phpは、「https://aaa.com/redirect.php」でアクセスさせるようにして、そこでcookieを発行し、 Bサイトに張ったimgタグも「https://aaa.com/check.php」などとする必要があります。 【質問3】 参考サイトのURLには特にgoogle analyticsとかは私には判断出来ない内容でしたので、すみません、スルーさせてもらいます。 今回の内容の場合、 ・gerberaredさんのサイトを訪れて且つ、カートの申し込みが完了した という、二つのステータスを持っているのだと思います。 なので、 ・redirect.php →ここでまずAサイトから着てますよ、フラグをたてる ・check.php →Aサイトから着ているのを確認したら、申し込みが完了しましたよ、フラグをたてる という事を行う必要があります。 【質問以外の回答】 今回imgタグに設置したcheck.phpは、当然、プログラムを実行した後、出力するもの(HTMLとか文字とか)はありません。 このプログラムでは、cookieのセットのみを行います。 なので、申し込み完了ページからはCookieがセットされたか、セットした値は何か、を出力して確認することは出来ません。 という条件で、Cookieのセットを行ったら、Aサイトに再びそのユーザがリンクなどから訪れた際、「申し込みが完了した」というCookieを持っているわけなので、そこで処理を振り分けることが出来るはずです。 もし、上記の内容が理解できた上で、やっぱりそもそもCookieがセット出来てないぜ!っといったことがあったら 一度、ローカル環境などのテスト環境で、処理を簡単にした内容でチェックしてみてください。

gerberared
質問者

補足

ご丁寧にとてもわかりやすく説明していただきありがとうございます。 私の説明不足で申し訳ないのですが、もしくは私が理解できていないのかもしれないのですが、二つのサイトの内、 Aサイト(aaa.com)、Bサイト(bbb.com+ccc.comのドメイン2つ)のccc.com が完了ページがある共有sslサーバになります。 前回では、aサイトの広告 → bbb.com/redirect.php → bbb.com → ccc.com(ccc.comの完了ページには<img src~bbb.com/check.php~>記入)という流れでbbb.comで発行したcookieなのでbbb.com/check.phpで参照できるという認識でした。(redirect.php、check.phpはbbb.comに設置)。 今回、 aサイトの広告 → aaa.com/redirect.php → bbb.com → ccc.com(ccc.comの完了ページには<img src~aaa.com/check.php~>記入)でいずれもテスト用の簡単なものでテスト(redirect.php、check.phpはaaa.comに設置) しているのですが、やはり確認できませんでした。 記入内容も間違いはないですよね? あと、「申し込み完了ページからはCookieがセットされたか、セットした値は何か、を出力して確認することは出来ません。」との ことですが、申し込み完了ページでjavascript:document.cookie;によってcookieを見ているのですが、これでは確認できないということではないですよね? もしくは他に確認方法があるのでしょうか。 また、check.phpの <?php //クッキー有無を調べます if(isset($_COOKIE['admita']) === true){ //広告を見た日付 $hiduke = date('Y-m-d', time()); } ?> $hiduke = date('Y-m-d', time()); の部分を何か他のものに変えたほうがよいとか・・・?? 何度もお手数をおかけしてしまいましてすみません。

回答No.3

共有サーバに置いてあるプログラムとかカートのプログラムなんかってのは修正可能なものですか? 修正、つまりPHPを書き換える、でもいいし、設定画面から、タグを挿入する、なんてことが出来るのかどうか。 PC向けのアフィリエイトなどでよくある手法ですが、 redirect用のPHPは、前回記述した通りで、 次にカートの完了画面とかに、 <img src="http://example.com/cookie/check.php" width="1" height="1" /> みたいなものを貼りつけさせてもらって 実際にそのcheck.php <?php //Cookieが発行されているかチェックして if(isset($_COOKIE['admita']) === true){ //発行されていたら //何か記録するための処理をここにかく } ?> といったものを作ります。 そうするとまず、自サイトで発行したCookieが自サイトで使える形で存在はしているので、 後はカートとかから、imgタグなどで自サイトのチェック用のプログラムが記述されたURLをおいておいてやれば ブラウザは、リンクされているimgタグは画面に表示したいので実行します。 すると、そのプログラムが書いてあるのは自サイトなので、最初にCookie発行してるから、ソレを参照できます、 ってな感じです。 いかがでしょうか。

gerberared
質問者

補足

ご親切にご対応いただきまして本当にありがとうございます。 なるほど、そんな方法があるのですね。さっそく試してみたのですが、 完了ページのcookieで確認できませんでした。 どこが間違っているのかと、追加質問がでてきたのでもしお分かりでしたらお手数をおかけして申し訳ありませんがご教授お願い致します。 広告があるAサイト、複数ドメインがあるBサイト{ bbb.com + ccc.com(共有サーバ完了ページ)}で、A、Bサイトそれぞれの広告からbbb.com/redirect.phpへのリンクを想定してテストしてみました。 ・ bbb.comのサーバにredirect.phpを設置 <?php //クッキー有無を調べます if(isset($_COOKIE['admita']) === false){ //広告を見た日付 $hiduke = date('Y-m-d', time()); //PHPの場合標準では、ブラウザの終了とともにcookieは削除されますので //30日に設定をして、クッキーを書きます setcookie('admita', $hiduke, time()+(60 * 60 * 24 * 30)); } //リダイレクトします header('Location: http://bbb.com', true, 302); exit(); ?> <html> <head> <meta name="robots" content="noindex, nofollow" />   ←必要ない?? </head> <body> </body> </html> ・ 共有サーバの完了ページ <html> <head> 省略 </head> <body> <img src="http://bbb.com/check.php" width="1" height="1" /> </body> </html> ・ bbb.comのサーバにcheck.phpを設置 <?php //クッキー有無を調べます if(isset($_COOKIE['admita']) === true){ //広告を見た日付 $hiduke = date('Y-m-d', time()); } ?> <html> <head> <meta name="robots" content="noindex, nofollow" />    ←必要ない?? </head> <body> </body> </html> ・ bbb.comのページでは ”admita" が確認できましたが、別ドメインの完了ページでは確認できませんでした。 1、redirect.phpとcheck.phpは、Aサイト(aaa.com)のサーバに設置して、リンクをaaa.com/redirect.php,リダイレクト先をbbb.com,共有サーバの完了ページに<img src="http://aaa.com/check.php" width="1" height="1" />にすることも可能なのでしょうか。 2、完了ページがhttpsなので<img src="http://bbb.com/check.php" width="1" height="1" />の部分にhttpがあるため「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。」と警告がでます。 これを避ける方法はありますか。 3、PCアフィリエイトでよくある手法のようですが、通常この記入されたcookieはどのように確認して、ユーザを把握しているのでしょうか。 最初に掲載したブログではgoogle analyticsのユーザー定義でしたが、もっと簡単な方法があるのでしょうか。 この教えていただいた方法とgoogle analyticsと関連させることができるのかも不安なもので。。。 以上、大変恐縮ですがよろしくお願いします。

回答No.2

どうやら、setcookieをしたあとに、リダイレクトするとダメな場合があるようです。 http://www.revulo.com/blog/20070525.html こちらの記事を参考にして、 setcookieの所を、 setcookie('admita', $hiduke, time()+(60 * 60 * 24 * 30), '/'); に書き換えてみてもらっても良いですか。 ちなみにリダイレクトは別のドメインにリダイレクトするわけではないですよね。

gerberared
質問者

お礼

ご回答、本当にありがとうございます。 すみません。別ドメインへのリダイレクトでした。 ちなみに第5引数で domain も指定してみましたが、できませんでした。 例えば、共有サーバやカートを使っていてドメインが違う場合、最後の完了ページまで至ったユーザを把握できるような代替案等をもしご存知であれば教えていただけるとありがたく思います。

回答No.1

つまり フロントのページ(またはアフィリエイトページ)→リダイレクト用のページ→リンク先 という流れで、「リダイレクト用のページ」が、Cookieを落として、その後リダイレクトをかければいいんでしょうか。 redirect.php <?php //クッキー有無を調べます if(isset($_COOKIE['admita']) === false){ //広告を見た日付 $hiduke = date('Y-m-d', time()); //PHPの場合標準では、ブラウザの終了とともにcookieは削除されますので //30日に設定をして、クッキーを書きます setcookie('admita', $hiduke, time()+(60 * 60 * 24 * 30)); } //リダイレクトします header('Location: リンク先URL', true, 302); exit(); ?> URLに書いてある物をそのままPHPに落とすとこんな感じでしょうか。

gerberared
質問者

補足

ご回答誠にありがとうございます。 さっそく上記のとおり試してみたのですが、cookieに、admitaの文字が見当たりませんでした。リダイレクトもちゃんとできたし、サーバーもphp使用可のものなのですが。<?php~?>とリンク先URLを記入して.phpの拡張子をつけて、アップロードするだけでいいのでしょうか。それとも他に追加記入が必要なところがありますか。 ご教授よろしくお願い致します。

関連するQ&A