2012-06-09 22 views
4

在php中,我添加了一个额外的URL段?sort来按升序或降序对帖子进行排序。PHP不添加已经存在的url参数

<?php 
    //get current URL 
    $url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 

    //filter URL and create sorting links 
    if(filter_var($url, FILTER_VALIDATE_URL)) 
    { ?>   
     <a href="<?php echo $url; ?>?sort=asc">Small</a> 
     <a href="<?php echo $url; ?>?sort=desc">Large</a> 
    <?php } ?> 

问题:我每次点击一个链接的URL网址段重复。

例子:http://mysite.com/another_segment/?sort=asc?sort=asc?sort=asc

要禁止重复,我怎么更换URL段每当我点击两个分拣环节之一?我不需要将参数与&符号分开。我期待只有一个分隔符。我在分页脚本中使用它,因此当我浏览页面时,参数需要保留在URL中。

我试图避免的JavaScript以及

+0

,即'/ another_segment /:

$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // Strip the query string from URL list($url,) = explode('?', $url); // Remove 'sort' from querystring if exist if (isset($_GET['sort'])) unset($_GET['sort']); // Rebuild query string, append with '&' $url .= '?'. http_build_query($_GET).(count($_GET) ? '&' : ''); if (filter_var($url, FILTER_VALIDATE_URL)) { ?> <a href="<?php echo $url; ?>sort=asc">Small</a> <a href="<?php echo $url; ?>sort=desc">Large</a> <?php } ?> 

这样你就可以有查询字符串参数的URL,但只有一个sort=asc|desc?排序= asc'。这是说明性的:http://php.about.com/od/learnphp/qt/_SERVER_PHP.htm –

+0

@JaredFarrish - 这将解释它是否重复两次。但是3次? –

+0

@保罗 - 当然,为什么不呢?尝试我的演示:http://jfcoder.com/test/url.php –

回答

3

您应该使用以下函数删除现有URL中的“排序”键,然后追加。

function remove_querystring_var($url, $key) { 
    $url = preg_replace('/(.*)(?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); 
    $url = substr($url, 0, -1); 
    return $url; 
} 

您的代码应该修改这种方式

<?php 
    //get current URL 
    $url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    $url = remove_querystring_var($url, "sort"); 
    //filter URL and create sorting links 
    if(filter_var($url, FILTER_VALIDATE_URL)) 
    { ?>   
     <a href="<?php echo $url; ?>?sort=asc">Small</a> 
     <a href="<?php echo $url; ?>?sort=desc">Large</a> 
    <?php } ?> 
+0

谢谢!我添加了函数和代码,但由于某种原因它不能解决问题。 – CyberJunkie

+0

我的错误,它的工作原理,谢谢! – CyberJunkie

0

尝试使用的$_SERVER['SCRIPT_NAME']代替REQUEST_URI

1

要从$_SERVER['REQUEST_URI']中去除查询字符串,请使用$URI = strstr($_SERVER['REQUEST_URI'], "?", true);

Reference: php.net;

1
<?php 

$get_asc = $get_desc = $_GET; 
$get_asc['sort'] = 'asc'; 
$get_desc['sort'] = 'desc'; 

if(filter_var($url, FILTER_VALIDATE_URL)) { ?> 
    <a href="<?php echo $url . '?' . http_build_query($get_asc); ?>">Small</a> 
    <a href="<?php echo $url . '?' . http_build_query($get_desc); ?>">Large</a> 
<?php } ?> 
2

地带的查询字符串从$url和重建$_GET&追加。这可能是因为什么`$ _ SERVER [ 'REQUEST_URI']'包含

http://example.com/some/path?page=1&last=1500&sort=asc 
http://example.com/some/path?page=1&last=1500&sort=desc