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

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

ただいまの
回答率

90.37%

  • PHP

    25075questions

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

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

解決済

回答 4

投稿 編集

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

pegy

score 79

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つではなくかなりの数に及びます
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+4

  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()ネストした中で相互に参照しつつ評価する必要があります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/05 19:17

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

    キャンセル

0

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/05 19:08

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

    キャンセル

0

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

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

<?php
    if (!$hoge) {
        error_log('hoge ダメ');
    } elseif (!$fuga) {
        error_log('fuga ダメ');
    } elseif (!$foo) {
        error_log('foo ダメ');
    } else {
        print("OK!!\n");
    }

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

<?php
    function check_value($x) {
        $hoge = 'aaaaaaaaaaaaaa';
        if (!$hoge) {
            error_log('hoge ダメ');
            return false;
        }

        $fuga = 'bbbbbbbbbbbbbbb';
        if (!$fuga) {
            error_log('fuga ダメ');
            return false;
        }

        $foo = 1 + 2 + 3 + 4 + 5;
        if ($foo > 10) {
            error_log('foo ダメ');
            return false;
        }

        return true; // チェックNGが一度も起きなければ成功
    }

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

<?php
    function check_value($x) {
        $hoge = 'aaaaaaaaaaaaaa';
        if (!$hoge) {
            throw new UnexpectedValueException('hoge ダメ');
        }

        $fuga = 'bbbbbbbbbbbbbbb';
        if (!$fuga) {
            throw new UnexpectedValueException('fuga ダメ');
        }

        $foo = 1 + 2 + 3 + 4 + 5 + $x;
        if ($foo > 10) {
            throw new UnexpectedValueException('foo ダメ');
        }
    }

    try {
        check_value(10);
    } catch (UnexpectedValueException $e) {
        print('チェックエラーです: '.$e->getMessage()."\n");
    }

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/05 19:14

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/05 20:11

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

    キャンセル

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

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

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

  • PHP

    25075questions

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