2017-03-19 12 views
-1

最近、PHPでクラスがどのように機能するかをレビューしています。私はこのコードに遭遇し、WAMPが私のホストとは違って私に通知を出す理由を理解しようとしています。私が取得しますグローバル変数を使用しない未定義の変数エラー

$settings['ip_forwarded_check'] = 1; 

function get_ip() 
{ 


    $ip = 0; 

    if(!preg_match("#^(10|172\.16|192\.168)\.#", $_SERVER['REMOTE_ADDR'])) 
    { 
     $ip = $_SERVER['REMOTE_ADDR']; 
    } 

    if($settings['ip_forwarded_check']) 
    { 
     if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
     { 
      preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#s", $_SERVER['HTTP_X_FORWARDED_FOR'], $addresses); 
     } 
     elseif(isset($_SERVER['HTTP_X_REAL_IP'])) 
     { 
      preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#s", $_SERVER['HTTP_X_REAL_IP'], $addresses); 
     } 

     if(is_array($addresses[0])) 
     { 
      foreach($addresses[0] as $key => $val) 
      { 
       if(!preg_match("#^(10|172\.16|192\.168)\.#", $val)) 
       { 
        $ip = $val; 
        break; 
       } 
      } 
     } 
    } 

    if(!$ip) 
    { 
     if(isset($_SERVER['HTTP_CLIENT_IP'])) 
     { 
      $ip = $_SERVER['HTTP_CLIENT_IP']; 
     } 
    } 


    return $ip; 
} 

エラーは以下のとおりです。

Notice: Undefined variable: settings in 
Notice: Undefined variable: addresses in 

私は追加することにより、すべての問題を修正することができ、 "グローバル:$設定を、グローバル$アドレス;"私はこれを防ぐ方法が不思議でしたか?私は機能でグローバルを使用すべきではないと多くの主張を知っているので、私はこのことについて正しい方法を考えるのに苦労します。なぜ1つのホストが私に警告/通知を表示し、もう1つは表示しないのかを知りたいですか?私はホストのために通知をオフにしません。

+0

これは、変数を定義していないため、値を渡す前に変数を使用しているので、変数が存在しないという意味です。そしてあなたの関数の外でその変数を使用しています。この '$ settings ['ip_forwarded_check'] = 1;を' $ settings = 1; 'に変更し、2つの変数を関数の中に入れてみてください。 – Mario

+0

しかし、$ settings ['ip_forwarded_check'] = 1より前に$ settings = array()を追加しても、うまくいけませんか?また、$ addresses変数は、関数の中でかなり多く形成されています。私は本当に= 0に設定する必要がありますか?奇妙なPHPが私にそれを要求しているようだ。私のホストのPHPバージョンが私に警告を促すように見えないので、私が尋ねる理由があります。 –

+0

'error_reporting(1);を追加します。 ini_set( 'error_reporting'、E_ALL); 'あなたのスクリプトに、そのコードを読んで本当にエラーが出るでしょう。 – Mario

答えて

1

両方の問題は、初期化されていない変数を使用していることに起因します。あなたのコード内

$foo = "abc"; 

を記述する場合$fooは前に存在していなかった場合は、その後、それが作成され、初期化されます。あなたはこのような何かを行う場合は、:

$settings['ip_forwarded_check'] = 1; 

は、あなたが作成されていませんでした連想配列の項目を参照してくださいしてみてください。のは、それを作成してみましょう:

$settings = array(); 
$settings['ip_forwarded_check'] = 1; 

また$addressesを初期化する必要がありますが、私はあなたがそれを初期化する必要があります方法についてのアドバイスを与えるのに十分なあなたの仕事のことは知りません。

エラー報告がサーバーでオフになっている可能性があります。これは、そこにエラーメッセージが表示されないためです。