質問: 複数ユーザーがいて、各ユーザーに複数(数が多い)の設定項目を紐付けたい。 その場合の設定ページの実装方法について ### 前提・実現したいこと 例えば以下のようなデータベースを用意する ユーザーIDと名前のテーブル uid(pk)|name 設定(各設定項目はONかOFFだけのものとする) uid(pk)|settingid(pk)|設定項目名称|value(bool) あるユーザーの設定を編集するページのURLを 例えば:http://hogehoge.com/editsetting とする。 ここでユーザーIDが1のユーザーを編集する場合 ユーザーIDの渡し方としてGETもしくはPOST (※1 GET http://hogehoge.com/editsetting?uid=1 POST http://hogehoge.com/editsetting とどちらでもやり方はある。 そして http://hogehoge.com/editsettingのページ では各ユーザーごとに設定項目が例えば30個あったとして、1ページにすべて表示するのではなくページャで10項目づつ3ページで構成されるとする。 http://hogehoge.com/editsetting?page=1(もしくはhttp://hogehoge.com/editsetting?uid=1&page=1) http://hogehoge.com/editsetting?page=2(もしくはhttp://hogehoge.com/editsetting?uid=1&page=2) http://hogehoge.com/editsetting?page=3(もしくはhttp://hogehoge.com/editsetting?uid=1&page=3) 設定ページのレイアウト チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 チェックボックス|設定項目名称 < 1 2 3 > [更新][やめる] のようなページにしようとした時、最初にこの設定画面を開いた時は、DBから該当するuidの設定値を読み取り、それをデフォルト値としてチェックボックスにチェックを入れる。 その後、チェックボッックスにチェックを入れたり外したりした後ページ間を遷移してもチェックボックスの値は保持していたい。(※2 最後に[更新]ボタンを押下すると、3ページ分のチェックボックスをDBに書き込む。 [やめる]ボタンをクリックするとチェックボックス操作による3ページ分チェックボックスの値は破棄する。 といったページにしたい。 そこで上記の(※1 と (※2の部分の実装方法ですがやり方としては色々考えられると思いますが、普通どういう手段が一般的でしょうか? (※1 uidの渡し方&保持方法 GETでuid=1のように渡し、その後ページ遷移してもGETのパラメータとして持っておく場合 実装楽、かつ1~3ページの間でもURLにもたせておけばよいので容易だが、途中でuid=1の部分を手動でuid=2など変更されるとどうしようもなくなる。 POSTで受け取った場合、uidを内部でsession変数等でもっておかないといけない。(別ユーザーを編集のタイミングでsession変数の更新に注意が必要) (※2 ページ間でのチェックボックスの値の保持 こちらはsession変数として持っておく方法、cookieに書き出してしまう方法がすぐに思いつきましたが sessionの場合、 この編集ページに入ってきた時点でuidとともにチェックボックス30項目をsession変数で保持、チェックボックスの変更をjavascriptで監視、 変更のイベントがあった毎にajax等でも良いので、session変数更新、ページ遷移ごとにsession変数の値でチェックボックス更新、そして[更新]または[やめる]ボタンがクリックされたらsession変数破棄 cookieの場合 javascriptでチェックボックスの変化を監視し、都度cookieに書き出す、ページ遷移時にcookieの値を取得してチェックボックスに反映 どちらにしてもユーザーは複数存在し、この編集ページを使用する人間はすべてのユーザーを変更できる為、混ざらないようcookieやsession変数の削除のタイミングまたは、uidによる区別はしっかりしないといけない。 上記のようなものを作る時、一般的にはどの方法をとられる事が多いですか?、もしくは私ならこうする等の意見をいただければ幸いです。 今までこのような場合session変数にいれて、javascriptで監視という方法を取ってきましたが、かなりガリガリとコーディングしてあまりスマートな実装でない気がして何か他に良いやり方や一般的なセオリーはないかな?と思い質問させていただきました。 よろしくお願いいたします。
回答: まず「uidの渡し方&保持方法」に関してはGET、POSTどちらも同じくらいいるのではないでしょうか。 ただ今回の場合は送る値がuidという事で重要な値ならば、そのまま送受信するのは良くありません。 GETならば最低限「urlencode」をしましょう(出来れば可逆暗号化も)。 POSTでもhidden等で渡すのであれば可逆暗号を用いて暗号化しましょう。 次に「チェックボックスの値の保持」に関してですが、sessionが多いかと思います。 ただし、注意しないといけないのがsessionもcookieも厳密にいえばブラウザがcookieを消したら判別できなくなりますので都度、値の存在確認もした方が良いと思います。 (sessionはcookieの中のsession_idを見てサーバーが紐づけするので)