アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いします。

PHPで変数が未定義であるというエラーが表示されてしまい困っています。
事前に $hensu = ""; と初期化できればいいのですが、そううまくもできない状況があります。

たとば、次のような場合です。

if (!$_GET['data']){ 処理

GETされているかどうかわからないけど、されていた場合の処理の分岐を記述したいので、事前に初期化できない状況です。

こうした場合、次のようにすることで未定義エラーは無視されるようです。

if (@!$_GET['tb']){

このアットマークによる回避方法でよいのでしょうか?ほかに方法があれば教えてください。エラーレポーティングのレベルを変えない方法でお願いします。

A 回答 (3件)

必要に応じてissetかemptyを使いましょう。


http://php.net/manual/ja/function.isset.php
http://php.net/manual/ja/function.empty.php

(1)
if ($_GET['data'])

if (!empty($_GET['data']))

(2)
if (!$_GET['data'])

if (empty($_GET['data']))

(3)
if ($_GET['data'] != '')

if (isset($_GET['data']) && $_GET['data'] != '')

(4)
if ($_GET['data'] == '')

if (!isset($_GET['data']) || $_GET['data'] == '')


POSTならまだしも、GETなら特に

~/test.php?data[hoge]=var

とかするだけで簡単に配列も渡せてしまうので、厳密に "文字列" かどうかチェックしたい場合は


(1)
if (!empty($_GET['data']) && is_string($data = $_GET['data']))

(2)
if (empty($_GET['data']) && is_string($data = $_GET['data']))

(3)
if (isset($_GET['data']) && is_string($data = $_GET['data']) && $data !== '')

(4)
if (!isset($_GET['data']) || !is_string($data = $_GET['data']) || $data === '')


(3)と(4)に関してはついでに途中で代入を同時に行って、$_GET['data']みたいな面倒な書き方しなくても、$dataだけで次から呼べるようにしてます。

こちらでは==演算子の代わりに===演算子を使ってます。
型が想定できていれば、可能な限りこちらを使うべきです。

==演算子に関連したPHPの気持ち悪い挙動について
http://bloggdgd.blog28.fc2.com/blog-entry-275.html

#これぐらいならブログURL貼ってもいいよね・・・(運営様に怒られても知らない
    • good
    • 0
この回答へのお礼

ありがとうございます。
とても丁寧な内容で参考になります。

命令が違う場合の書き換えがとくに参考になりました。

お礼日時:2013/06/18 23:20

@によるエラー制御は、基本的に使わない方がいいですね。



//-- ローカル変数に落としてから…
$data = (isset($_GET['data'])) ? $_GET['data'] : '';

//-- バリデーション
if ($data === '') {

}

のようにすると、全体の見通しが良くなると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうですよね、@はなんだか素人の自分でも禁じ手のような気がしますしプログラミングが上達しなそうです。
書き方のアドバイスについてもありがとうございます。

お礼日時:2013/06/07 10:48

普通はissetでチェックしますね



if(isset($_GET["data"])){}

ただ、dataが空だったらはじきたいとかなら中身のチェックは必要です

if(isset($_GET["data"]) and $_GET["data"]!=="" ){}
    • good
    • 0
この回答へのお礼

ありがとうございます!!!
なるほどissetなら通ります!

ありがとうございました。

お礼日時:2013/06/04 12:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!