ウェブアプリの設計に問題がないかご指摘いただければと思います。

このQ&Aのポイント
  • 顧客情報入力フォームのバリデーションとデータ処理に問題はないか
  • セッションのデータ保持とセキュリティについての問題はないか
  • 異なるページを開いた際のセッションの挙動に問題はないか
回答を見る
  • ベストアンサー

ウェブアプリの設計に問題がないかご指摘いただければと思います。

ウェブアプリの設計に問題がないかご指摘いただければと思います。 たとえば顧客情報入力フォームがありまして、テキストを入力し、確認ボタンを押すと、入力値のバリデーションを実行し、問題があれば入力画面に戻り、エラーメッセージも表示します。問題がなければ入力値をセッションに格納し、実行したいSQLの入ったクラス名、メソッド名、post_keyもセッションに格納し、確認画面を表示します。 確認画面の「送信する」とか「登録する」ボタンを押すと、 セッションに格納されたpost_keyと同一のpost_keyをaction.phpにポストし、 リフレクションを使ってセッションに格納されたクラス名、メソッド名のSQLを実行します(大抵INSERT処理です)。 この処理で意図しない動作が起こるなど、設計上の問題はないでしょうか? ちなみに、タブブラウザなどで別のタブに別のページを開くと、セッションに格納された入力値や、SQLのクラス名、メソッド名、post_keyは削除されます。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
  • mizutaki
  • ベストアンサー率33% (111/333)
回答No.2

説明が結構難しいですが、 ユーザ情報を登録するなら、その情報はuser_regist.phpみたいな処理に値を渡して その処理の中でクラスやDB関連のファイルを読み込み、操作を行う。 ユーザ情報を変更するなら、user_edit.phpみたいな処理を呼び出し、上で呼び出したクラスと同類の物を読み込んで、変更処理を行う。 という風にします。 こういう風にした場合、登録した後に確認メールを送る処理を新たに追加する場合は user_regist.phpの登録処理がうまく行った後にメール送信処理を呼び出す等と 単純な機能追加はあまり考えずに出来ます。 action.phpでやりたい処理が一つのプロセスからなるなら、まだいいのですが、 登録→OKなら登録ID(DBのauto_increment)をメールのテンプレに入れて送信 と、2種類の処理を要求したり 失敗なら一旦登録内容をエラーログに保存してから、エラーページに飛ばすとか 複数の処理を組み合わせて処理を行いたいとなると、 sessionで処理パターンを渡すのは結構大変ですし、 その処理パターンを何らかのファイルに定義しておくなら、 わざわざaction.phpを通さずにその定義ファイルを呼び出しても大して苦労は変わらない。 質問者さんのやりたい事はフレームワーク的で別に悪い方法ではないとは思いますが、 そういうシステムを構築するには少々手間がかかる そして、想定外の拡張をする際に対応しきれなくなる可能性が出てくる という危険性があります。

その他の回答 (1)

  • mizutaki
  • ベストアンサー率33% (111/333)
回答No.1

セッションの削除などをちゃんとすれば、二重投稿なども起こりませんし、 少々気にしすぎかと ただ、その設計は少々厳しい設計になると思いますよ。 リフレクションをどうとかクラス名やメソッド名という部分を見ると、 情報を取得した時点で、 登録処理を行うクラスを予約して、 実際に実行する時は、 予約した情報を元にクラスや関数を呼び出すようなやり方に見えますが、 そのような手法は手間がかかりますし、 途中でバグが混入しても、追いかけるのが大変になりやすい。 そもそも、情報を取得した時点でクラスやメソッドを予約するメリットが特にないです。 データやページ遷移の情報はセッションで持って、 処理などは全部個々のファイルやプロセスにまかせた方がいい。 クラスやメソッドを持ったまま移動して、その先で処理する方法は、 現時点ではメリットが見えません。

dalianse
質問者

お礼

ご回答ありがとうございます。 私がメリットと感じた点は、入力値の渡し先が、action.phpに一元化できる点です。 クラスとメソッドを事前に予約せずに、このようにSQLメソッドの実行を1つのファイルで行ういい方法があればぜひご教授願います。 また、「処理などは全部個々のファイルやプロセスにまかせた方がいい。」の部分をもう少し具体的な実装方法として提示していただけませんでしょうか? よろしくお願いします。

