【问题标题】:php file() into foreach - Fatal error: Cannot break/continue 1 levelphp file() 进入 foreach - 致命错误:无法中断/继续 1 级
【发布时间】:2018-10-07 22:19:48
【问题描述】:

我使用 file() 函数读取包含 ips 的远程文件并将其放入数组中,以便对照 $_SERVER[REMOTE_ADDR]; 进行检查。但是,一旦它被读取和处理,我会收到一条致命错误消息!

代码

$url = 'http://v87145.hosted-by-vdsina.ru/cUrl/blacklisted.dat';
$ip_block = file($url);

if(isset($_SERVER['REMOTE_ADDR'])) {
$client_ip = $_SERVER['REMOTE_ADDR'];
}

$blocked = false;
foreach($ip_block as $ip)
echo $ip . "<br/>\n"; //just to verify file has been read

{
        if($client_ip == $ip)
        {
            $blocked = true;
            break;
        }else if(strpos($ip, '*') !== false){
            $digits = explode(".", $ip);
            $client_ip_digits = explode(".", $client_ip);
            if($digits[1] == '*' && $digits[0] == $client_ip_digits[0])
            {
                $blocked = true;
                break;
            }else if($digits[2] == '*' && $digits[0] == $client_ip_digits[0] && $digits[1] == $client_ip_digits[1]){
                $blocked = true;
                break;
            }else if($digits[3] == '*' && $digits[0] == $client_ip_digits[0] && $digits[1] == $client_ip_digits[1] && $digits[2] == $client_ip_digits[2]){
                $blocked = true;
                break;
            }
        }else if(strpos($ip, "-") !== false){
            list($start_ip, $end_ip) = explode("-", $ip);
            $start_ip = preg_replace('/\s+/', '', $start_ip);
            $end_ip = preg_replace('/\s+/', '', $end_ip);
            $client_ip_long = ip2long($ip);     
            $start_ip_long = ip2long($start_ip);
            $end_ip_long = ip2long($end_ip);
            if($client_ip_long >= $start_ip_long && $client_ip_long <= $end_ip_long)
            {
                $blocked = true;
                break;
            }
        }
    }

if($blocked == true)
{
    # header('HTTP/1.0 404 Not Found');
    # die;
    echo $ip . ' is blocked' . "<br />\n";
}

我得到的错误消息是:致命错误:无法在第 30 行的 /home/admin/web/*****/public_html/check_me.php 中中断/继续 1 级

可能有什么问题?如果我只是做一个简单的 array() 它工作正常,那么 file() 会产生这个错误吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    echo 语句的位置将您的 foreach 语句与其主体代码块分开,导致您的 break 语句尝试跳出不属于循环的代码块。

    代码块对于条件 (if/else) 和循环 (for/while/do/foreach) 是可选的。如果这些语句后面没有代码块,PHP 将执行它看到的下一条命令。

    此外,您可以在 PHP 中的任何位置拥有代码块,这就是您的代码不会出现语法错误的原因。

    您当前的代码:

    foreach($ip_block as $ip)
    echo $ip . "<br/>\n"; //just to verify file has been read
    
    {
        if($client_ip == $ip)
        {
            $blocked = true;
            break;
        }
        // [...]
    }
    

    基本相同:

    foreach($ip_block as $ip) {
        echo $ip . "<br/>\n"; //just to verify file has been read
    }
    
    {
        if($client_ip == $ip)
        {
            $blocked = true;
            break;
        }
        // [...]
    }
    

    因为从 PHP 的角度来看,第二个代码块不是 foreach 主体的一部分,所以您的 break 语句没有意义。

    您可以通过将 echo 语句移到 { 之后轻松解决此问题,使其成为 foreach 正文代码块的一部分:

    foreach($ip_block as $ip)
    {
        echo $ip . "<br/>\n"; //just to verify file has been read
    
        if($client_ip == $ip)
        {
            $blocked = true;
            break;
        }
        [...]
    }
    

    【讨论】:

    • 这应该被关闭作为错别字的主题。
    • @rickdenhaan 这个解决方案效果很好,解释也很有意义。非常感谢!
    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2011-09-20
    • 2013-07-05
    • 2011-05-15
    • 2011-12-11
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多