PHPの未定義エラーを回避する方法

このQ&Aのポイント
  • PHPで変数が未定義エラーが表示される場合、@マークを使用して回避することができます。
  • 例えば、if文でGETされているかどうかを判定する場合、@マークを使用することでエラーが無視されます。
  • ただし、エラーレポーティングのレベルを変えない場合に限り、@マークを使用することをおすすめします。
回答を見る
  • ベストアンサー

PHP: 未定義エラーの回避方法を教えてください」

よろしくお願いします。 PHPで変数が未定義であるというエラーが表示されてしまい困っています。 事前に $hensu = ""; と初期化できればいいのですが、そううまくもできない状況があります。 たとば、次のような場合です。 if (!$_GET['data']){ 処理 GETされているかどうかわからないけど、されていた場合の処理の分岐を記述したいので、事前に初期化できない状況です。 こうした場合、次のようにすることで未定義エラーは無視されるようです。 if (@!$_GET['tb']){ このアットマークによる回避方法でよいのでしょうか?ほかに方法があれば教えてください。エラーレポーティングのレベルを変えない方法でお願いします。

  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.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貼ってもいいよね・・・(運営様に怒られても知らない

tuktukrace
質問者

お礼

ありがとうございます。 とても丁寧な内容で参考になります。 命令が違う場合の書き換えがとくに参考になりました。

その他の回答 (2)

  • cheese014
  • ベストアンサー率85% (12/14)
回答No.2

@によるエラー制御は、基本的に使わない方がいいですね。 //-- ローカル変数に落としてから… $data = (isset($_GET['data'])) ? $_GET['data'] : ''; //-- バリデーション if ($data === '') { } のようにすると、全体の見通しが良くなると思います。

tuktukrace
質問者

お礼

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

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

普通はissetでチェックしますね if(isset($_GET["data"])){} ただ、dataが空だったらはじきたいとかなら中身のチェックは必要です if(isset($_GET["data"]) and $_GET["data"]!=="" ){}

tuktukrace
質問者

お礼

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

関連するQ&A

  • PHP 設定ファイルとユーザ定義関数

    ある機能を満たすためのライブラリ(lib.php)を作成しました。 このlib.phpはユーザ定義関数の寄せ集めです。 それぞれのユーザ定義関数では、設定ファイル(config.php)に記述されている共通変数を利用します。 このconfig.phpなのですが、ユーザ定義関数ごとにincludeする以外の方法はあるでしょうか? lib.php function one() { $hensu1... $hensu2... ...処理; } function two() { $hensu1... ...処理; } .... config.php $hensu1 = 1; $hensu2 = 2; ... という構成です。 function one,function twoでconfig.phpの変数を利用したいのですが、lib.phpの先頭でinclude "config.php"をしてもfunctionの中では変数のスコープが有効にはならず、 lib.php function one() { include "config.php"; ...処理; } function two() { include "config.php"; ...処理; } としています。 PHP5を使用しています。 function one() { global $hensu1... } としたらよいのでしょうか? どなたかアドバイスいただけますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • [PHP]Warning: getimagesize(): Read error! in....を表示させない方法

    PHPでWarning: getimagesize(): Read error! in....を表示させない方法って、 getimagesize()の前に@をつけることや、error_reporting(0) 以外に簡単で良い方法ってありますか? 方法はあると思うのですが、わかりません。 どなたかご教授いただければ非常に幸いです。 宜しくお願いします。

    • 締切済み
    • PHP
  • phpの書き方

    php初心者です 長いコードを書く場合、getで送られてくる情報を元に2つのページを表示する場合(例えばHTMLは同じだけど表示内容が違う場合など) 1つのphpでif文で分岐させる方法と 2つのphpファイルを作って処理させる方法どちらがいいですか? 負荷とか、転送量、メリット、デメリットを教えてください 他に優れた方法はありますか? よろしくお願いします

    • ベストアンサー
    • PHP
  • PHPで変数のデータ受け渡しについて

    HTMLで下記のようにして入力された データを次ページに受け渡し、 issetで変数に値が代入されていれば ifで分岐処理させたいのですが、 elseの処理しかできません。    <FORM action="次ページ.php" method="GET">    キーワード<BR>    <INPUT type="text" name="keyword">    <INPUT type="submit" value="ボタン"> ボタンをクリックしたら次ページで    if (isset($keyword)) {     分岐処理1;     }    else{     分岐処理2;     } と行いたいのですが、$keywordに値が 代入されているにも関わらず elseの処理がされてしまいます。 どこか構文が間違っているのでしょうか。 どうか教えてください。

    • ベストアンサー
    • PHP
  • エラーが出ない

    レンタルサーバで実行すればWarningがブラウザに出ますが 自サバで実行すると何のエラーも出ずに次の行の処理がされます。 error_reporting = E_ALL です。 特に設定を変更したりはしていません。 エラーを表示する方法を教えてください。

    • ベストアンサー
    • PHP
  • PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?

    PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか? for文やwhile文ではbreakやcontinueなどが使えるようですが、if文にはないのでしょうか? 条件分岐がいくつかあって、その一つを途中で抜けて次の条件分岐へと移行したいのですが、 exitを使ってしまうと、次へ行かずに処理が中止されてしまいますし、 どのようにすればよいのか分からず困っています。何かよい方法はないでしょうか?

    • ベストアンサー
    • PHP
  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 未定義の変数に対して条件分岐する際の対処法

    PHP 5.3 で次のような関数があったとして、配列$optionの内容によって条件を分岐するとします。 $optionに渡される値は不定で、空の場合もあれば$option['param3']などが渡されることもあります。 function sample($option=array()){ if($option['param1'] == 'test'){ echo "A"; } elseif($option['param2'] == 'test'){ echo "B"; } } もし引数に「$option['param3']='test'」だけが渡されたら、条件分岐の際に未定義の「param1」と「param2」はNoticeエラーを返すことになります。 「@」でとりあえず抑制したり、予想される全てのキーに対して初期化するなどがあると思いますが、 エラー表示レベルを変えずにこのエラーを消すにはどうするのが一般的ですか?

    • ベストアンサー
    • PHP
  • 処理をデータとして定義する方法

    文章ではうまく説明できないのですが、例えばJavaScriptで以下のような感じの処理をPHPでやるにはどうしたらいいかということです。 var algos = {   md5 : function(input) {…},   base64enc : function(input) {…},   originalHashA : function(input) {…},   originalHashB : function(input) {…} }; var v = document.getElementById("selectAlgos"); var input = document.getElementById("input"); var result = algos[v](input); 画面で選択されたアルゴリズムで処理をするという感じです。例としてHash系を上げましたが、それに限るわけではありません。今の私のPHP力で実装しようとすると、if文が羅列する処理になってしまいます…。 これだとアルゴリズムが追加されるたびにif文を追加するなど処理を修正しなければなりません。しかしそうではなく、あくまでもデータの追加のみで済ませたいと思っています。宗教的な思想の違いに過ぎないかもしれませんが、algos内の処理を追加・編集するのは問題ないということです。別の見方をすると、「if文などの分岐を使わずに処理を分岐する」と考えてもいいと思います。 JavaScriptではよくやっていることだし簡単に実装できるのに、PHPではどう書いたらいいかわからずもやもやしています。 PHPで処理をデータとして定義する方法はありますか? あるとしたらどのように実装するのでしょうか? ※もしないなら「ない」と断定してくだされば、あきらめがつきますのでそのような情報も助かります。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • VB6でユーザー定義型がNothingかどうか調べるには?

    VB6でユーザー定義型がNothingじゃなかったら~処理~をするという事をしたいのですが 下記のように書くと「型が一致しません。」のエラーが出ます。 If Not ユーザー定義型 Is Nothing Then ~処理~ End If どのようにしたらユーザー定義型がNothingかどうか見分けられるのでしょうか?

専門家に質問してみよう