2010-09-15 37 views
4

我正在使用PHP为表格创建分页。 我使用下面的代码来创建分页链接删除URL中的旧参数(PHP)

<a class='page-numbers' href='$href&pagenum=$i'>$i</a> 

随着$ HREF

$href = $_SERVER['REQUEST_URI']; 

它运作良好,但是,它与地址栏打乱,每次添加新页次参数。 因此,它变成pagenum = 1 & pagenum = 3 & pagenum = 4 ....

如何改善?

回答

7

这个怎么样?去和测试,以确保:)

<?php 
    $new_get = $_GET; // clone the GET array 
    $new_get['pagenum'] = $i; // change the relevant parameter 
    $new_get_string = http_build_query($new_get); // create the foo=bar&bar=baz string 
?> 
<a class="page-numbers" href="?<?php echo $new_get_string; ?>"> 
    <?php echo $i ?> 
</a> 

另外,还要注意整个$href位是不必要的。如果你用?开始href,浏览器将把查询字符串应用到当前路径。

我敢打赌你会循环,所以这里有一个版本优化生成10,000页的页面链接。我的基准测试表明它在大量链接上的速度稍微快一点,因为你只是在进行字符串连接而不是完整的HTTP查询构建,但它可能不足以值得担心。当有五个或六个GET参数时,这种差异才真正显着,但是,如果存在,这种策略在我的机器上大约一半的时间内完成。

<?php 
    $pageless_get = $_GET; // clone the GET array 
    unset($pageless_get['pagenum']); // remove the pagenum parameter 
    $pageless_get_string = http_build_query($pageless_get); // create the foo=bar&bar=baz string 
    for($i = 0; $i < 10000; $i++): 
     // append the pagenum param to the query string 
     $page_param = "pagenum=$i"; 
     if($pageless_get_string) { 
      $pageful_get_string = "$pageless_get_string&$page_param"; 
     } else { 
      $pageful_get_string = $page_param; 
     } 
?> 
    <a class="page-numbers" href="?<?php echo $pageful_get_string; ?>"> 
     <?php echo $i ?> 
    </a> 
<?php endfor ?> 
+0

'$ href'也可能是一个安全问题。 – alex 2010-09-15 01:12:55

+0

@alex - 不是修辞:安全问题会是什么?通过'http://example.com/index.php/">直接在身体上的东西像XSS? – Matchu 2010-09-15 01:21:07

+0

是的,但我[想](http://www.alexanderdickson.com/blog/2010/03/form -security-submitting-forms-to-itself-in-php /)大多数/所有浏览器都会对网址中的坏字符进行编码 – alex 2010-09-15 01:30:44

1
$url = $_SERVER['REQUEST_URI']; 
$urlparams = parse_url($url); 
if(isset($urlparams['query']){ 
    parse_str($urlparams['query'],$vars); 
    $vars['pagenum'] = $i; 
    $urlparams['query'] = http_build_query($vars); 
} else { 
    $urlparams['query'] = 'pagenum='.$i; 
} 
$url = http_build_url($urlparams); 
//http_build_url() is in PECL, you might need to manually rebuild the 
//url by looping through it's components: 
/* 
    $url=(isset($urlparams["scheme"])?$urlparams["scheme"]."://":""). 
     (isset($urlparams["user"])?$urlparams["user"]:""). 
     (isset($urlparams["pass"])? ":".$urlparams["pass"]:""). 
     (isset($urlparams["user"])?"@":""). 
     (isset($urlparams["host"])?$urlparams["host"]:""). 
     (isset($urlparams["port"])?":".$urlparams["port"]:""). 
     (isset($urlparams["path"])?$urlparams["path"]:""). 
     (isset($urlparams["query"])?"?".$urlparams["query"]:""). 
     (isset($urlparams["fragment"])?"#".$urlparams["fragment"]:""); 
*/