从下面的代码中我可以看到,我设置的变量($ query)等于从外部表单发布的数据。在此之下,我通过回显测试变量,因此变量似乎正确建立。
问题是在底部附近我正在尝试创建另一个名为$ 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);
}
?>
答案 0 :(得分:3)
这是范围界定的问题。您的$ query变量(实际上任何未在函数体中直接实例化的变量)在check_files中不可用。
您应该将$ query作为参数传递给函数。
function check_files($this_file, $query) {
// ...
}
存在使变量“全局”的另一种选择,但这很少是一个明智的想法。
答案 1 :(得分:2)
它不起作用的原因是因为$ query超出了函数的范围。如果要使用在函数内部声明的变量,则需要将其作为参数传递,或者使用
function check_files($this_file) {
global $query;
$str_to_find = $query;
虽然将其作为参数传递,但优先使用global。
答案 2 :(得分:0)
变量$query
在函数check_files()
范围之外声明。如果要访问它,请将global $query;
放在函数的开头。
答案 3 :(得分:0)
您需要根据PHP manual声明$query
全局,否则,解析器将假定$query
是本地范围变量(local
,如“仅在此职能范围内”)
function check_files($this_file) {
global $query;
$str_to_find = $query;
...