よくPHPの値存在チェックで
lang
1if (isset($hoge['page']) && !empty($hoge['page'])) { 2 .... 3}
みたいな空チェックを見る気がしますが、いつも
lang
1if (!empty($hoge['page']) { 2 ... 3}
みたいに!empty()判定だけでいいのではと思ってしまいます。
!empty()単一だとどういうパターンで危険なのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
まとめると・・・恐らく下記のどちらかではないかと思います
- empty が notice を発生させないことを知らない人が誤って冗長に記述した
- もとは isset や empty の中に式が書かれていたが改修によってただの連想配列に置き換えられた
後者はちょっと考えにくいと思うので、前者の可能性が高いと思います。
また、
よくPHPの値存在チェックで ~~~ みたいな空チェックを見る気がします
とありますが、わたし自身はあまり見たことないです。
empty だけで十分ではないでしょうか?
投稿2015/07/08 01:54
総合スコア4514
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
総合スコア775
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/07 14:52
2015/07/07 15:04
2015/07/08 00:04 編集
2015/07/08 01:47 編集
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
総合スコア440
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/08 01:02
2015/07/08 02:34
0
if (!empty($hoge['page']) {
...
}
単一のパターンの場合、その連想配列名が存在しない時にNoticeが表示されたと思います。
それを回避すべく、連想配列の中に対象データの存在確認が必要になります。
エラーレベル等で、Noticeを表示しないような制御を行っている場合など特に気にする問題ではありませんが、厳密にエラーチェックを行おうとするのであれば、
if (isset($hoge['page']) && !empty($hoge['page'])) {
....
}
の方が良いかと思います。
投稿2015/07/07 13:16
総合スコア1158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/07 14:06 編集
2015/07/07 14:18
2015/07/07 14:56
0
値が何かによると思いますが、より厳密にチェックするためだと思います。
例えば次のコードを実行すると異なる結果が出る事が分かります。
lang
1$value = ""; 2 3var_dump( isset( $value ), !empty( $value ) );
PHPマニュアルにある型の比較表を見ると理解しやすいのではないでしょうか。
追記
この回答は正しくありません。
投稿2015/07/07 12:57
編集2015/07/07 14:01総合スコア617
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/08 05:07