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

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

ただいまの
回答率

88.09%

RDBの運用方法と、サーバーサイドの入力チェックの実務

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 501

score 57

例えばなのですが、現在2つのファイルが存在します。
post.php(質問ページ)
single.php(質問の閲覧ページ)

これをteratailのサービスでいえば、
マークダウンで質問をユーザーが記載し、投稿するまでのページ(post.php)があり、実際に「質問する」のボタンをクリックすると自分が質問した内容の閲覧ページ(single.php)に飛ぶ仕組みになっているかと思います。
*そもそもphpで書かれていないと思うので、例えばということなります。

post.phpで質問した内容をサーバーサイドでチェックする必要があり、これを通過した場合にはRDBへ値が格納されるとともにsingle.phpで質問内容が表示される必要があると思うのですが、このRDBへの格納運用方法とサーバーサイドでのチェック方法について実務的なアドバイスを頂きたく投稿させていただきました。

●RDBへの格納方法
求める仕様によっては一概には言えないと思うのですが、一般的にという点でアドバイスを頂ければと思います。
私の想像では投稿された質問RDBとその後の個別の閲覧ページ内の評価であったり、コメントは別のテーブルに格納されているかと思っております。
少ないテーブルで処理して(いたずらにテーブルを増やさない)運用する方法がある一方、例えば新しい質問が投稿されるたびにその閲覧ページで入力される情報を格納するためのテーブルをcreateしてそれぞれの目的別に数が多くてもテーブルを生み出していくことがどちらが適切であるのか指針はあるのでしょうか?
言い換えるのであれば、テーブルを切り分ける(上記の例でいえば、post.php内で入力される情報とsingle.php内で入力される情報を同じテーブルにするまたは異なるテーブルで処理する)境目はどのような基準で判断するのが一般的なのでしょうか?情報の持つ特性や秩序やクエリのスピード等いろいろな視点があると思うのですが、コメントをいただけると嬉しいです。

●サーバーサイドのチェック方法
例えばこの質問がサーバーサイドチェックを通ればそのまま質問の閲覧ページに飛び、皆様もそれを閲覧できる状態になると思います。この質問ページをpost.phpで皆様も閲覧できるページがsingle.phpであるとしたら、サーバーサイドチェックのコードは一般的にどこに記載されているのでしょうか?
今、私はそれをsingle.phpのトップに記載して、通過しなければもとのpost.phpにリダイレクトし、通過すればRDBにその情報を登録して、single.php上で通過した内容を表示すれば良いと思いコードを書き始めました。
そこでふと、直接single.phpを見に来る閲覧ユーザに対しても、サーバーサイトのチェックからコードが始まるため自分がやろうとしていることに疑問を感じております。single.phpに入力チェックを書くことで以下の矛盾が生じております。

>投稿者
1.質問投稿ページ(post.php) → 2.閲覧ページ(single.php)でチェック → 3.閲覧ページ(single.php)で通過していればそのまま表示

>閲覧者
2.閲覧ページ(single.php)でチェック → 3.閲覧ページ(single.php)で通過していればそのまま表示
そもそも閲覧者に2.のプロセスは関係がない。。

実務的に
途中でpost.phpから例えばcheck.phpのようなチェック用のファイルを用意して、通過すればsingle.phpにさらにリダイレクトするように何か一つ挟むのでしょうか、または、single.php内で投稿者なのか閲覧者なのかを判断する術があり、閲覧者であれば入力チェックをスキップするような分岐を準備して処理されるのでしょうか、それとも全く別のアプローチなのでしょうか。

基本的な内容であったり、読みづらい文章であれば誠に申し訳ございません。質問内容等不明な点があればご指摘いただければ速やかに補足や修正をさせていただきます。

何卒、よろしくお願い申し上げます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • maguzo

    2018/09/20 10:10

    mts10806様 コメントありがとうございます。CakePHPで書かれていたのですね!身近でPHPで書かれているウェブサイトはあまりないのかなと思っていたのですが、親近感が湧きました♪

    キャンセル

  • m.ts10806

    2018/09/20 10:13

    まあフレームワーク使っていればその言語感はでないですしね。私の感覚ではPHPで書かれたサイトの方が多い印象です。企業サイトをWordPressで、とか多いですし。 CHERRYさん 頻発してますよね。あれでcakePHPで作られていることを知ったのは間違いないですが^^;

    キャンセル

  • maguzo

    2018/09/20 10:15

    CHERRY様 コメント有難うございます。「データベースの正規化」という概念をおはずかしながら初めてしりました。記事もたくさんあり根本的なRDB構築の考え方が載っていました!この機会にたっぷり学んでみます♪

    キャンセル

