为foreach php提供的参数无效

时间:2017-08-25 07:54:19

标签: php mysql mysqli foreach

有人会介意检查下面的PHP代码。 https://www.linuxliteos.com/test_info/download.php返回:

  

警告:为foreach()提供的参数无效   第27行/home/myhosthere/public_html/test_info/download.php

<?
ini_set('max_execution_time', '18000');
require_once('config.php');
$ftp_server = 'ftpipaddresshere';
$ftp_user_name = 'user';
$ftp_user_pass = 'password';
$conn_id = @ftp_connect($ftp_server, 21);
if(!$conn_id)
{
    echo 'Error: Some problem in Connecting to Server!';
}
else
{
    ftp_pasv($conn_id, true);
    $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    if(!$login_result)
    {
        $error_msg = 'Error: Some problem in Connecting to Vendor Server! Cron Job failed on '.date('m/d/Y H:i:s');
    }
    else
    {
        $arr_files = ftp_rawlist($conn_id, './upload');

        $arr_list = array();
        if(count($arr_files))
        {
            foreach($arr_files as $str_file)
            {
                preg_match('|-rw-r--r--   1 hwdb     hwdb.+ (\d+) ([a-zA-Z]{3} .+\d+ \d+\:\d+) (.*)|', trim($str_file), $arr_details);
                $arr_list[] = $arr_details[3];
            }
        }
        $arr_final_list = array();
        foreach($arr_list as $file_name)
        {
            if (@ftp_get($conn_id, '/home/myhost/public_html/test_info/upload/'.$file_name, 'upload/'.$file_name, FTP_BINARY)) {
                $arr_final_list[] = $file_name;
                //chmod('upload/'.$file_name, 0666);
                echo "processed";
                //Now do ftp delete
                ftp_rename($conn_id, 'upload/'.$file_name, 'processed/'.$file_name);
            }
            else
            {
                echo "error";
            }
        }
    }
}
?>

的config.php

<?
$host="localhost";
$user="dbuser";
$password="password";
$database="db";
$conn = mysqli_connect($host,$user,$password,$database);

?>

提前谢谢。

1 个答案:

答案 0 :(得分:1)

函数ftp_rawlist可以返回false

  

返回一个数组,其中每个元素对应一行文本。传递目录无效时返回FALSE

这样会导致$arr_files错误。 PHP的有趣之处在于它为count(false)返回1。

所以你需要测试这个条件:

 if ($arr_files !== false)

没有必要检查计数,因为foreach循环无论如何都不会迭代。