PHP - 发送脚本的url-address

时间:2009-09-19 09:53:18

标签: php url

我正在创建一些数据的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

我该如何改变?

5 个答案:

答案 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)) . '">&lt;&lt;</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。