関連するQ&A

  • VC++/MFCでリフレクション

    Javaでは、ObjectのgetClass()でClassクラスの インスタンスが取れ、実行時に指定した、メソッド名や、引数で、動的にメソッドを呼びだすようなリフレクション機能が使用できます。 同様のことをC#でも実装したことがあります。 VC++/MFCにて、このようなリフレクションをやるやり方を教えてください。 C++の標準あるいわ、MFCの機能など、どちらでもよいです。 メタクラス型のようなものを実行時に取得して、リフレクションする方法だと思います。 質問の内容はVC++.NETやVC++/CLIではないです。そちらのほうでのやり方は既に発見しました。

  • C++のソースをライブラリ化すると問題が・・・・・・

    他の人のプログラムをLibにして流用しようとしているのですが, 問題にぶち当たってます. Libで定義されているクラスに, ある情報を取得/格納できるクラスがあるのですが, いざ,そのクラスをインスタンス化し, クラスで定義してあるメソッドを実行してインスタンスのメンバ変数に情報を格納した後に,インスタンスのメンバの情報をメソッドなどは使わずに取り出そうとすると一部の情報が格納されておらず抜き出すことができません. そのクラスにはシングルトンで実装されており,クラスが持っている情報表示用メソッドを実行すると,ちゃんと,格納されてるぽいのですが・・・・・.もちろん,メンバ変数はパブリックです. 唯一違うとすれば,取り出すことができるメンバの型はdoubleで,取り出せないのはVector< (独自の構造体) >という点くらいです・・・・.エラー内容は取り出せないというよりはVectorのメモリが確保されていないような感じです. 当然,Libをexeで起動した場合は正常に動いているます. 何か思いつく原因は無いでしょうか?? 宜しくお願いします!!

  • チェックボックスの値取得

    以前、http://oshiete1.goo.ne.jp/qa2807598.htmlにて、 チェックボックスで配列を使わずに、チェックした値を取り出す方法を質問させていただいたものです。 教えていただいた方法で表示からメール送信、データベースへの格納まで上手く出来ていたのですが、仕様が変更になり、選択項目の量が増えてしまいました。(30~40になってしまいました・・・) 教えていただいた方法で何とか処理できるようなのですが、処理に時間がかかってしまっているような感じです。 <?PHP  session_start();  if (!empty($_POST['key01'])) {   $_SESSION['key'] = $_POST['key01'];  }  if (!empty($_POST['key02'])) {   if (empty($_SESSION['key'])) {    $_SESSION['key'] = $_POST['key02'];   }else{    $_SESSION['key'] .= "\t" . $_POST['key02'];   }  }  if (!empty($_POST['key03'])) {   if (empty($_SESSION['key'])) {    $_SESSION['key'] = $_POST['key03'];   }else{    $_SESSION['key'] .= "\t" . $_POST['key03'];   }  }    ・  ・  ・  ・ といった感じで、keyが30になるくらいまで続きます。 この後、確認メールの送信や、DB格納等の処理が続く予定ですが、どこかで処理が止まっているような感じで上手くいきません。 選択項目が多い場合のやり方は何かありますでしょうか?

    • ベストアンサー
    • PHP
  • WEBでServletに値を渡してウィンドウを閉じたいのですが…

    ある子ウィンドウで選択した値をServretに渡してセッションに格納して子ウィンドウを閉じたいのですが、 Servletで処理している最中にウィンドウが閉じてしまい、値を格納できません。 (IOExceptionが出てしまい、セッションに格納できません。) Servletに渡し終えたかの判断ができればいいのですが…何かよい方法はありませんか? 下記にJava Scriptを書いておきます。 function action_submit(){ with(document.form**){ action= "<Servlet>?URLNAME="+URLNAME.value;   method= "POST";   submit(); } window.close(); } Javaでの制御なのかJava Scriptの制御なのかどちらがいいのでしょうか? ご回答よろしくお願いします。

  • php入力画面から確認画面へ情報の受け渡しについて

    php 参考書を見て、入力フォームを作成しているのですが、入力画面から確認表示画面へ情報の受け渡しについて。コードは下に記載してます。 最初の入力画面ではmethod=postで送信した値を$name = $_POST['name'];に格納して次ページに値を渡すそうですが、 しかし最初の入力画面のコードに$name = $_POST['name'];と、もうひとつ、$name = $_SESSION['name'];でセッションに保存して、次ページに送るそうですが、 保存したSESSIONの値は次ページの確認表示画面から戻る際に値を保持する際に使うからだそうですが、値を次ページに送る役割が$_POSTやSESSIONにあるならば、SESSIONの記述のみで 次ページに送れると思うのですが、なぜこのコードの場合、$_POSTに値を格納する必要があるのでしょうか? 以下のような解釈で正しいでしょうか?? 「$_POSTは送られた値をフォームのvalue内にechoで出力するため、SESSIONはページから戻る場合に値を保持するため」 回答よろしくお願いいたします。 コード 入力初期画面 <?php session_start(); $errors = array(); if(isset($_POST['submit'])){ $name = $_POST['name']; if($name === ""){ $errors['name'] = "お名前が入力されていません。"; } if(count($errors) ===0){ $_SESSION['name'] = $name; header('Location:https:次ページへform2.php'); exit(); } } ?> <body> <form action="form1.php" method="post"> お名前 <input type="text" name="name" value="<?php if(isset($name)){echo $name;}?>"> <input type="submit" name="submit" value="確認画面へ"> </body> コード 確認表示画面 <?php session_start(); if(isset($_SESSION['name'])){ $name = $_SESSION['name']; } <body> <form action="form3.php" method="post"> お名前 <?php echo $name;?> <input type="submit" name="submit" value="送信する"> p><a href="form1.php?action=edit">入力画面へ戻る</a></p> </body>

    • ベストアンサー
    • PHP
  • リフレクション

    Webアプリ上でリフレクションにてとあるクラスのメソッドを実行するサンプルを作成して 見たのですがうまく動きませんでした。最後のmethod.invoke()の処理にてExceptionが発生し、 java.lang.IllegalArgumentException: object is not an instance of declaring class と表示されてしまいます。 作成したサンプルは下記なのですがどこが原因かお分かりになりますでしょうか。 try { Class cls = Class.forName("dao.TestDao"); // 引数の型をセット Constructor constructor = cls.getDeclaredConstructor(HttpSession.class); constructor.setAccessible(true); // 引数を渡してオブジェクトを生成 Object obj = constructor.newInstance(session); Method method = cls.getDeclaredMethod("getDataDao", int.class); method.setAccessible(true); Object result = method.invoke(cls, new Integer(100)); } catch (Exception e) { e.printStackTrace(); } // このクラスのgetDataDao()をリフレクションにて実行 public class TestDao { HttpSession session = null; public TestDao(HttpSession session) { this.session = session; } public List<String> getDataDao(int iNo) { List<String> list = new ArrayList<String>(); list.add((String)session.getAttribute("1")); list.add((String)session.getAttribute("2")); list.add((String)session.getAttribute("3")); list.add((String)session.getAttribute("4")); list.add((String)session.getAttribute("5")); return list; } }

    • ベストアンサー
    • Java
  • Webアプリケーションの開発(Struts)をしています。

    Webアプリケーションの開発(Struts)をしています。 仮に、詳細画面 → 入力画面 → 確認画面という画面構成の場合に、 詳細画面の内容を入力画面に表示する際に、データの引継ぎをする場合は、セッションで持っていれば セッションで保持している値をそのまま次の画面の入力フォームに引き渡すことができます。 なので、入力フォームクラスのデータをセッションに保存して画面で持ちまわすのが普通だと思っていました。 ただ、ある現場ではセッションでのもち回しを禁止し、オブジェクトをファイルにして持ちまわしていました。 なんでもかんでも入れるのはともかく、上記のような画面構成の場合はセッションに入れる以外の方法が思いつきません。 (詳細画面 → 入力画面に遷移する際にDBを再読み込みするという方法もあるのでしょうが。。。) 経験が浅いので、一般的にはどれが正解なのかよく分かりません。 教えてください。

  • Webアプリ作成

    <html> <head> <meta http-eqiv="Content-Type" content="text/html; charset=EUC-JP"> <title>車名とグレード登録ページ</title> </head> <body> <h1>車名とグレード登録ページ</h1> <?php if (empty($_POST['carname']) || empty($_POST['gradecode'])) { print("不正なアクセスです"); die(); } $carname = $_POST['carname']; $gradecode = $_POST['gradecode']; $pg_cn = pg_connect("dbname=carinfor"); if (!$pg_cn) { die("データベースに接続できませんでした"); } エラー箇所→ $sql = "update carprice set carname='$carname' where gradecode='$gradecode'"; $rt = pg_query($pg_cn, $sql); if (!$rt) { echo("データベースに登録できませんでした<br/>"); echo("もう一度やりなおしてください<br/>"); echo("<a href=\"charge-input.php\">戻る (テキスト入力)</a><br/>"); echo("<a href=\"charge-select.php\">戻る (select)</a>"); die(); } else { echo("データベースに正常に登録されました<br/>"); echo("現在の情報を確認するには<a href=\"charge-list.php\">こちら</a>"); echo("を参照してください<br/>"); } pg_close($pg_cn); ?> </body> このページへ行くと Warning: pg_query() [function.pg-query]: Query failed: ERROR: duplicate key violates unique constraint "carprice_pkey" in ~/carinfor/charge-submit.php on line 21 とエラーがでます。 この解決方法が分かりません。解決方法を教えてください。 表carpriceで、carnameは主キーであり外部キー、gradecodeは主キーです。 主キーが二つあるのが問題かなと思うのですがどうなのでしょうか?

    • 締切済み
    • PHP
  • 問題の意味が分かりません

    javaの勉強をしているのですが問題の意味が分からないため 問題を解けません。 ”私の疑問点は「」を使って表していきます。” 問題文 メインメソッド (1) Lendmanagerクラスのインスタンスlendmanagerを作成する 以下endが入力されるまで(1)~(6)を繰り返す。(実行時は6冊分入力する) 「mainの処理が開始されるときに強制的に(最低でも)6冊分は入力すると言う意味でしょうか」 (2) キーボードから書名、作者名を入力 (3) Bookクラスのインスタンスbookを作成する (4) setTitle()メソッドでタイトルを設定する (5) setAuthor()メソッドで著者名を入力 (6) Lendmanagerクラスのaddメソッドでこの本を追加する(Lendmanagerに本を登録する) (7) 登録終了後Lendmanagerクラスのshow()メソッドで登録された本の書名、作者名を表示 ---------------------------------------------------------------- Lendmanagerクラスでは (1) コンストラクタでBook型の配列aBookを要素5で確保 (2)iLengthに初期値0を設定。(aBookの要素数) (3)add()メソッドでiLengthが5を超えていたら、これ以上追加できませんと言うメッセージを表示「mainメソッドで最初に6冊分入力しているのに要素数が足りなすぎます。main()メソッドのendが入力されるまでと言うのは何の意味があるのでしょう」 (4)iLengthが5を超えていなかったら配列aBookにBook型のオブジェクトbook を追加しiLengthに1を加える (5)show()メソッドではaBookの全ての要素について本の書名、作者名を表示 --------------------------------------------------------------- UML図 Book --------- -title:String -author:String ------------ +setTitle(title:string):void +setAuthor(author:string):void +show():void --------------- Lendmanager -------------- -aBook:Book[] -iLength:int -------------- +Lendmanager() +add(book:Book):void +show():void 以上ですよろしくお願いします。

    • ベストアンサー
    • Java
  • フォームの入力値のセッション破棄は?

    Aフォームがありまして、入力して確認ボタンを押し、セッションに入力値が格納されたけど、途中でBフォームへ行ってしまった、という場合、いつまでもAフォームの入力値をセッションに格納しておいても使わないですし、セッション変数名が競合して予期しない動作をしても困るので、他のページへ遷移した時点でAフォームの入力値セッションを削除するようにしたいのですが、実装方法としては、URLまたは絶対パスをセッションに入れといて、画面遷移するごとにそのセッションとURLまたは絶対パスを突き合わせ、一致しなければ削除、というやり方で問題ないでしょうか? ロードバランサ使ってても同一ページなら絶対パスは変わらないのでしょうか??詳しくないんですが…。 美しい実装方法をご教示ください…。

    • ベストアンサー
    • PHP

専門家に質問してみよう