質問: phpで実務的な運用方法なのですが 例えば入力フォームで複数の要素のすべての条件をクリアしていれば初めて mysqlに入力値をinsert intoするような一般的なケースがあると思います。 1) もちろん下記のようにネストかする方法で最後の階層まで行って初めて処理を実行する方法はあると思います(条件式中で&&は 3個以上は使用できないと理解しております) 2)他に$foo/$hoge/$fugaを配列の要素としてin_arrayでfalseがあるかを検索する方法(ただこの方法を採るとどこに errorが生じているかわかりづらく、alert処理を分けるのに不便な気がしています) これらぐらいしか思いつかないのですが、上記の目的を達成するために、一般実務的に実装される方法や可読性が良い方法等があればご教示願えますでしょうか。 よろしくお願い申し上げます。 ``` if($hoge) { if ($fuga) { if($foo){//inset intoの処理 }else{//falseのalertAを表示} }else{//falseのalertBを表示} }else{//falseのalertCを表示} //$hoge=true; //$fuga=true; //$foo=false; //の場合alertCを表示 //もちろん判定の要素は3つではなくかなりの数に及びます ```
回答: 1. $err_msgs = array(); みたいな、エラーメッセージを溜めておく配列を用意します。 2. 一つ一つのフォーム要素のバリデーションの中で、検査に引っかかったら$err_msgsにエラー情報を加えます。 3. 最後にcount($err_msgs)がゼロならエラーなし、ゼロより大きければエラーメッセージを表示して再入力を促す。 みたいなことはしてます。 一般的かどうかはわかりませんが。 これによって、ネストが深くならず可読性が上がります。 ``` $err_msgs = array(); if (array_key_exists('foo', $_POST)) { if (isset($_POST['foo']) && is_numeric($_POST['foo'])) { ~ } else { $err_msgs[] = 'foo: 数字ではない.'; } } else { $err_msgs[] = 'foo: 入力されてない.'; } if (array_key_exists('bar', $_POST)) { ~ } if (array_key_exists('baz', $_POST)) { ~ } ``` ちなみに、fooとbarとbazが互いに依存せず独立して評価するべきものとして、 このようなコードを書きましたが、 依存関係があるなら当然if()ネストした中で相互に参照しつつ評価する必要があります。