回答 2

checkベストアンサー

+2

確認画面を挟むかどうかで若干作り方が変わってくることもありますが、
多くは入力画面自身にPOSTし入力チェックを行い、OKであれば完了画面(または確認画面)へリダイレクト、
NGであればエラー内容と元の入力内容を初期値として入力画面を再表示だと思います。

ただ、teratailは非同期でコメントの投稿などを行っている部分も多く見られるので、AjaxでサーバーサイドへPOSTし、入力チェックでOKであれば投稿、NGであればエラー内容返却 しているところもありますね。
質問も回答もリアルタイムで入力内容がマークダウン含めて反映されますが、Ajaxで通信して変換したものを表示しているように思います。
非同期通信のリクエスト・レスポンスについてはブラウザ開発ツールの「ネットワーク」の項目である程度追えるので確認してみてください。

直接single.phpを見に来る閲覧ユーザに対しても、サーバーサイトのチェックからコードが始まるため自分がやろうとしていることに疑問を感じております。single.phpに入力チェックを書くことで以下の矛盾が生じております。 

上記ですが、$_SERVER ['REQUEST_METHOD']でPOST判定を入れておけば閲覧者にはそのチェック処理を通ることはないので問題ないかと思います。
SUBMITボタンがコメント・回答・回答へのコメントなどいろいろありますが、ボタンのnameによって処理を分岐させておけば同じ処理を通らないようにはできます。
ただ、質問明細ページでは先に書きました非同期通信による入力チェック、投稿処理をしている箇所も多いので、押したボタンのイベントをそれぞれ振り分けておけば重複しないような作りにはできますね。

また、質問テーブルに投稿者IDを保存しておくようにしておけば、投稿者とそれ以外を振り分けることができますので、例えば投稿者のみに編集ボタン・ベストアンサーボタンなどを表示させたりとか、そういったことをやっているのではないでしょうか。

まあ、ミニマムを追い求めるとteratailも掲示板投稿の仕組みになるので、その掲示板投稿の仕組みの最小構成を基盤として設計を考えていくとイメージしやすくなるかもしれません。
マークダウンや非同期通信での投稿や新着通知などもあくまでやり方・見せ方の1つにすぎません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/20 14:21

    質問投稿したことはないのですがPHPでリダイレクトではないかと。
    自身へ送信→入力チェック→OKならDBに登録し質問IDを取得→その質問IDのページへリダイレクト。
    ※teratailはURLにルールがあるので質問IDさえ取得できれば非同期でPHPに渡して入力チェックから質問ID取得まで行い、その質問IDを返してJavaScriptでリダイレクトもありますけど。
    ちなみにformのactionがしているのはあくまで指定先へのform情報の送信でありリダイレクトとは違います。

    キャンセル

  • 2018/09/20 16:02

    有難うございます。
    申し訳ございません、action=redirectと思い込んでおりました。
    度々お付き合いを頂き申し訳ございませんでした。
    具体的な道筋をたてることができました!
    改めて、御礼を申し上げます。

    キャンセル

  • 2018/09/20 16:29

    解決に向かいそうで何よりです

    キャンセル

+1

●RDBへの格納方法

通常、「いたずらにテーブルを増やさない」形で運用します。データに応じて動的にテーブルを増やすのは、よほど特殊な場合(たとえば、インデックスのないBigQueryを使う場合など)に限られます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/20 10:17

    maisumakun様
    コメントありがとうございます。同じテーブル化で検索処理等をする場合、レコードが増えるほど、パフォーマンスが落ちていくものと思っていたので、出来るだけ切り分けていくべきかとも思っていましたが、なるほどです。
    一つの指針として、念頭において取り組んで参ろうとおもいます。

    キャンセル

  • 2018/09/20 10:43

    > レコードが増えるほど、パフォーマンスが落ちていくもの

    インデックスを適切に付ければ、ほぼ問題になりません(全文検索などをする場合は、それ用に構築する必要もあるかもしれませんが)。

    キャンセル

  • 2018/09/20 12:44

    コメントありがとうございます。インデックスを適切に付すという点を次のステップで勉強してみようと思います。お力添えに感謝いたします。

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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