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

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

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

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

Q&A

解決済

4回答

1863閲覧

複数の条件がtrueの場合に初めてMYSQLにinsert intoする一般的な方法

pegy

総合スコア243

PHP

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

0グッド

0クリップ

投稿2017/05/05 09:23

編集2017/05/05 09:24

phpで実務的な運用方法なのですが
例えば入力フォームで複数の要素のすべての条件をクリアしていれば初めて
mysqlに入力値をinsert intoするような一般的なケースがあると思います。

  1. もちろん下記のようにネストかする方法で最後の階層まで行って初めて処理を実行する方法はあると思います(条件式中で&&は 3個以上は使用できないと理解しております)

2)他に$foo/$hoge/$fugaを配列の要素としてin_arrayでfalseがあるかを検索する方法(ただこの方法を採るとどこに errorが生じているかわかりづらく、alert処理を分けるのに不便な気がしています)

これらぐらいしか思いつかないのですが、上記の目的を達成するために、一般実務的に実装される方法や可読性が良い方法等があればご教示願えますでしょうか。

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

PHP

1if($hoge) 2{ 3 if ($fuga) 4 { 5 if($foo){//inset intoの処理 }else{//falseのalertAを表示} 6 }else{//falseのalertBを表示} 7}else{//falseのalertCを表示} 8 9//$hoge=true; 10//$fuga=true; 11//$foo=false; 12//の場合alertCを表示 13//もちろん判定の要素は3つではなくかなりの数に及びます

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

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

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

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

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

guest

回答4

0

ベストアンサー

  1. $err_msgs = array(); みたいな、エラーメッセージを溜めておく配列を用意します。
  2. 一つ一つのフォーム要素のバリデーションの中で、検査に引っかかったら$err_msgsにエラー情報を加えます。
  3. 最後にcount($err_msgs)がゼロならエラーなし、ゼロより大きければエラーメッセージを表示して再入力を促す。

みたいなことはしてます。
一般的かどうかはわかりませんが。
これによって、ネストが深くならず可読性が上がります。

php

1$err_msgs = array(); 2if (array_key_exists('foo', $_POST)) { 3 if (isset($_POST['foo']) && is_numeric($_POST['foo'])) { 45 } 6 else { 7 $err_msgs[] = 'foo: 数字ではない.'; 8 } 9} 10else { 11 $err_msgs[] = 'foo: 入力されてない.'; 12} 13if (array_key_exists('bar', $_POST)) { 1415} 16if (array_key_exists('baz', $_POST)) { 1718} 19

ちなみに、fooとbarとbazが互いに依存せず独立して評価するべきものとして、
このようなコードを書きましたが、
依存関係があるなら当然if()ネストした中で相互に参照しつつ評価する必要があります。

投稿2017/05/05 09:35

編集2017/05/05 09:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pegy

2017/05/05 10:17

ご回答いただきありがとうございます、 なるほど、もっともシンプルながらとても実践的であると感じました。 早速、これをベースにすぐコードを書いてみます。大変、勉強になりました、改めて御礼を申し上げます。 よろしくお願い申し上げます。
guest

0

Exceptionを使うのがベストだと思います。

try catch throw Exception このあたりで検索をかけてみてください。きっと、質問者様が必要としている機能が、ほぼそのまま存在しているはずです。

投稿2017/05/05 10:19

GrayWingAliance

総合スコア218

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

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

pegy

2017/05/05 11:11

ご回答ありがとうございます。 早速調べさせていただきます!
guest

0

複数の if が何段もネストされて見づらいという問題でしょうか?

手法といえば、成功条件A AND 成功条件B AND 成功条件C・・・ は、 失敗条件A OR 失敗条件B OR 失敗条件C・・・ に書き換えられるので、こんなコードに書き換えられます。

php

1<?php 2 if (!$hoge) { 3 error_log('hoge ダメ'); 4 } elseif (!$fuga) { 5 error_log('fuga ダメ'); 6 } elseif (!$foo) { 7 error_log('foo ダメ'); 8 } else { 9 print("OK!!\n"); 10 }

ただ条件が複雑になり長くなると、この書き方も見づらくなってしまいます。そんなときは関数を使って、失敗したら早めに return させるという方法が考えられます。

php

1<?php 2 function check_value($x) { 3 $hoge = 'aaaaaaaaaaaaaa'; 4 if (!$hoge) { 5 error_log('hoge ダメ'); 6 return false; 7 } 8 9 $fuga = 'bbbbbbbbbbbbbbb'; 10 if (!$fuga) { 11 error_log('fuga ダメ'); 12 return false; 13 } 14 15 $foo = 1 + 2 + 3 + 4 + 5; 16 if ($foo > 10) { 17 error_log('foo ダメ'); 18 return false; 19 } 20 21 return true; // チェックNGが一度も起きなければ成功 22 }

戻り値+error_log の替わりに例外を使うとさらに堅牢なコードを書くことが出来ます。

php

1<?php 2 function check_value($x) { 3 $hoge = 'aaaaaaaaaaaaaa'; 4 if (!$hoge) { 5 throw new UnexpectedValueException('hoge ダメ'); 6 } 7 8 $fuga = 'bbbbbbbbbbbbbbb'; 9 if (!$fuga) { 10 throw new UnexpectedValueException('fuga ダメ'); 11 } 12 13 $foo = 1 + 2 + 3 + 4 + 5 + $x; 14 if ($foo > 10) { 15 throw new UnexpectedValueException('foo ダメ'); 16 } 17 } 18 19 try { 20 check_value(10); 21 } catch (UnexpectedValueException $e) { 22 print('チェックエラーです: '.$e->getMessage()."\n"); 23 }

用途に合わせて検討してみてください。

投稿2017/05/05 09:44

miyahan

総合スコア3095

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

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

pegy

2017/05/05 10:14

ご回答ありがとうございます、このようなケースで自己定義関数を使用する発想がお恥ずかしながらなかったです、、falseのケースによってfalse側の処理を分ける場合にはreturn falseを使用することができませんが、一個でもエラーがあれば速やかに弾きたい場合には素晴らしい方法だと感じました。また、入門の時に学んだthrow-catchを思い出しました!やはり自分はまだまだ実践に慣れてませんね、、すぐに引き出しが出てこない、、、とても助かりました、改めましてありがとうございます!
guest

0

phpの場合、trueかfalseを判定する場合の条件式は$hoge===falseを使うべきだと思います。
というのも、たとえばfalseではなく0やnullが入っている場合もif文で判定されてしまうからです。

また、&&はいくつでも連結させることができます。その場合左側から評価されます。

と、書いている途中で別の方が素晴らしい回答をされてたので私はここらへんで…。

投稿2017/05/05 09:36

編集2017/05/05 09:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pegy

2017/05/05 10:08

ご回答ありがとうございます、&&が3個以上連結できることは誤認しておりました。 また真偽判定の方法についてもアドバイスいただき、ありがとうございます。ぜひ今後に活かしていければと思います! よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問