1

-wayを使用して$_GET[variable from link]、ユーザーがWebページで選択したオプション(たとえば、ページごとの投稿やpost-oder)を渡します。私は、ユーザーが選択したオプションを提供して、headerリダイレクトで使用できるようにする単純な変数を作成することを考えていました。

if ((isset($_GET['id'])) AND($_GET['id'] != 0 )) {  
    $topic_id = (int)$_GET['id'];  
    $header = 'Location: topic.php?id='.$topic_id;  
}  
        else {  
        header('Location: error.php');  
        die();  
        }  
if ((!isset ($_GET['page'])) OR ((int)$_GET['page'] == NULL)) {  
header('Location: topic.php?id='.$topic_id.'&page=1');  
die();  
}  
else {  
$page = (isset($_GET['page']) AND (int)$_GET['page'] > 0) ? (int)$_GET['page'] : 1;  
$header = $header.'&page='.$page;  
}  
    if(isset($_GET['order']) AND $_GET['order'] != NULL)  {  
    $order = $_GET['order'];  
    $header = $header.'&order='.$order;  
     }  

等々。

これで、ユーザーが選択したオプションを取得しましたが、それらの1つを特別なリダイレクト用に変更string-replaceする場合は、 -functionを作成する必要があります。私の質問は:多く$_GETのオプションや不足しているオプションを処理するためのより良い方法はありますか?良い習慣はありますか?これが簡単な質問である場合は申し訳ありません。

4

1 に答える 1

1

サンプルコードでは$_GET、などを介してアクセスする各クエリ文字列パラメータを、などの変数に$_GET['page']直接追加します。$header$header = '&page=' . $_GET['page'];

id各キーには「できない」などの「ルール」があるように見えるため、キー0のリストをループすることは可能ですが、評価するルールのリストを保持する必要があります。それだけの価値はありません(あなたがたくさんの鍵を持っていない限り、私は良い利益を見ることができました)。

代わりに、コードを並べ替えてクリーンアップして完全なクエリ文字列を作成し、実際にリダイレクトすること心配することができます。

if (!isset($_GET['id']) || ((int)$_GET['id'] == 0)) {
    // invalid id; no need to process further.
    header('Location: error.php');
    die();
}

// set the ID
$queryString = 'id=' . (int)$_GET['id'];

// process the current page
$queryString .= '&page=' . ((empty($_GET['page']) || ((int)$_GET['page'] <= 0)) ? 1 : $_GET['page']);

// set the order, if available
if (!empty($_GET['order'])) {
    $queryString .= '&order=' . $_GET['order'];
}

// redirect
header('Location: topic.php?' . $queryString);
die();

これには各キーの手動作業が必要ですが、(私の意見では)管理が簡単で、実際のURL/リダイレクトは1か所でのみ処理されます。これは、私が小規模なプロジェクトで使用する方法でもあります。プロジェクトは、(大幅に)変更されることが予想されないか、動的で増え続けるパーツのリストがあります。

上記の方法が面倒な場合(クエリ文字列パラメータ/ルールが多すぎる場合に簡単に当てはまる可能性があります)、キーとそのルールのリストを作成することをお勧めします。これは、このメソッドの簡単なサンプルです(テストされていません)。

// define the list of "keys" and their "rules"
$keys = array(
    'id'    => array('required' => true, 'min' => 1),
    'page'  => array('required' => false, 'min' => 1, 'default' => 1),
    'order' => array('required' => false)
);

$query = '';
foreach ($keys as $key => $rules) {
    // get the value of the key from the query-string, if set
    $value = (empty($_GET[$key]) ? null : $_GET[$key]);

    // determine if the value is valid or not
    $valid = (empty($value) || (isset($rules['min']) && ((int)$value < $rules['min']))) ? false : true;

    if ($rules['required'] && !$valid) {
        // required key but invalid value =[
        header('Location: error.php');
        die();
    } else if (!$rules['required'] && !$valid) {
        if (!empty($rules['default'])) {
            // the key is not set but has a default value
            $value = $rules['default'];
        } else {
            // the key is not required, is not set, and has no default value; skip it
            continue;
        }
    }

    // append the key/value to the query
    $query .= (($query != '') ? '&' : '') . $key . '=' . $value;
}

header('Location: topic.php?' . $query);
die();

上記は、キー/ルールベースのシステムのスケルトンです。ルールは非常に最小限であり、キーが必要かどうか、およびその最小値は何であるかを定義します(aminが設定されている場合、それは整数であると想定し、を介してキャストします(int))。キーが必要で設定されていない場合、または有効な値でない場合、キーはすぐに失敗し、にリダイレクトされerror.phpます。キーが不要で、値が無効あるがdefault値が設定されている場合、その値が使用されます。それ以外の場合は、そのキーをスキップします。すべての値処理が完了すると、キー/値がクエリに追加され、続行されます。

min2つのルールとを定義するだけなので、これは「スケルトン」システムであると言えますrequiredmaxこれに基づいて、最大値を設定したりin_list、有効な値のリストを定義したりするなどのルールを追加することができます(の場合など、を使用してチェックすることorderができます)。それには可能性がありますが、あなたのニーズに限定されています!'in_list' => array('asc', 'desc')in_array($value, $rules['in_list'])

于 2012-11-06T14:01:21.863 に答える