使用您的示例代码,您通过 访问的每个查询字符串参数$_GET
,例如$_GET['page']
,您直接附加到一个$header
变量,例如$header = '&page=' . $_GET['page'];
。
由于每个键看起来都有“规则”,例如id
can't be 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/重定向只在一个地方处理。这也是我将在较小的项目中使用的一种方法,这些项目预计不会改变(很多)或具有动态/不断增长的部分列表。
如果上述方法过于繁琐(当您有太多查询字符串参数/规则时很容易出现这种情况),创建键列表及其规则将成为首选方法。这是此方法的快速汇总(未经测试)示例:
// 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();
以上是基于密钥/规则的系统的骨架。规则非常少,并定义是否需要一个键以及它的最小值是什么(如果min
设置了 a,它假定它是一个整数并通过 转换它(int)
)。如果密钥是必需的但未设置,或者不是有效值,它会立即失败并重定向到error.php
. 如果不需要键并且值无效但设置了default
值,它将使用该值;否则它将跳过该键。完成所有值处理后,它将键/值附加到查询中并继续前进。
我说它是一个“骨架”系统,因为它只定义了两个规则,min
并且required
. 您可以在此基础上添加其他规则,例如max
设置最高值,或in_list
定义有效值列表(例如 for order
,您可以拥有'in_list' => array('asc', 'desc')
然后使用 进行检查in_array($value, $rules['in_list'])
)。它有潜力,但仅限于您的需求!