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

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

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

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

Q&A

解決済

5回答

10567閲覧

PHPでif (isset($hoge) && !empty($hoge)) しないといけないパターンとは?

m_kuwako

総合スコア136

PHP

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

0グッド

1クリップ

投稿2015/07/07 12:33

よくPHPの値存在チェックで

lang

1if (isset($hoge['page']) && !empty($hoge['page'])) { 2 .... 3}

みたいな空チェックを見る気がしますが、いつも

lang

1if (!empty($hoge['page']) { 2 ... 3}

みたいに!empty()判定だけでいいのではと思ってしまいます。

!empty()単一だとどういうパターンで危険なのでしょうか。

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

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

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

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

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

guest

回答5

0

ベストアンサー

まとめると・・・恐らく下記のどちらかではないかと思います

  • empty が notice を発生させないことを知らない人が誤って冗長に記述した
  • もとは isset や empty の中に式が書かれていたが改修によってただの連想配列に置き換えられた

後者はちょっと考えにくいと思うので、前者の可能性が高いと思います。

また、

よくPHPの値存在チェックで ~~~ みたいな空チェックを見る気がします

とありますが、わたし自身はあまり見たことないです。
empty だけで十分ではないでしょうか?

投稿2015/07/08 01:54

ngyuki

総合スコア4514

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

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

m_kuwako

2015/07/08 05:07

なるほど、やはりあまり意味はなかったのですね。ご回答ありがとうございました!
guest

0

「変数が存在しなくても警告は発生しません。 つまり、empty() は本質的に !isset($var) || $var == false と同じことを簡潔に記述しているだけです。」
引用:http://php.net/manual/ja/function.empty.php

別に「!empty()」このコードでも問題無いと思います。
ただ、PHP5.5以前では式に対応していなかったので未だにちょっとemptyは嫌厭してしまいます。

「!」だけですと「ん?」となってしまう人もいると思いますので個人的に書くとしたら

lang

1if ( empty($hoge['page']) === FALSE ) 2{ 3 4}

みたいに書きます。

投稿2015/07/07 13:53

nanndemoiikara

総合スコア775

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

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

flat

2015/07/07 14:27

emptyを使用せずにそのまま if ( $hoge['page'] ) {} とするのは問題がありますか?
ngyuki

2015/07/07 14:52

> emptyを使用せずにそのまま if ( $hoge['page'] ) {} とするのは問題がありますか? $hoge が未定義だったり $hoge に 'page' が無いときに notice が出てしまいます。
flat

2015/07/07 15:04

自分の環境(PHP5.4.42とPHP5.3.2)ではNULLが返ってくるのみでNoticeが出ないのですが、Noticeが出るのはどの様な環境なのでしょうか…?
nanndemoiikara

2015/07/08 00:04 編集

Noticeが出ます。 出ないとしたらerror_reportingやdisplay_errorsの設定を見直しましょう。
flat

2015/07/08 01:47 編集

まず、質問者の方を差し置いたコメントをしてしまった事をお詫び申し上げます。 nanndemoiikaraさん、回答して下さりありがとうございました。
guest

0

$_POST、$_REQUEST 等のパラメータチェックの際に役立ちます。

例えばチェックボックスは、PHPで受け取れるようにするには、ご存知かとは存じますが以下のように項目名に"[]"を付ける必要があります。

lang

1<input type="checkbox" name="para[]" value="パラメータA"> 2<input type="checkbox" name="para[]" value="パラメータB"> 3<input type="checkbox" name="para[]" value="パラメータC"> 4

このパラメータをPHP 側で受け取るには、以下のように記載します。

lang

1//チェックボックスのパラメータを取得する 2$chkbox_para = $_REQUEST["para"]; 3 4// 使用例 5echo $chkbox_para[0]; 6echo $chkbox_para[1]; 7

しかし、ここで問題なのがチェックボックスを全部選択せずに送信すると、$_REQUEST["para"]自体がフォームから送信されないため、

lang

1 2$chkbox_para = $_REQUEST["para"]; 3foreach($chkbox_para as $key => $value) 4{ 5 echo $value; 6}

というような処理をすると、実行エラーとなります。
これを回避するには、

lang

1if (isset($_REQUEST["para"] == true) 2{ 3 $chkbox_para = $_REQUEST["para"]; 4 foreach($chkbox_para as $key => $value) 5 { 6 echo $value; 7 } 8}

と記述します。

また他の例としては、以下のようなデータベースの内容を確認の際にも重宝します。

lang

1■table1 2key・・・主キー 3name・・・名前 4flg・・・識別フラグ (default null / 1 or 2 or 3) 5

select文で
select name from table1;
と記述し、flgを読まなくても良い出力パターンの時に、以下のような記述に役立ちます。

lang

1 2// データを読む 3$read_buff = db_read_sample(); 4 5//flg あり、なし共通出力 6 7while(データの読める間) 8{ 9 $name = $read_buff["name"]; 10 $out_flg = null; 11 12 if (isset($read_buff["flg"]) == true) 13 { 14 switch($read_buff["flg"]) 15 { 16 case 1 : 17 $out_flg = "条件Aを選択"; 18 break; 19 20 case 2 : 21 $out_flg = "条件Bを選択"; 22 break; 23 24 case 3 : 25 $out_flg = "条件Cを選択"; 26 break; 27 28 default : 29 $out_flg = "条件が選択されていません"; 30 break; 31 } 32 33 //結果を出力 34 if ($out_flg != null) 35 { 36 echo "名前:${name} 条件: ${out_flg}"; 37 } 38 else 39 { 40 echo "名前:${name}"; 41 } 42} 43

このように、
①パラメータ自体が存在していなければ何もしない
②パラメータがNULLならばエラー処理をする

を区別するような場合に重宝します。

投稿2015/07/08 00:30

KenjiObata

総合スコア440

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

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

nanndemoiikara

2015/07/08 01:02

KenjiObata様の主張には全て同意致します。 ただ if (isset($hoge['page']) && !empty($hoge['page'])) を if (!empty($hoge['page']) この様に書いてはダメなの? という質問に対してのissetの説明の回答は適切ではないのでは? と思ってしまいます。
KenjiObata

2015/07/08 02:34

回答ありがとうございます。 主旨がずれているようでしたらご容赦ください。 ご質問内容が、 !empty()判定だけでよいのではないか? isset()は不要でないのか? という意味にとらえてしまったため、isset()の必要例を記載しておりました。 大変失礼いたしました。
guest

0

if (!empty($hoge['page']) {
...
}

単一のパターンの場合、その連想配列名が存在しない時にNoticeが表示されたと思います。
それを回避すべく、連想配列の中に対象データの存在確認が必要になります。
エラーレベル等で、Noticeを表示しないような制御を行っている場合など特に気にする問題ではありませんが、厳密にエラーチェックを行おうとするのであれば、

if (isset($hoge['page']) && !empty($hoge['page'])) {
....
}

の方が良いかと思います。

投稿2015/07/07 13:16

takayukiinaba

総合スコア1158

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

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

nanndemoiikara

2015/07/07 14:06 編集

> 単一のパターンの場合、その連想配列名が存在しない時にNoticeが表示されたと思います。 Notice発生しませんよ > エラーレベル等で、Noticeを表示しないような制御を行っている場合など特に気にする問題ではありませんが、厳密にエラーチェックを行おうとするのであれば、 emptyはerror_reportingでE_ALLを指定してもNoticeは発生しませんよ。 http://php.net/manual/ja/function.empty.php
takayukiinaba

2015/07/07 14:18

PHP5.4以降の環境では発生しないみたいですね。 私の場合、PHP4系統からシステムの開発を行っているので、上記の記述の用に対応する癖がついていたためつい・・・。 運用するサーバの環境依存で、記述内容が変わると思います。 PHPのバージョンが必ずしも最新とも限りませんので、おまじない的に覚えておくと良いかもですね。
ngyuki

2015/07/07 14:56

> PHP5.4以降の環境では発生しないみたいですね。 少なくとも PHP 4.3.0 の時点で発生しないようです。 http://3v4l.org/moQpk
guest

0

値が何かによると思いますが、より厳密にチェックするためだと思います。
例えば次のコードを実行すると異なる結果が出る事が分かります。

lang

1$value = ""; 2 3var_dump( isset( $value ), !empty( $value ) );

PHPマニュアルにある型の比較表を見ると理解しやすいのではないでしょうか。

追記
この回答は正しくありません。

投稿2015/07/07 12:57

編集2015/07/07 14:01
flat

総合スコア617

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

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

ngyuki

2015/07/07 13:03

質問に記載の内容なら、比較すべきは <?php $value = ""; var_dump( isset($value) && !empty($value), !empty($value) ); ではないでしょうか?
flat

2015/07/07 13:28

確かにその通りですね。 また、私の回答だと連想配列ではないので、その点でも正確な回答ではありませんでした。 コメントを頂いたことで私の理解も進みそうです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問