質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.37%

  • PHP

    22512questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • JavaScript

    18786questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    7556questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • Zend Framework

    73questions

    Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

ページャによる複数ページ間のチェックボックスの値保持の実装について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,685

hiim

score 1639

複数ユーザーがいて、各ユーザーに複数(数が多い)の設定項目を紐付けたい。
その場合の設定ページの実装方法について

前提・実現したいこと

例えば以下のようなデータベースを用意する

ユーザー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で監視という方法を取ってきましたが、かなりガリガリとコーディングしてあまりスマートな実装でない気がして何か他に良いやり方や一般的なセオリーはないかな?と思い質問させていただきました。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

参照系の画面なので、通常であればGET実装です。

URLはなんでもいいですが、以下のパターンでしょうか。

/editsetting?uid=1&page=1
/editsetting/1/?page=1
/editsetting/1/1

手動でuid=2など変更されるとどうしようもなくなる。

これは「パラメータを意図しない値に改竄する難易度」の問題であって、POSTの場合でもPostデータを改ざんされてしまえば同様の問題が発生しますので、どちらにせよ404表示する、1ページ目を表示する、共通エラーにリダイレクトするなどの対処が必要ではないでしょうか。

チェックボックスについてはSession保存が普通かと思います。
CookieとSessionの最も大きい違いはそのデータが保存される場所で、Cookieの場合はクライアントサイドにデータがあることになり、想定外のケースが多くなるからです。(たとえば、1ページ目から2ページ目に移動したあとに、ユーザがブラウザクッキーを削除したらどうしますか?)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/19 12:03

    ありがとうございます。
    > 「パラメータを意図しない値に改竄する難易度
    そうですね、確かにこれは別の問題ですね、、

    現在の私の環境が若い頃と違い周りにプログラマー等はほぼ居ない環境の為、仕事をしながら最近のセオリーはどうなんだろう?最近はもっと別の方法が主流なのでは?等よく今の方法でよいのか悩む事があり相談させていただきました。今も予想が大きくずれてなくて良かったです。
    sessionの方向で考えてみます。
    ありがとうございましたm(_ _)m

    キャンセル

+1

ページングしなければいけない理由が、「項目数が多いことからくるユーザー負荷を下げたい」だけであれば、
実体は1ページだが、Javascriptで2〜3ページ部分を表示上隠し、ページングボタンで切り替える
をまず試すと思います。

こうすれば、

  • システムでページング管理をしなくてすむ
  • 値の引き回しを考えなくていい (一時的でいいのでDOM上だけだろうと変数だろうと可)
  • 実体1ページだから、1submitでデータを一挙送信できる
  • ページングがJavascriptで行うので、レンダリングがないため一瞬で遷移する
    といったメリットがあります。

ご参考になれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/19 12:07

    ありがとうございます。
    私もできればそうしたいのですが、質問の為、実際の仕様をかなり簡略化して質問させていただいた為、説明不足ですいません。
    諸々の理由から今回ページ遷移も必要な為、値の引き回しは必須でした。

    キャンセル

+1

まず「uidの渡し方&保持方法」に関してはGET、POSTどちらも同じくらいいるのではないでしょうか。
ただ今回の場合は送る値がuidという事で重要な値ならば、そのまま送受信するのは良くありません。
GETならば最低限「urlencode」をしましょう(出来れば可逆暗号化も)。
POSTでもhidden等で渡すのであれば可逆暗号を用いて暗号化しましょう。

次に「チェックボックスの値の保持」に関してですが、sessionが多いかと思います。
ただし、注意しないといけないのがsessionもcookieも厳密にいえばブラウザがcookieを消したら判別できなくなりますので都度、値の存在確認もした方が良いと思います。
(sessionはcookieの中のsession_idを見てサーバーが紐づけするので)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/19 12:10

    ありがとうございますm(_ _)m

    > GETならば最低限「urlencode」をしましょう(出来れば可逆暗号化も)
    そうですね、少しでもセキュリティ上げる為そうさせていただきます。

    > 値の存在確認もした方が良いと思います。
    phpsessidの確認も入れたいと思います。

    GET&sessionの方向で実装してみたいと思います。

    ありがとうございましたm(_ _)m


    キャンセル

同じタグがついた質問を見る

  • PHP

    22512questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • JavaScript

    18786questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    7556questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • Zend Framework

    73questions

    Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。