AS-B
@AS-B

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

phpの条件分岐について

Q&A

Closed

解決したいこと

phpでデータベースからデータを参照する際に、IDを入力してsubmitすると参照できるというコードを書きました。
IDが空欄や、登録されていないIDの時にechoでその旨を伝えたいのですが、登録されていないIDの時にWarning: Undefined array keyが出てしまい、意図通りに動かせておりません。

該当するソースコード

if(isset($_POST["submit"])) {
  if ($_POST["id"] === ""){ //空欄のとき
    echo "ERROE:IDが入力されていません。IDを入力してください。";

} elseif ($_POST["id"] === "1"||"2"||"3"){ //登録されているID1,2,3のとき
    //データベースを読み込む処理
    echo "ID「".$id."」のデータを読み込みました。";

} else { //それ以外(登録されていないID)
  echo "ERROE:ID「".$id."」は存在しません。IDを確認してください。";
}
}

自分で試したこと

elseif (!($_POST["id"] === "1"||"2"||"3")){
にしてみたりもしましたが、Warning: Undefined array keyが出ます。
そもそもですが、「"1"||"2"||"3"」の書き方が合っているのかも把握できておりません・・・
(「"1"||"2"||"3"」はテスト中の仮で、後々登録してあるIDを読み込んだ変数にする予定です。)

簡素な説明で申し訳ありませんが、ご教授のほどよろしくお願い申し上げます。

0

4Answer

とりあえず

if ($_POST["id"] === "1"||"2"||"3")

この条件式は"2"が評価されて常にtrueになります.
複数の文字列に一致させたいならswitchが楽だと思います.

if (isset($_POST["id"])) {
  switch ($_POST["id"]) {
    case "":
      echo "ERROE:IDが入力されていません。IDを入力してください。";
      break;
    case "1":
    case "2":
    case "3":
      echo "ID「" . $_POST["id"] . "」のデータを読み込みました。";
      break;
    default:
      echo "ERROE:ID「" . $_POST["id"] . "」は存在しません。IDを確認してください。";
      break;
  }
}
1Like

Comments

  1. @AS-B

    Questioner

    ご教授いただきありがとうございました。
    switchという物を知りませんでしたので、とても良い勉強になりました。
    IDが増えていくので、都度case "4":case "5":と増やしていくわけにもいかず、
    case $id:(中身が1,2,3,4,5)のようにしても動かずでハマっておりますが、
    なんとか形にできればと思っております。
  2. case文には式を書けますが,おそらく$idは数値でしょうからそのまま比較することはできないでしょう.
    https://webukatu.com/wordpress/blog/32160/#i-2

    idの値に前加工が必要ないのであれば,クエリにして投げればよいですが,
    どのような場合でもSQLインジェクションのような攻撃には対策する必要が出てきますので念のため.
  3. @AS-B

    Questioner

    追加の情報いただきありがとうございます。
    現状ですが、

    if (isset($_POST["id"])) {
    foreach ($list as $row) { //$listはデータベース登録済のIDを取得しています。
    switch ($_POST["id"]) {
    case "":
    echo "ERROE:IDが入力されていません。IDを入力してください。";
    break;

    case $row:
    //データベース読み込み
    echo "ID「" . $_POST["id"] . "」のデータを読み込みました。";
    break;

    default:
    echo "ERROE:ID「" . $_POST["id"] . "」は存在しません。IDを確認してください。";
    break;
    }
    }
    }

    とする事で、とりあえずエラーはなくなりました。
    ただし、データベースに登録が5件あるので、
    「ERROE:ID「1」は存在しません。IDを確認してください。ERROE:ID「1」は存在しません。IDを確認してください。ERROE:ID「1」は存在しません。IDを確認してください。ERROE:ID「1」は存在しません。IDを確認してください。ERROE:ID「1」は存在しません。IDを確認してください。」
    のように5回処理されてしまうという状況です。
    echoをなくせば一応達成なのですが・・・
    いろいろご教授いただき大変助かりました。
    ありがとうございます。

  4. 助言の出し方が不適切でした,申し訳ありません.

    そもそもswitch文は定数以外との比較に向いていません.
    リストをイテレートする前提であれば無理してswitchを使う必要は無いですね.

    チャート的には空値チェック→リストループ→見つかれば表示/なければエラー,という流れになると思いますので,フローを書き直してみてください.
  5. @AS-B

    Questioner

    とんでもないです。
    新しい経験を積ませていただき大変感謝しております。
    お教えいただいたswitch文を使いたかったので、回りくどかったり邪道な書き方なのかもしれませんが、以下のようにしてみたら目的を達成しているような動きをしています。


    $message = "";

    if (isset($_POST["id"])) {
    foreach ($list as $row) {
    switch ($_POST["id"]) {
    case "":
    $message = "ERROE:IDが入力されていません。IDを入力してください。";
    break;

    case $row:
    //データベース読み込み
    break;

    default:
    $message = "ERROE:ID「" . $_POST["id"] . "」は存在しません。IDを確認してください。";
    break;
    }
    }

    if (in_array($_POST["id"],$list)){
    $message = "ID「" . $_POST["id"] . "」のデータを読み込みました。";
    }
    }

    echo $message;

    度々コメントくださり誠にありがとうございました。

条件式について補足すると、()でくくるとこのようなイメージで判定されます。

if (
    ($_POST["id"] === "1")
    || ("2")
    || ("3")
) {
}

なので最初の条件$_POST["id"] === "1"に関係なくtrueになります。
なぜ"2"trueなのかというと、文字列に関しては"0"以外はtrueと判定されるからです。

if ("2") {
    echo "string 2 is true\n";
} else {
    echo "string 2 is false\n";
}

if ("0") {
    echo "string 0 is true\n";
} else {
    echo "string 0 is false\n";
}

// string 2 is true
// string 0 is false

どのように判定されるかはこちらに記載されています。
今回の件はif($x)の欄です。

1Like

Comments

  1. @AS-B

    Questioner

    コメントありがとうございます。
    まさに何故そうなるか悩んでいた部分でした。
    「文字列に関しては"0"以外はtrue」という事でやっと理解ができ感謝致します。
    返り値?などまだまだ理解も意識もできておりませんので、その辺りも勉強したいと思います。

そもそも1行目の判定はisset($_POST["id"])ではないです?
わざわざsubmitという名前のフィールドをセットする必要は通常ないと思います(submitボタンを勘違い?).

0Like

Comments

  1. @AS-B

    Questioner

    コメントありがとうございます。
    言われてみれば確かにそうですね。
    勘違いというか何も考えていなかったというか、そんな状況でした。
    恐れ入りますが主題に関してもお教えいただけますと幸いです。

・こんな感じはどうでしょうか。「(ID1,2,3)の処理を飛ばしてしまいましたが:runner:
ID 1,2,3 での分岐になにか意味があるのでしたら動きは変わりますが、無ければ、DBを読むか、それ以外の処理で動きは同じになると思いますよ。


if (isset($_POST['id'])) {

    if (!empty($_POST['id'])) {
        //=== 登録されているID

        //データベースを読み込む処理
        echo "ID「".$id."」のデータを読み込みました。";	
    } else {
      //それ以外(登録されていないID)
      echo "ERROE:ID「".$id."」は存在しません。IDを確認してください。";
    }

} else {
  //空欄のとき
  echo "ERROE:IDが入力されていません。IDを入力してください。";
}

0Like

Comments

  1. @AS-B

    Questioner

    コメントありがとうございます。
    試してみたところ、登録されていないIDの時だけWarning: Undefined array keyが出てしまいました。
    !emptyは初めてでしたので勉強になりました。
  2. Warning: Undefined array key 出ていますか😢解決に至らず申し訳ないです。基本的にみなさんが投稿されている is_set で解決できる認識でいましたので、もしかしたら、POSTされた後の処理(SQL => テーブルから値を取ってきての引数が空の時の処理や、SQLを受け取った配列が空の時の処理、例外処理 try catch )なども、見直してみるといいかもしれませんね。

    お力になれず申し訳ないです!!!
  3. @AS-B

    Questioner

    とんでもないです。
    初学者ですので、今回でしたら例外処理についても学ぶ機会をいただき大変有難いです。
    1人ですとなかなか知識の幅が広がりませんので。
    ご助力いただきありがとうございます。

Your answer might help someone💌