http_build_query将20添加到分页

时间:2017-01-06 18:04:34

标签: php pagination

我刚开始使用http_build_query。我已将它实现为我的分页脚本,但它无法正常工作。

我期待的是我的网址为http://example.com/categories.php?cat=category&page=2但由于某种原因,它会在我的网页编号中添加20,使得网址如此http://example.com/categories.php?cat=category&page=22 <<< This is actually for page 2

这是我的原始剧本:

  $img_start=0;
  $img_limit=8;

  if(isset($_GET['page'])) {
   $page=$_GET['page'];
   $img_start=($page-1)*$img_limit;
  }
  else { $page = 1; }

  if($_COOKIE['age_verification'] == "adult") {
   $img_total = mysqli_num_rows(mysqli_query($conn, "select * from gallery_img WHERE $cat = 1"));
  }
  else if($_COOKIE['age_verification'] == "child") {
   $img_total = mysqli_num_rows(mysqli_query($conn, "select * from gallery_img WHERE $cat = 1 AND WHERE nude != 1"));
  }
  $img_total_count = ceil($img_total/$img_limit);

  if($img_limit != $img_total) {
  echo '<nav aria-label="Page navigation">
         <ul class="pagination">'  . PHP_EOL;
  if($page>1) {
  echo '<li><a href="?page='.($page-1).'" aria-label="Previous"><span aria-hidden="true">Previous</span></a></li>'  . PHP_EOL;
  }
  for($i=1;$i<=$img_total_count;$i++) {
   if($i==$page) { echo "<li class='active'><a href='?page=".$i."'>".$i."</a></li>"  . PHP_EOL; }
   else { echo "<li><a href='?page=".$i."'>".$i."</a></li>"  . PHP_EOL; }
  }
  if($page!=$img_total_count) {
   if(!isset($page)) { echo '<li><a href="?page='.($page+2).'" aria-label="Next"><span aria-hidden="true">Next</span></a></li>'  . PHP_EOL; }
   else { echo '<li><a href="?page='.($page+1).'" aria-label="Next"><span aria-hidden="true">Next</span></a></li>'  . PHP_EOL; }
  }

echo '</ul>
      </nav>' . PHP_EOL;
  }

然后这些是我修改的行,它们将20添加到我的页码中:

$pageParameters = http_build_query(array_merge($_GET, array("page"=>2)));

  if($img_limit != $img_total) {
  echo '<nav aria-label="Page navigation">
         <ul class="pagination">'  . PHP_EOL;
  if($page>1) {
  echo '<li><a href="'.htmlspecialchars("$_SERVER[PHP_SELF]?$pageParameters").($page-1).'" aria-label="Previous"><span aria-hidden="true">Previous</span></a></li>'  . PHP_EOL;
  }
  for($i=1;$i<=$img_total_count;$i++) {
   if($i==$page) { echo "<li class='active'><a href='".htmlspecialchars("$_SERVER[PHP_SELF]?$pageParameters").$i."'>".$i."</a></li>"  . PHP_EOL; }
   else { echo "<li><a href='".htmlspecialchars("$_SERVER[PHP_SELF]?$pageParameters").$i."'>".$i."</a></li>"  . PHP_EOL; }
  }
  if($page!=$img_total_count) {
   if(!isset($page)) { echo '<li><a href="'.htmlspecialchars("$_SERVER[PHP_SELF]?$pageParameters").($page+2).'" aria-label="Next"><span aria-hidden="true">Next</span></a></li>'  . PHP_EOL; }
   else { echo '<li><a href="'.htmlspecialchars("$_SERVER[PHP_SELF]?$pageParameters").($page+1).'" aria-label="Next"><span aria-hidden="true">Next</span></a></li>'  . PHP_EOL; }
  }

echo '</ul>
      </nav>' . PHP_EOL;
  }

为什么这会为我的页码添加20?

2 个答案:

答案 0 :(得分:1)

您的代码没有将20添加到现有的页码中,您实际上是在这里进行连接,这是错误的。请查看以下代码段

... htmlspecialchars("$_SERVER[PHP_SELF]?$pageParameters").($page-1) ...
                                                          ^ see here

如果您的现有网址为http://example.com/categories.php?cat=category&page=2,则只需在上述操作后添加2,即可http://example.com/categories.php?cat=category&page=22。这适用于您使用上述操作的所有情况。所以解决方案就是更改您的分页链接部分,如下所示:

parse_str($_SERVER["QUERY_STRING"], $url_array);
unset($url_array['page']);
$pageParameters = http_build_query($url_array);

if($img_limit != $img_total) {
    echo '<nav aria-label="Page navigation"><ul class="pagination">';
    if($page>1) {
        ?>
        <li><a href="<?php echo $_SERVER['PHP_SELF'].'?page='.($page-1); echo isset($pageParameters) && !empty($pageParameters) ? "&" . $pageParameters : ""; ?>" aria-label="Previous"><span aria-hidden="true">Previous</span></a></li>
        <?php
    }
    for($i=1;$i<=$img_total_count;$i++) {
        if($i==$page) { 
            ?>
            <li class='active'><a href="<?php echo $_SERVER['PHP_SELF'].'?page='.$i; echo isset($pageParameters) && !empty($pageParameters) ? "&" . $pageParameters : ""; ?>"><?php echo $i; ?></a></li>
            <?php
        }
        else { 
            ?>
            <li><a href="<?php echo $_SERVER['PHP_SELF'].'?page='.$i; echo isset($pageParameters) && !empty($pageParameters) ? "&" . $pageParameters : ""; ?>"><?php echo $i; ?></a></li>
            <?php
        }
    }
    if($page!=$img_total_count) {
        if(!isset($page)) { 
            ?>
            <li><a href="<?php echo $_SERVER['PHP_SELF'].'?page='.($page+2); echo isset($pageParameters) && !empty($pageParameters) ? "&" . $pageParameters : ""; ?>" aria-label="Next"><span aria-hidden="true">Next</span></a></li>
            <?php
        }else { 
            ?>
            <li><a href="<?php echo $_SERVER['PHP_SELF'].'?page='.($page+1); echo isset($pageParameters) && !empty($pageParameters) ? "&" . $pageParameters : ""; ?>" aria-label="Next"><span aria-hidden="true">Next</span></a></li>
            <?php
        }
    }
    echo '</ul></nav>';
}

答案 1 :(得分:0)

看看你是如何打印链接的。

前两个来自这个数组

$pageParameters = http_build_query(array_merge($_GET, array("page"=>2)));

pageParameters已经以&page=2结尾,然后您在网址的末尾添加了任意数字,因此这些数字现在会打印&page=20&page=21等。

("$_SERVER[PHP_SELF]?$pageParameters").$i."
("$_SERVER[PHP_SELF]?$pageParameters").($page-1)
("$_SERVER[PHP_SELF]?$pageParameters").($page+1)