2012-02-24 13 views
0

私のコードからわかるように、変数($ query)は外部フォームから投稿されたデータと同じです。私はそれをエコーすることによって変数をテストしたので、変数は正しく設定されているようです。PHPの変数構文

問題は、私が$ str_to_findという別の変数を作成しようとしているところで、元の変数$ queryを出力するように設定したいということです。しかし、私が出力を見ると、コードがこの変数を自分のコードの最後の近くで処理した後に何も表示されません。なぜ出力が表示されないのかわかりません。

<?php 
$query = $_POST['query']; 

echo "$query"; 

find_files('.'); 
function find_files($seed) { 
    if(! is_dir($seed)) return false; 
    $files = array(); 
    $dirs = array($seed); 
    while(NULL !== ($dir = array_pop($dirs))) 
    { 
     if($dh = opendir($dir)) 
     { 
      while(false !== ($file = readdir($dh))) 
      { 
       if($file == '.' || $file == '..') continue; 
       $path = $dir . '/' . $file; 
       if(is_dir($path)) { 
        $dirs[] = $path; 
       } 
       else { 
        if(preg_match('/^.*\.(php[\d]?|js|txt)$/i', $path)) { 
         check_files($path); 
        } 
       } 
      } 
      closedir($dh); 
     } 
    } 
} 

function check_files($this_file) { 
    $str_to_find = $query; 
    if(!($content = file_get_contents($this_file))) { 
     echo("<p>Could not check $this_file</p>\n"); 
    } 
    else { 
     if(stristr($content, $str_to_find)) { 
      echo("<p>$this_file -> contains $str_to_find</p>\n"); 
     } 
    } 
    unset($content); 
} 
?> 

更新されたコード

<?php 
$query = $_POST['query']; 



find_files('.'); 
function find_files($seed) 

{ 


if(! is_dir($seed)) return false; 
$files = array(); 
$dirs = array($seed); 
while(NULL !== ($dir = array_pop($dirs))) 
{ 
    if($dh = opendir($dir)) 
    { 
     while(false !== ($file = readdir($dh))) 
     { 
      if($file == '.' || $file == '..') continue; 
      $path = $dir . '/' . $file; 
      if(is_dir($path)) { $dirs[] = $path; } 
      else { if(preg_match('/^.*\.(php[\d]?|js|txt)$/i', $path)) { check_files($path); }} 
     } 
     closedir($dh); 
    } 
} 
} 

function check_files($this_file) 
{ 

$query = $_POST['query']; 

$str_to_find = $query; 
if(!($content = file_get_contents($this_file))) { echo("<p>Could not check $this_file</p>\n"); } 
else { if(stristr($content, $str_to_find)) { echo("<p>$this_file -> contains 
$str_to_find</p>\n"); }} 
unset($content); 
} 

?> 
+1

のhttpがあると仮定します宣言する必要があります。 //php.net/manual/en/language.variables.scope.php $ queryは関数check_files()の外で定義されているので、そこには存在しません: 'global'にするか、より良いものとして関数への引数 –

+1

'function check_files($ this_file){グローバル$クエリ; $ str_to_find = $ query; ' – Cheery

答えて

3

これはスコープの問題です。 $ query変数(と実際には関数本体内で直接インスタンス化されていない変数)は、check_filesでは使用できません。

$ queryを関数のパラメータとして渡す必要があります。

function check_files($this_file, $query) { 
    // ... 
} 

別のオプションは、変数「グローバル」にするために存在しているが、これはあまり賢明なアイデアではありません。

+0

私はそれをうまくやってください。 –

+1

+1ですが、グローバルな提案はありません。 'global'を使わなければならない場合は、間違っている可能性が非常に高いです。 – simshaun

+0

@simshaun私は良いアイデアではないことを提案しましたが、それでも有効なオプションです。可変スコープに関して認識しておくべきことがあります。 – jstephenson

0

変数$queryは、機能check_files()の範囲外に宣言されています。アクセスしたい場合は、機能の先頭にglobal $query;と入力してください。

2

なぜ機能していないのは、$ queryが関数の有効範囲外であるためです。あなたはそれの内部関数の外で宣言された変数を使用したい場合は、どちらかをパラメータとして、それを通過、またはグローバル使用に好ましいパラメータとして、それを通過するが、

function check_files($this_file) { 
    global $query; 
    $str_to_find = $query; 

を使用する必要があります。

0

あなたがいない場合PHP manualあたりのようなグローバル$query、パーサは$queryは、ローカルスコープ変数(「のみ、この関数内で」のようにlocal

function check_files($this_file) { 
global $query; 
$str_to_find = $query; 
...