PHPで閲覧履歴機能を実装したコードサンプル
2016/12/16
ノンプログラマーですが勉強のためにPHP勉強しています。
今回はPHPで「過去に見たページを表示する閲覧履歴機能」を実装するコードサンプルです。
クッキーにタイトルとURLを保存して、取り出します。
他にも方法があると思いますし、ベストではないと思います。
でも初心者向け・簡単な実装であればイケると思います。
Contents
最初にサンプルコード
最初にクッキーを保存するためのPHPサンプルコードです。history.phpにでもしてください。
実際のものと少し変えましたので、もしかしたら間違えた部分もあるかも。ごめんなさい。
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
$data_item = array('test'); //ここに保存したいテキスト(配列にしとく) $data_url = array($_SERVER["REQUEST_URI"]); //現在のURL(配列にしとく) $max = '3'; //保存する数 //テキストの保存 if(isset($_COOKIE['history_item'])){ //現在クッキーに保存されているものがあれば $status = unserialize($_COOKIE['history_item']); //まずアンシリアライズ(?)で配列に foreach($status as $key=>$name ){ if(!in_array($name,$data_item)){ // data_itemにnameがなければ array_push($data_item,$name); // data_itemに突っ込む } if( count($data_item) == $max ){ //保存する数で終了 break; } } } //URL保存 テキスト保存とやってることは一緒 if(isset($_COOKIE['history_url'])){ $status = unserialize($_COOKIE['history_url']); foreach($status as $key=>$name ){ if(!in_array($name,$data_url)){ array_push($data_url,$name); } if( count($data_url) == $max ){ break; } } } //クッキーセット setcookie( 'history_item' , serialize($data_item) , time() + 3600, '/' ); setcookie( 'history_url' , serialize($data_url) , time() + 3600, '/' );
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
表示するためのサンプル
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
if(isset($_COOKIE['history_url'])){ $history_url = unserialize($_COOKIE['history_url']); //クッキーに保存されたURLを配列にする } if(isset($_COOKIE['history_item'])){ $history_item = unserialize($_COOKIE['history_item']); //クッキーに保存されたテキストを配列にする $i = 0; echo '<ul>'; foreach($history_item as $key=>$val){ echo '<li><a href="'.$history_url[$i].'">'.$val.'</a></li>'."\n"; //テキストを表示および同じ順番に保存されているURLを表示 $i++; } echo '</ul>'; }else{ echo '<p>過去に見たページはありません。</p>'; }
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
PHPで閲覧履歴機能を実装するには
まずsetcookie()を使います。setcookie()の細かい内容はこちらを見てください。私はここから始めましたが、引数に何を入れるのかくらいしか理解していませんので、そんな感じで大丈夫だと思います。
ハマったところは、setcookieではクッキーに配列をそのまま突っ込めませんでした。ややこしかったのですが、クッキーを配列にすることはできても配列を突っ込むことができないのです。例えば、第一引数をtest[0] や test[1] にすればそれぞれに第二引数をabc、defにすることはできますが、array(abc,def)はできないんですね。当たり前じゃんと思うかもしれませんが、できたら楽じゃん。。。なのでserializeとunserializeを使って一括でクッキーに保存するようにしています。serializeについては何なのか良く分かりません。おおよその理解としては配列を文字列にするのがserialize、文字列を配列にするのがunserializeということかなと思っています(笑)
もう一つハマったのがクッキーの保存上限です。サイズなのか個数なのかはわかりませんが、サンプルコード例では"3"としています。あまり多すぎると保存上限を超えて変な感じになります。
まだあります。setcookieはヘッダーで送信するとのことで、echo や html の後には記述できないようです。最初</body>の直前に入れていましたがエラー出ましたので、最初に記述するようにしたらOKでした。
実装の手順
setcookie()を使うことが分かってもクッキーをセットする最後に使いますので、サンプルコードの流れもざっくり伝えます。
①まず今見ているページのURLとテキスト(タイトル)を、それぞれ別の配列に保存
②過去にページを見ていなければ(クッキーが保存されていなければ)、①をそれぞれクッキーに入れます。setcookie()をURLとテキストで2回しています。クッキーに入れる際には配列から文字列に変換(serialize())をします。
③過去にページを見ていれば、①の配列の最後に突っ込んでいきます。
④途中で重複があれば、突っ込まないようにします。in_array で配列の中の重複チェックをしています。
⑤配列が上限数に達したら終了
⑥③でできた配列を②と同様にserialize()してクッキーに入れます。
⑦保存されたクッキーをunserialize()で取り出します。setcookie()で保存されたクッキーは、$_COOKIE['']で取り出せます。
もっと簡単な正しいやり方や上限のない方法もあると思うけど・・
ノンプログラマーなので、正しいこととか簡単なやり方とか分かりません(笑)という言い訳をしつつ、自分のサイトだけでしか使わないのでいいかなと。ちゃんとDB使えば、クッキーにはユーザーIDだけを発行してDBから情報を引き出すみたいなことはできそうですが、めんどくさいからいいや。
参考にしたサイト
閲覧履歴機能を実装するにあたり、何から始めたらいいのか分かりませんでしたが、まず初めに見たブログです。ただ良く分からなかったので、全然違うことやりました。でも勉強になりました。ありがとうございました。
PHP クッキーに複数の値を一括登録する方法
serialize()とunserialize()でクッキーへの配列セットが簡単になりました。ありがとうございました。