PHP条件是随机输出的?

时间:2012-02-26 17:49:50

标签: php

我的一个条件语句存在问题。下面的代码是单个文本搜索,用户可以在其中输入字符串并检查目录中的一组文件。代码工作得很好,虽然我只是有一个小的输出故障。

下面的第二个条件(就在find_files函数之前)在我的搜索结果中间显示一个echo语句。换句话说,我的结果显示得很完美,尽管第二个条件语句在搜索结果中出现一次。

更奇怪的是条件确实有效(即当我输入一个字符串并且文件中没有找到字符串时),所以我很困惑。而且我知道条件不包含在循环中,那么为什么它会在搜索过程中显示呢?

这是我需要解决的最后一个小故障,这将很有效。任何帮助将不胜感激。

 <?php

 $query = $_POST['query'];



 if ((isset($query)) && (empty($query))) {
 echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
 }


 elseif ((isset($query)) && (!find_files('.')))  { 
 echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>"; 
 } 



 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 style=\"color:darkgray; font-
family:arial\">Could not check $this_file</p>\n"); }
else { if(stristr($content, $str_to_find)) { echo("<p style=\"color:darkgray; font-
family:arial\">$this_file -> contains $str_to_find</p>\n"); }}
unset($content);
}

?>

2 个答案:

答案 0 :(得分:1)

简单地添加退货,无济于事。这个修改过的代码工作,并没有显示错误我                     

    if (!isset($_REQUEST['query']))
    {
        //Ask for query here :)     
        //echo "<p style=\"color:darkgray; font-family:arial\">No query specified.</p>";
        exit;
    }

    $query = isset($_REQUEST['query']) ? $_REQUEST['query'] : '';


    if (empty($query))
    {
        echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
        exit;
    }


    $filesFound = find_files('.');

    if (!$filesFound)
    {
        echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
    }


    function find_files($seed)
    {
        if (!is_dir($seed)) return false;
        $found = false;
        $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))
                        {
                            if (!$found)
                            {
                                $found = check_files($path);
                            }
                        }
                    }
                }
                closedir($dh);
            }
        }
        return $found;
    }

    function check_files($this_file)
    {
        $query = $_REQUEST['query'];

        $str_to_find = $query;


        if (($content = file_get_contents($this_file)) === false)
        {
            echo("<p style=\"color:darkgray; font-family:arial\">Could not check $this_file</p>\n");
            return false;
        }
        else
        {
            if (stristr($content, $str_to_find))
            {
                echo("<p style=\"color:darkgray; font-family:arial\">$this_file -> contains $str_to_find</p>\n");
                return true;
            }
        }
    }

答案 1 :(得分:-1)

在您的第二个条件中,您正在检查条件:!find_files('.')是否匹配。为了检查这个条件,PHP当时正在运行该函数来获取其返回值,然后检查条件。

最重要的是,find_files()函数在提供错误输入时返回false,但在成功时不发送返回值。这意味着它不会为条件语句提供一个评估为正值的值,因此!find_files('.')计算结果为trueecho语句运行。

要解决此问题,您只需添加return true;作为find_files()功能的最后一行。

但我还建议修复你运行该功能两次的事实。使用类似的东西:

if ((isset($query)) && (empty($query))) {
    echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
}

else {
    $success = find_files('.');

    if ((isset($query)) && (!$success))  { 
        echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
    }
}

而不是:

if ((isset($query)) && (empty($query))) {
    echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>";
}

elseif ((isset($query)) && (!find_files('.')))  { 
    echo "<p style=\"color:darkgray; font-family:arial\">Your search produced no results</p>"; 
}

find_files('.');