我把exit();在每个PHP标头位置之后或者在最后一个if语句之后?

时间:2014-10-01 02:19:28

标签: php exit http-redirect

就像标题所说的那样,想知道我是否需要在每个PHP if语句之后放置exit();,或者仅仅是主if语句或只是最后一个if语句?目前我在最后的if语句中有它,它工作正常。

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation == '' ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
    }

    if ( $arr_position == '' ) {
        header ('Location: http://' . $domain . '/jobs/', true, 301);
    }

    if ( isset($home) && $arr_position == '' ) {
        header ('Location: http://' . $domain, true, 301);
    }

    if ( isset($home) && $arr_position != '' ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);

        exit();
    }
}

更新

我将其更改为在每个标题位置调用后都有一个exit(),并且所有操作仍然正常。这是在我的主模板文件中,所以是的,如果块中的标题位置没有匹配,则下面的代码需要执行。

我现在有这样的

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation != strtolower($arr_occupation) ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
        exit();
    }

    if ( $arr_position == '' ) {
        header ('Location: http://' . $domain . '/jobs/', true, 301);
        exit();
    }

    if ( isset($home) && $arr_position == '' ) {
        header ('Location: http://' . $domain, true, 301);
        exit();
    }

    if ( isset($home) && $position == urlencode($arr_position) ) {
        header ('Location: http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position), true, 301);
        exit();
    }
}

更新2

我继续使用DefiniteIntegral答案,因为我喜欢逻辑,但我不得不在主块中使用单独的if语句。使用elseif不起作用。我已经对它进行了全面测试,并在每个elseif中使用了不同的条件,它只是无法正常工作。所以我可以在主块中使用单独的if语句。

以下是它现在的样子

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
    $new_url = false;

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) || $occupation != strtolower($arr_occupation) ) {
        $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
    } 

    if ( $arr_position == '' ) {
        $new_url = 'http://' . $domain . '/jobs/';
    }

    if ( isset($home) && $arr_position == '' ) {
        $new_url = 'http://' . $domain;
    }

    if ( isset($home) && $arr_position != '' ) {
        $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
    }

    if ($new_url !== false) {
        header('Location: ' . $new_url, true, 301);
        exit();
    }
}

最终更新

最后使用elseif语句使其正常工作。必须为每个if代码块中的elseif语句添加更多条件。

最终代码如下所示

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
    $new_url = false;

    if ( !isset($occupation) || $occupation != strtolower($arr_occupation) || $_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']) ) {
        $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);

    } elseif ( isset($home) ) {
        if ( !isset($position) || $position != $arr_position || $position == '' ) {
            $new_url = 'http://' . $domain;
        } else {
            $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
        }

    } elseif ( $currentPage == 'Jobs' ) {
        if ( !isset($position) || $position == '' ) {
            $new_url = 'http://' . $domain . '/jobs/';
        } elseif (isset($position) && $position != '' && $position != $arr_position) {
            $new_url = 'http://' . $domain . strtolower ( '/jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
        }
    }

    if ($new_url !== false) {
        header('Location: ' . $new_url, true, 301);
        exit();
    }
}

2 个答案:

答案 0 :(得分:2)

如果您的目标是始终在此块中执行重定向,请将退出语句放在大括号外的最后一个if块之后。如果您向我们显示的块下面有代码,那么如果目标是重定向,它仍然会不必要地执行。

if ( isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ) {
    $new_url = false;

    if ( strpos($_SERVER['QUERY_STRING'], 'occupation') === false || $_SERVER['REQUEST_URI']    != strtolower($_SERVER['REQUEST_URI']) || $occupation == '' ) {
        $new_url = 'http://' . $domain . strtolower ( '/ jobs/?occupation='.$arr_occupation.'&position='.$arr_position);
    } elseif ( isset($home) ) {
        if ( $arr_position == '' ) {
            $new_url = 'http://' . $domain;
        } else {
            $new_url = 'http://' . $domain . strtolower ( '/ jobs/?occupation='.$arr_occupation.'&position='.$arr_position);    
        }
    } elseif ( $arr_position == '' ) {
        $new_url = 'http://' . $domain . '/jobs/';
    }

    if ($new_url !== false) {
        header('Location: ' . $new_url, true, 301);
        exit;
    }
}

答案 1 :(得分:1)

在每次header()通话后的情况下:您有4种不同的条件且无或多可能匹配,因此您可以执行多个header()来电或根本不执行您已经通过了上一个if语句,导致您的页面退出而没有任何重定向。

如果它是一个if语句的块,后跟一个或多个以elseif结尾的else语句,所有语句都包含重定向,则可以将其放在最后:< / p>

if
  header();
elseif
  header();
elseif
  header();
else
  header();
exit;

但这是唯一的情况,因为如果当前代码中的if语句都不匹配,则需要进行某种错误处理。