• ベストアンサー

switchでの条件分岐の書き方を教えて下さい。

こんにちは。 いつもお世話になっております。 またわからない事が出てきてしまったので、どうか ご指導よろしくお願いいたします。 簡単な検索機能をつくりたくて、思考錯誤 しております。 フォームからPOSTで受け取る変数の数は 10個あります。 それぞれの変数が ””でなければ、受け取った 変数を元に、SQL文がかわってゆく。 という事がしたいのです。 10個もあるので、たとえば 変数が$_POST["a"]から$_POST["j"]まであった時に if文を使うとすると if($_POST["a"] != "" && $_POST["b"] == "" && $_POST["c"] != "" (略)){ $stt = "検索したい予定のSQL文1"; }elseif($_POST["a"] == "" && $_POST["b"] != "" && $_POST["c"] != "" (略)){ $stt = "SQL文2"; ・ ・ ・ と言う風に、ものすごいにはなると思うのですがifを つなげていけば良いのかな、と思うのです。 PHPの基礎HPなどを検索してみると、SWITCHを 使えば、多岐に分岐するIF文を、見やすくできる、 と書いてあったので、使ってみたいのですが、書き方の 説明によると switch(変数){ case 値1:  条件を満たす時の処理1 break; case 値2:  条件を満たす時の処理2 default: } と紹介してあったのですが、今回わたしがしたい場合の 条件分岐だと、変数は一つではなく、ある変数は空でこの変数は値が何か入っていて、またもう一つの変数は 空で・・・の時は、このSQL文、というように させたい場合には、switchでどうかけばよいのか わからないのです。 それとも、こういう条件分岐の場合は、switchを 使うべきではないのでしょうか・・・? どうかご指導よろしくお願いいたします。  

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

  • ベストアンサー
回答No.2

こんにちは。 プログラムの世界には「美しい書き方」という言葉が時々使われます。 色々な意味を持っていますが、質問に書かれたやり方は「美しくない」に当てはまると思います。 ただ、美しい=良い、汚い=ダメ、とも言えませんが。 慣れてくれば自ずと出来るようになりますが、考え方を変えて、より楽が出来るように考えてはどうですか。 たとえば、今回のようなプログラムを私が書くとしたら、HTMLのフォームでは以下のように記述します。 <BODY> <form method="POST" action="./enc2.php"> a:<input type="text" name="val[]"><BR> b:<input type="text" name="val[]"><BR> c:<input type="text" name="val[]"><BR> d:<input type="text" name="val[]"><BR> e:<input type="text" name="val[]"><BR> f:<input type="submit" value="send"> </form> </BODY> で、どこに値が入っているかは、 $item = array("a" , "b" , "c" , "e" , "f"); $matchKey = array( ); $matchVal = array( ); for($i = 0;i < count($_POST[val]);i++){ if ($_POST["val"][$i] != "") $matchKey[] = $i; $matchVal[] = $_POST["val"][$i]; } for($j = 0; isset($matchKey[$j]); $j++){ print $matchKey[$j] . "の項目が記入されています"; print "値は、" . $matchVal[$j]; print "です"; } これを参考にしてみてください。 この方法の方が修正が楽でしょうし、間違いも少なくなるでしょう。 私は switch は、あまり使いません。理由は単にifの方が個人的に見やすいから。というだけです。 switchの方が見やすいというのであれば、switchを使えばいいでしょうし、その程度の理由です。 それと、if の条件式でやるか別の if でやるかも個人差が出てくるでしょう。たとえば、以下のようにやる人もいるかもしれません。 if ($_POST["a"] != ""){ if ($_POST["b"] == ""){ if ($_POST["c"] == ""){ ・・・・・・ 慣れてくるに従って上手に処理できるようになりますよ。

sibazuke
質問者

お礼

campanella_77様こんばんは。 ご指導ありがとうございます。 教えて頂いた方法を参考にして、頑張ってみます。 ・・・とっても見やすいですよね。 すごいです。 ご指導ありがとうございました。

その他の回答 (1)

  • sisya
  • ベストアンサー率39% (97/244)
回答No.1

switch文の書き方~とありますが、 今回のような問題にswitch文は向かないと思います。 どのようなSQL文をご希望なのかが判らないので 詳しくは回答できませんが、 以下のように宣言されている要素によって SQL文を動的に組み立てると良いと思います。 $Query = "select * from testtable whele"; # aの値が存在する時 if(isset($_POST["a"]) and !empty($_POST["a"]){ $Query .= " A = $_POST[a]"; } # bの値が存在する時 if(isset($_POST["a"]) and !empty($_POST["a"]){ $Query .= " B = $_POST[b]"; }   :   :

sibazuke
質問者

お礼

sisya様こんにちは。 ご指導ありがとうございます。 今回作りたいのは、検索画面で、 $a から$j までの10個の項目が対象なのです。 検索項目としては、 おそらく10×10-10の、90項目 になるのかしらと、あまりの多さにドキドキしています。 SQLテーブルの構造は、 メイン画面(ここに全部の項目の主キーと繋がる 数字が入っています)※これが10項目です。 売り上げテーブル(年度ごとの月別集計) 商品テーブル 仕入れ先 (略) という形になっております。 何が検索したいのか、といいますと、たとえば ○年度の仕入先別の売り上げ高 とか ○年度から○年度までの○仕入先の、商品ごとの売り上げ高 などという形のものです。 ですので、検索対象のSQL文は、毎回何を selectして、whereしてgroup byするかが微妙に代わってくるのです。 (SUMに入れる項目は毎回同じです。) (・・うわ、なんだか怪しい外人さんみたいな文章に なってしまいました。 すみません。) やっぱり、毎回IF()の中に、10個の変数が 有るか無いか記述してやるしか方法は無いのでしょうか・・? 追伸 ええと、初心者なもので、頓珍漢なことをお聞きしていたら すみません。 上記で教えて頂いた方法のコードなのですが、閉じ括弧) が足りなくは無いでしょうか・・・?

関連するQ&A