Проблема повторного параметра в ссылках на нумерацию страниц? - PullRequest
1 голос
/ 05 июня 2010

Проблема в том, что когда я загружаю страницу 2, например, URL становится:

http://domain.com/index.php?restaurant-id=45&currentpage=2

И это нормально, но когда я попадаю на страницу 3, это становится:

http://domain.com/index.php?restaurant-id=45&currentpage=2&currentpage=3

И так далее, он добавляет еще один параметр currentpage каждый раз, когда новая страница загружается из ссылок на страницы!

Интересно, как можно решить эту проблему?

Вот код функции нумерации страниц

 /******  build the pagination links ******/
// Getting current page URL with its parameters
$current_page_url = ($_SERVER["PHP_SELF"].(isset($_SERVER["QUERY_STRING"])?"?".htmlentities($_SERVER["QUERY_STRING"]):""));
// Determine which sign to use (? or &) before the (currentpage=xx) parameter
$sign = preg_match('/\?/', $current_page_url) ? '&' : '?';

$pagination_links = '';
// if not on page 1, don't show back links
if ($currentpage > 1) {
   // show << link to go back to page 1
   $pagination_links .= " <a href='{$current_page_url}{$sign}currentpage=1'>First page</a> ";
   // get previous page num
   $prevpage = $currentpage - 1;
   // show < link to go back 1 page
   $pagination_links .= " <a href='{$current_page_url}{$sign}currentpage=$prevpage'>previous</a> ";
}
else
{
    $pagination_links .= "ـ ـ"; 
}// end if 

Ответы [ 5 ]

2 голосов
/ 05 июня 2010

Вы можете использовать http_build_query () для этого. Это намного чище, чем удаление старого параметра вручную.

Должна быть возможность передать объединенный массив, состоящий из $_GET и ваши новые значения, и получить чистый URL.

Не проверено (сейчас не могу проверить), но должно работать:

$new_data = array("currentpage" => "mypage.html");
$full_data = array_merge($_GET, $new_data);  // New data will overwrite old entry
$url = http_build_query($full_data);
0 голосов
/ 09 января 2014

Хорошо, в вашем примере ваша базовая ссылка будет: http://domain.com/index.php?restaurant-id=45, если я не ошибаюсь.

Все ваши пагинационные ссылки должны выглядеть так, как показано ниже, чтобы сохранить URL в хорошем состоянии.

http://domain.com/index.php?restaurant-id=45<?php if($_GET['currentpage'] != NULL) { echo '&currentpage='.$_GET['currentpage']; } ?>
0 голосов
/ 05 июня 2010

Я бы сделал это лучше

$params = $_GET;
if(isset($params['currentpage'])) unset($params['currentpage']);
$pagination_links = '';
for($i = 1; $i <= 5; $i++){ // lets make 5 links for example
    $pagination_links.= '<a href="'.$_SERVER['PHP_SELF'].'?'.http_build_query($params+array('currentpage' => $i)).'">'.$i.'</a>';
}
0 голосов
/ 05 июня 2010

Вы можете удалить параметр currentpage из переменной $current_page_url с помощью регулярного выражения, хотя это ужасно.

$current_page_url = preg_replace('currentpage=\d+', '', $current_page_url);

Однако я бы предложил написать небольшую функцию, которая будет генерировать URL-адреса для значений, которые вы передаете ему, и тогда вы можете легко изменить любой параметр, не беспокоясь о регулярных выражениях и удаляя их из URL-адреса. Что-то вроде это должно быть хорошо.

0 голосов
/ 05 июня 2010

Вам необходимо удалить предыдущее значение из строки запроса, например ::

preg_replace('/&currentpage=\\d+/', '', $_SERVER["QUERY_STRING"]);

вместо просто $_SERVER["QUERY_STRING"].

Я предпочитаю использовать такой класс для манипулирования строкой запроса:

final class QueryString
{
    private $data;

    private function __construct($start=null) {
        if ($start === null)
            $this->data = $_GET;
        elseif (!is_array($start))
            throw new InvalidArgumentException();
    }

    public function __isset($nm) {
        return isset($this->data[$nm]);
    }

    public function __unset($nm) {
        unset($this->data[$nm]);
    }

    public function __get($nm) {
        return isset($this->data[$nm])?$this->data[$nm]:"";
    }

    public function __set($nm, $val) {
        $this->data[$nm] = $val;
    }

    public function getString() {
        return $this->getStringInternal(false);
    }

    public function getStringHTML() {
        return $this->getStringInternal(true);
    }  

    public function __toString() {
        return $this->getString();
    }

    private function getStringInternal($HTML=false) {
        if (empty($this->data))
            return "";

        $res = "?";        
        foreach ($this->data as $k => $v) {
            if (!is_array($v)) {
                if ($v === "")
                    $res .= urlencode($k).'&';
                else
                    $res .= urlencode($k)."=".urlencode($v).'&';
            }
            else
                foreach ($v as $vv) {
                    $res .= urlencode($k)."[]=".urlencode($vv).'&';
                }
        }

        $res = substr($res,0,-1);
        if ($HTML)
            $res = htmlspecialchars($res);

        return $res;
    }
}

Тогда я могу просто сделать:

$qs = new QueryString();
$qs->currentpage = 7;
$url = "list.php" . $qs;

Он сохранит все предыдущие параметры, создаст «текущую страницу», если она не существует, и изменит ее, если она существует.

Примечание: вы можете заменить цикл getStringInternal на http_build_query, если хотите. Мне не нравится поведение http_build_query, когда ключ имеет несколько значений; Я предпочитаю «a = 1 & a = 2» вместо «a [0] = 1 & a [1] = 2», а оригинал не добавил «[]» к ключу; однако PHP не очень хорошо поддерживает множественные значения без скобок в ключе (я должен вручную анализировать строку запроса), веб-сервисы Java, с которыми я иногда взаимодействую, делают).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...