4

I'm using PHP to create a pagination for a table. I'm using the following code to create the pagination link

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

With $href

$href = $_SERVER['REQUEST_URI'];

It works well, however, it messes with the address bar, adding each time a new pagenum parameter. So it becomes pagenum=1&pagenum=3&pagenum=4....

How to improve that?

Matt
  • 22,721
  • 17
  • 71
  • 112
Omar Abid
  • 15,753
  • 28
  • 77
  • 108

2 Answers2

7

How about this? Went and tested, to be sure :)

<?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>

Also, note that the whole $href bit is unnecessary. If you start your href with ?, the browser will apply the query string to the current path.

I bet you're going to be looping, though, so here's a version optimized for producing 10,000 page number links. My benchmarks put it as being ever so slightly faster at large numbers of links, since you're just doing string concatenation instead of a full HTTP query build, but it might not be enough to be worth worrying about. The difference is only really significant when there five or six GET parameters, but, when there are, this strategy completes in about half the time on my machine.

<?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 ?>
Matchu
  • 83,922
  • 18
  • 153
  • 160
  • `$href` could also be a security issue. – alex Sep 15 '10 at 01:12
  • @alex — Not rhetorical: what would the security issue be? Something like XSS via `http://example.com/index.php/">direct in body`? – Matchu Sep 15 '10 at 01:21
  • Yeah, but I [think](http://www.alexanderdickson.com/blog/2010/03/form-security-submitting-forms-to-themselves-in-php/) most/all browsers will encode the bad characters in the URL. – alex Sep 15 '10 at 01:30
  • @alex — Oh, and I forgot for a minute that REQUEST_URI includes GET stuff. So I guess that makes it even easier than hoping that the slash works. Heh. – Matchu Sep 15 '10 at 01:34
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"]:""); 
*/
Wrikken
  • 69,272
  • 8
  • 97
  • 136