[PHP・cookie] クッキーでお気に入りや履歴を保存

PHP

できました~~!!

一覧の中から目的のものを一時的に保存できる
簡易的なお気に入りリストのようなものが作りたかったのですが、
ようやく完成ですキラキラ

本気のお気に入り保存は会員登録でつくろうと思いますが、
一時的なものが欲しかったのです。

目的:一覧から、お気に入りを複数個保存したお気に入り画面を作る

クッキーに保存は setcookie() を使うとして・・

複数保存。というところで 配列を保存?と思った私。
setcookie() で配列もセットできるし。。

でもそこに一個追加したり一個削除したりするイメージが全然できなかった。。

そこで再度登場N師匠のご助言。

「クッキーには保存したいデータのIDを羅列した一つの文字列を入れる~~」

なるほど!

ちょっとこれ検索の時にもやったわ!空白スペースで分割したり結合したり!

今回はIDをスラッシュで繋げて、COOKIEに保存したいと思います。

こんな感じ→1111/3213/3433/1121

▼▼お気に入りに追加パターン

◆[追加元]「お気に入りに追加」ボタンからは、IDをPOSTで飛ばす。

一覧の「お気に入りに追加」ボタンからは、そのデータのIDをPOSTで
お気に入り.php へ飛ばします。

◆お気に入りページ.php では、POSTで受け取ったIDを
今クッキーに入っている文字列に追加する。

いろいろ試しましたが以下の流れに落ち着いた。

1,POSTの追加IDをとりあえず受け取る。
$add = $_POST[‘add’];

2,今クッキーに入っている文字列を取り出し、
$favorite_data = $_COOKIE[‘favorite’];

3,スラッシュで分割して配列に入れる。
$favorite_datas = explode(“/”, $favorite_data);

4,一旦、追加IDと同じものを探して削除する。
if (count($favorite_datas) > 0) {
foreach ($favorite_datas as $word) {
if ($word != $add) {
$new_favorite_datas[] = $word;
}
}
}
    ※上記は、IFで、$favorite_datasが配列のときに実行。
配列でないとき($new_favorite_datas = $favorite_datas)と、
$favorite_datasが空のとき($new_favorite_datas = “”)の式も別途用意

5,新たにクッキーセットする用に、配列を結合して追加IDをマージ
$new_favorite_data = implode(“/”, $new_favorite_datas);
$new_favorite_data = $new_favorite_data . “/” . $add;
※こちらも、IFで、$favorite_datasが配列のときに実行。
配列じゃないときと空のときのパターンも作っておく

6,追加してマージしたものをクッキーセット
setcookie(“favorite”, $new_favorite_data, time() + 9999999);

7,SQLクエリ用に、追加してマージしたものを分解
$new_favorite_datas = explode(“/”, $new_favorite_data);

なんだかまどろっこしいやり方かもしれないですが、
ブラウザで戻ったり進んだり、または再読み込みするだけでも
同じIDが追加されて、
どんどん重複増えてしまうので重複を削除してから追加しました。
将来的には個数制限もかけたいし。

しかも。上記のやり方だと「お気に入りから削除」も同じやり方でOK音符

▼▼お気に入りから削除パターン

◆[削除元]「お気に入りから削除」ボタンはお気に入りページにある。
削除ボタンをおされたIDをPOSTで自分自身(お気に入り.php)へ飛ばす。

◆お気に入り.php では、POSTで受け取ったIDを
今クッキーに入っている文字列から削除する。

・これが上記追加パターンと全く同じで、5番の追加をしないだけですね!
書き方によっては7番はいらないかも。

▼▼お気に入り画面表示
こうしてできた新しい $new_favorite_datas から、
SQLのWHERE文を作って表示する。
ここはフリーワード検索と全く同じ。

きっかけが分かれば考えてなんとか辿り着くことができました^^
文字列をこねくり回すのが重要なんですね。
あとは関数の蓄積でしょうかプリン

▼▼詳細画面の表示履歴!
そしてこの流れでクッキーつながりの
表示履歴も作ってしまった!!

こちらのページが超参考になりました。
クッキーにユーザーの閲覧履歴の保存
書き方がスマートすぎるわ・・

しかし私の表示したいのはURLではなくて名前!なので
IDに紐付く名前を取ってくるために
SQLクエリも飛ばしてカスタマイズして使用。

しかも新しいのを上にしたいのでいろいろ調べたらソートにもいろんな種類があるのね!
配列のソート
キーを基準に降順でソート(krsort)すれば、クッキーに登録されたのが新しい順に並びました。

あと、setcookie()なのだけど
マニュアルに「クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります
と書いてあってむむ?と思って調べたら
画面にデータを表示する前に実行する必要があります。表示後に実行しても、値はセットされません。ですので、HTMLタグ込みで出力する場合はHTML 出力する前に!!~~とのこと。

なんか普通に中ほどに書いていたけどセットされていた気がする・・(var_dumpなら前でもOKとか??)
よく分からないけどいい子にルールにならってPHPの上部へ記載しておきました。

なんだかクッキー面白かったわー!

—–

コメント

タイトルとURLをコピーしました