我正在创建一些数据的pagging。 例如,我有一个页面:
http://example.com/news.php?type=bla&smth=bla
我有一个新闻列表,其中包含指向其他页面的链接。链接到第一页是:
http://example.com/news.php?type=bla&smth=bla&page=1
这是脚本,它创建页面链接:
print '<a href="?'.$_SERVER['QUERY_STRING'].'&page=1"><<</a>';
但点击其他页面后,链接网址非常大,看起来像是:
http://example.com/news.php?type=bla&smth=bla&page=1&page=2&page=1&page=3
我该如何改变?
答案 0 :(得分:6)
您只需将新的支架附加到旧的支架上,但如果已经存在,则不要更换它。所以你需要将旧的查询字符串与新的查询字符串合并:
// either by merging both arrays
$query = array_merge($_GET, array('page'=>1));
// or by the union of both
$query = array('page'=>1) + $_GET;
// or by altering the array
$query = $_GET;
$query['page'] = 1;
并且PHP已经有一个http_build_str
可以从关联数组构建一个查询字符串:
print '<a href="?' . htmlspecialchars(http_build_str($query)) . '"><<</a>';
修改以下是http_build_str
的替代定义:
if (!function_exists('http_build_str')) {
function http_build_str($query, $prefix='', $arg_separator='') {
if (!is_array($query)) {
return null;
}
if ($arg_separator == '') {
$arg_separator = ini_get('arg_separator.output');
}
$args = array();
foreach ($query as $key => $val) {
$name = $prefix.$key;
if (!is_numeric($name)) {
$args[] = rawurlencode($name).'='.urlencode($val);
}
}
return implode($arg_separator, $args);
}
}
答案 1 :(得分:1)
最简单的方法是执行以下操作:
$params = $_GET; // make a copy of the querystring params
$params['page'] = 1; // will replace any existing 'page' parameter
echo '<a href="?'.http_build_query($params)'">Page 1</a>';
答案 2 :(得分:1)
备用http_build_str不处理内部数组, 因此,我建议如下:
function http_build_str_inner($query, $prefix, $arg_separator,&$args) {
if (!is_array($query)) {
return null;
}
foreach ($query as $key => $val) {
$name = $prefix."[".$key."]";
if (!is_numeric($name)) {
if(is_array($val)){
http_build_str_inner($val,$name,$arg_separator,$args);
}else{
$args[] = rawurlencode($name).'='.urlencode($val);
}
}
}
}
function http_build_str($query, $prefix='', $arg_separator='') {
if (!is_array($query)) {
return null;
}
if ($arg_separator == '') {
$arg_separator = ini_get('arg_separator.output');
}
$args = array();
foreach ($query as $key => $val) {
$name = $prefix.$key;
if (!is_numeric($name)) {
if(is_array($val)){
http_build_str_inner($val,$name,$arg_separator,$args);
}else{
$args[] = rawurlencode($name).'='.urlencode($val);
}
}
}
return implode($arg_separator, $args);
}
...享受
答案 3 :(得分:0)
每次运行该脚本时,页面参数都将附加到查询字符串。 例如,当您到达第一页时,查询字符串将为:
http://site.com/news.php?type=bla&smth=bla
当你到达查询字符串的页面时将是
http://site.com/news.php?type=bla&smth=bla&page=1
,等等你去的所有页面。
我建议改为编写一个函数,该函数从数组中获取参数并将它们格式化为查询字符串,然后根据需要进行更改。
这就是:
<?php
$parameters = array(
'type' => 'bla',
'smth' => 'bla',
'page' => 1, // Of course, logic up front to change the value of this
);
print print '<a href="?' . format_url_parameters($parameters) .'>Link</a>';
// format_url_parameters producing a valid query string here
答案 4 :(得分:-1)
你也可以简单地使用
print '<a href="http://'. $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'].'?page=1"><<</a>';
每次都会生成一个绝对URL。