在命令行中的php中使用无效的参数

时间:2009-12-16 14:39:28

标签: php

我在php中编写了一个脚本,它读取两个文件并从一个文件中获取所有字符串并在其他文件中搜索它们。这在Web浏览器中工作正常。但是,当我尝试通过命令行运行它时,它说 '为foreach()提供了无效的参数.... 我错过了什么吗?

<?php
$filename = 'search_items.txt'; 
$fp = @fopen($filename, 'r'); 
if ($fp) { 
 $array = explode(",", fread($fp, filesize($filename))); 
} 

$filename1 = 'file1.log'; 
$fp1 = @fopen($filename1, 'r'); 
if ($fp1) { 
 $array1 = explode("\n", fread($fp1, filesize($filename1))); 
} 

$num = 1;

foreach($array1 as $val1){
 foreach($array as $val){
  if(strstr($val1, $val)){
   echo 'line : '.$num.'->'.$val1.'<br>';
  }
 }
++$num;    
}    
?>

<?php





$filename = 'search_items.txt'; 
$fp = fopen($filename, 'r'); 
if ($fp) { 
 $array = explode(",", fread($fp, filesize($filename))); 
} 

$filename1 = 'file1.log'; 
$fp1 = fopen($filename1, 'r'); 
if ($fp1) { 
 $array1 = explode("\n", fread($fp1, filesize($filename1))); 
} 

$num = 1;

foreach($array1 as $val1)
{
foreach($array as $val)
{
if(strstr($val1, $val)) 
{
print_r('\n'); //2
}
}
++$num;
print_r($val1); // 1
}

好的,脚本现在正在运行,但有一些有趣的事情发生了。 如果我删除评论1中的印刷品并将其放在评论2的位置,我得到的结果是最后的结果,即最后一个结果。不是完整的搜索。谁能告诉我为什么?

4 个答案:

答案 0 :(得分:1)

我想,你的fopen电话找不到他们的档案。首先,从'@fopen'中删除'@',这样你就可以看到它失败了。然后,这样做:

$filename = dirname(__FILE__).'/search_items.txt';
//...
$filename1 = dirname(__FILE__).'/file1.log';

这样可以保持文件位置的正确。

答案 1 :(得分:0)

您的文件路径可能已关闭,因此永远不会创建$ array和$ array1。相对路径将来自您调用脚本的位置,而不是脚本的位置。

答案 2 :(得分:0)

也许变量是空的还是不存在?

$array = $array1 = array();

//...

foreach((array)$array1 as $val1)
{
    foreach((array)$array as $val)
    {
        if(strstr($val1, $val)) 
        {
            echo 'line : '.$num.'->'.$val1.'<br>';
        }
    }
    $num++;
}

答案 3 :(得分:0)

为了安全起见,您应该在运行foreach循环之前添加一个检查文件指针是否有效,或者如果打开文件失败则抛出一些错误。

<?php


$filename = 'search_items.txt'; 
$fp = @fopen($filename, 'r'); 
if ($fp) { 
 $array = explode(",", fread($fp, filesize($filename))); 
}

$filename1 = 'file1.log'; 
$fp1 = @fopen($filename1, 'r'); 
if ($fp1) { 
 $array1 = explode("\n", fread($fp1, filesize($filename1))); 
} 

$num = 1;

if($fp && $fp1)
{
    foreach($array1 as $val1)
    {
        foreach($array as $val)
        {
            if(strstr($val1, $val)) 
            {
                echo 'line : '.$num.'->'.$val1.'<br>';
            }
        }
        ++$num;

    }
}

?>

请记住,从CLI运行脚本时,当前目录是脚本从中启动的目录。通过Apache运行时,当前目录是脚本的目录。这让我有点几次。