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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Zend Framework

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

JavaScript

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

jQuery

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

Q&A

解決済

3回答

8342閲覧

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

hiim

総合スコア1689

PHP

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

Zend Framework

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

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2016/10/19 02:29

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

###前提・実現したいこと
例えば以下のようなデータベースを用意する

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

投稿2016/10/19 03:01

nobinobi

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiim

2016/10/19 03:10

ありがとうございますm(_ _)m > GETならば最低限「urlencode」をしましょう(出来れば可逆暗号化も) そうですね、少しでもセキュリティ上げる為そうさせていただきます。 > 値の存在確認もした方が良いと思います。 phpsessidの確認も入れたいと思います。 GET&sessionの方向で実装してみたいと思います。 ありがとうございましたm(_ _)m
guest

0

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

こうすれば、

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

といったメリットがあります。

ご参考になれば。

投稿2016/10/19 02:51

solight

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiim

2016/10/19 03:07

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

0

ベストアンサー

参照系の画面なので、通常であれば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 02:43

shoota

総合スコア246

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiim

2016/10/19 03:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問