0

' foreach 'が失敗したかどうかを検出する方法が必要です。失敗した場合は、現在の' else 'にあるのと同じエラーメッセージを繰り返します

<?php

    if(file_exists('redirects.xml')) {
        $xml = simplexml_load_file('redirects.xml');
        if(isset($_GET['r']) && $_GET['r'] != '' && !is_array($_GET['r'])) {
            foreach($xml->short as $shorts) {
                if($shorts->name == $_GET['r']) {
                    header('Location: '.$shorts->url);
                    break;
                }
            }
        }
        else {
            header("refresh:2;url=http://www.wlatw.co/");
            echo '<div align="center" style="font-weight: bolder; font-size: 24px;">Malformed URL</div><div align="center" style="font-weight: bolder; font-size: 16px;">Redirecting...</div>';
        }
    }
?>
4

2 に答える 2

3

ループを開始する前にフラグを作成します。失敗した場合は失敗に設定します。

<?php

    if(file_exists('redirects.xml')) {
        $xml = simplexml_load_file('redirects.xml');
        if(isset($_GET['r']) && $_GET['r'] != '' && !is_array($_GET['r'])) {
            $success = false; // set the flag
            foreach($xml->short as $shorts) {
                if($shorts->name == $_GET['r']) {
                    header('Location: '.$shorts->url);
                    $success = true;
                    break;
                }
            }

            if ($success) { // do what you want when not success ful.
                header("refresh:2;url=http://www.wlatw.co/");
                echo '<div align="center" style="font-weight: bolder; font-size: 24px;">Malformed URL</div><div align="center" style="font-weight: bolder; font-size: 16px;">Redirecting...</div>';
            }
        }
        else {
            header("refresh:2;url=http://www.wlatw.co/");
            echo '<div align="center" style="font-weight: bolder; font-size: 24px;">Malformed URL</div><div align="center" style="font-weight: bolder; font-size: 16px;">Redirecting...</div>';
        }
    }
?>

ただし、コードを見ると、ヘッダーを設定した後で終了できます。

foreach($xml->short as $shorts) {
    if($shorts->name == $_GET['r']) {
        header('Location: '.$shorts->url);
        exit;
        break;
    }
}

注: @Sverri M. Olsenが言ったように、Locationヘッダーを設定した後は、die、exit、またはその他のメカニズムを使用して、常にスクリプトを停止する必要があります。

于 2013-02-20T03:47:41.763 に答える
2

ループのステータスを追跡するために変数を追加する必要があります。

<?php

if(file_exists('redirects.xml')) {
    $xml = simplexml_load_file('redirects.xml');
    if(isset($_GET['r']) && $_GET['r'] != '' && !is_array($_GET['r'])) {
        $url_is_malformed = false;
        foreach($xml->short as $shorts) {
            if($shorts->name == $_GET['r']) {
                header('Location: '.$shorts->url);
                break;
            }
        }
        $url_is_malformed = true;
    }
    else {
        $file_doesnt_exist = true;
    }

    if( $file_doesnt_exist || $url_is_malformed )
    {
        header("refresh:2;url=http://www.wlatw.co/");
        echo '<div align="center" style="font-weight: bolder; font-size: 24px;">Malformed URL</div><div align="center" style="font-weight: bolder; font-size: 16px;">Redirecting...</div>';
    }
}

?>

于 2013-02-20T03:48:59.917 に答える