Могу ли я передавать переменные GET, сохраняя при этом старые переменные GET в PHP

Я использую GET для разбиения на страницы, ?page=1 — первая страница и так далее.

Проблема в том, что я хотел бы отсортировать данные, и использование GET - лучший способ сделать это, а именно:

?page=1&sort=date

Если я попробую это и щелкну страницу 2, она перейдет на ?page=2 и потеряет сортировку.

Я также пробовал $_SERVER['QUERY_STRING'], но у меня просто накапливается ?page=# в адресной строке при переходе со страницы на страницу.

Вот как генерируются мои ссылки на страницы:

<a href='{$_SERVER['PHP_SELF']}?page=$nextpage'>Next</a>

Как мне это сделать?


person joshkrz    schedule 07.06.2012    source источник
comment
Почему он теряет сортировку на других страницах? Покажите свой код, пожалуйста.   -  person Paul Dessert    schedule 08.06.2012


Ответы (13)


Вы можете сделать что-то вроде:

// Check if there are any GET parameters
if (!empty($_GET)) {
    $link = "?page=2";

    // Loop through the parameters
    foreach ($_GET as $parameter => $value) {
      // Append the parameter and its value to the new path
      $link .= "&" . $parameter . "=" . urlencode($value);
    }
}
person Community    schedule 07.06.2012
comment
Если вы собираетесь сделать это со всеми параметрами GET, вам лучше urlencode каждое значение, так как они декодируются автоматически, когда вы используете $_GET. Так как это может привести к атакам XSS, написав строку запроса, например ?x='%3E%3Cscript%3Ealert(document.cookie)%3B%3C%2Fscript%3E - person Paul; 08.06.2012
comment
@PaulP.R.O. Спасибо, что указали на это, обновив ответ - person ; 08.06.2012
comment
Если я ограничу его только сортировкой, потребуется ли кодирование? И что будет делать эта строка выше? Я мало читал о XSS. - person joshkrz; 08.06.2012
comment
Вы всегда должны кодировать значение, потому что, если вы этого не сделаете, пользователь сможет выполнить SQL-запрос (или хуже), если данные не будут должным образом очищены перед их использованием. Строка выше будет отображать содержимое файлов cookie, которые браузер сохранил для вашего сайта, но в случае изменения он может сделать AJAX-вызов на другой сайт и сохранить это содержимое, чтобы злоумышленник мог перехватить сеанс. - person ; 08.06.2012
comment
@joshkrz Да, вам все еще нужно кодировать. htmlentities — это общий способ предотвратить это. Однако в этом случае urlencode работает. Если вы повторяете любой пользовательский ввод без его кодирования, у вас есть уязвимость XSS. echo $_GET['x']; создает один. Этот сценарий просто создал окно предупреждения с файлом cookie пользователя, но можно было бы сделать гораздо хуже, например, отправить файл cookie на атакующий сервер, а затем перехватить этот сеанс пользователя. - person Paul; 08.06.2012
comment
Ах да, я только что избегал всего, что будет запрашиваться в MYSQL, с помощью mysql_real_escape_string($string); Спасибо за ваш совет, я мог узнать трудным путем. - person joshkrz; 08.06.2012

Вы можете проверить эту тему: Как я могу добавить переменные GET в конец URL-адреса текущей страницы, используя форму с php?

В основном используйте $_SERVER['REQUEST_URI'], чтобы получить текущий URL-адрес и переменные, и добавьте переменные получения в свою ссылку.

person Tim Withers    schedule 07.06.2012
comment
Используя это, я снова получаю проблему с адресной строкой: marking.php?page=2?page=3?page=3?page=3?page=3?page=3?page=3?page=3 Что я могу сделать, это проверьте, есть ли GET['sort'] и добавлен ли он к ссылкам на страницы. Будет ли это хорошей идеей или это просто небрежно? - person joshkrz; 08.06.2012

$_GET — это массив, поэтому вы можете перебирать элементы в нем, чтобы воссоздать новый URL-адрес. На странице PHP на $_GET есть много примеров, включая один, который показывает, как перебрать массив, чтобы удалить параметры GET из URL-адреса. .

person sachleen    schedule 07.06.2012

Если вы хотите добавить параметр сортировки в свой URL-адрес, если он уже установлен, вы можете сделать что-то вроде этого:

$qs_sort = isset($_GET['sort']) ? '&sort=' . urlencode($_GET['sort']) : '';

Затем измените свой <a>, который вы повторяете, чтобы добавить $qs_sort в конец URL-адреса:

<a href='{$_SERVER['PHP_SELF']}?page=$nextpage$qs_sort'>Next</a>
person Paul    schedule 07.06.2012

Вам нужно решить, сколько элементов вы будете показывать на каждой странице. Когда это известно, вы можете легко использовать переменную страницы GET, чтобы определить, какое подмножество элементов вы хотите запросить из базы данных, например. если на каждой странице отображается 10 элементов, то первая страница содержит элементы с 0 по 9, страница 2 — с 10 по 19 и т. д. Конечно, для этого требуется, чтобы ваша база данных поддерживала какой-либо способ выбора подмножества данных.

И, конечно же, если вы используете согласованный запрос из своей базы данных, он всегда будет сортироваться одинаково.

person kevin628    schedule 07.06.2012

Есть несколько вариантов:

  • Добавьте параметр сортировки к каждой из ваших ссылок на страницы.
  • Сохраните последний столбец сортировки в сеансе пользователя (обратите внимание, что это имеет недостаток, заключающийся в том, что он плохо работает, когда у пользователя открыто несколько вкладок).
  • Если вы используете ajax для разбивки на страницы, добавьте обработчики событий на номера страниц и заставьте javascript сохранить текущее поле сортировки и отправить его в запросе GET.
person netfire    schedule 07.06.2012

Здесь мало что можно сделать...

  1. При добавлении/изменении GET-параметров не забудьте дополнительно изменить все ссылки на другие страницы. Если у вас есть <a href="?page=1">, не забудьте добавить &sort=date, когда выбрана функция сортировки.

  2. Вы можете добавить параметр сортировки с помощью jQuery при нажатии на ссылку -

var _currentSortMethod = 'date';
$("a.someOtherLink").on('click',function(e){
  window.locaton.href = $(this).attr('href') + '&sort=' + _currentSortMethod;
  e.preventDefault();
});
person Lix    schedule 07.06.2012

В вашем коде, если вы управляете URL-ссылками, вам просто нужно снова передать эту переменную сортировки вашей URL-ссылке следующим образом:

<?php     $sorting = $_REQUEST['sort'];
          $page = $_REQUEST['page'];
          $page = $page + 1;
          echo '<a href="datapage.php?page=' . $page . '&sort=' . $sorting. '>Next Page</a>';
?>
person Indy-Jones    schedule 07.06.2012

Просто добавьте его обратно в URL.

<?php $sort = (isset($_GET['sort'])) ? "&sort=".$_GET['sort'] : ""; ?>

<a href="link.php?page=2<?php echo $sort; ?>">link</a>
person aynber    schedule 07.06.2012

Вытягивая ссылки для сортировки, определите текущую страницу и запишите ссылку, содержащую эту страницу. Также при прорисовке ссылок пагинатора запишите их с обнаруженной сортировкой.

Допустим, вы находитесь на странице 2 и сортируете список по заголовку по убыванию. Ваши ссылки должны выглядеть так:

  • сортировка по названию
<a href="?page=2&amp;sort=title+desc>Title</a>
  • сортировка по порядку
<a href="?page=2&amp;sort=order+desc>Order</a>
  • страница 1 страницы
<a href="?page=1&amp;sort=title+desc>1</a>
  • страница 3
<a href="?page=3&amp;sort=title+desc>3</a>

и так далее...

person shadyyx    schedule 07.06.2012

Вы можете попробовать это:

$query = new HttpQueryString();
$query->set("page", $nextPage);
echo "http://www.example.com/?" . $query->toString();

Вот дополнительная документация по классу HttpQueryString: http://www.php.net/manual/en/class.httpquerystring.php

Надеюсь, это поможет!

person Andrew Odri    schedule 07.06.2012

Крупномасштабное разбиение на страницы обычно выполняется через API базы данных. Небольшое разбиение на страницы можно выполнить с помощью сеансов PHP с использованием переменной $_SESSION.

person Jonathan M    schedule 07.06.2012

Для тех, кто хочет решение, которое сохраняет текущие параметры, обновляет, если им присваивается новое значение, и добавляет новые параметры, это делает работу:

Код

$domainurl='https://' . $_SERVER['SERVER_NAME'];
$currenturl=$domainurl . $_SERVER['PHP_SELF'];

function urlVars($new=array()) {
    $url=$GLOBALS['currenturl'];
    $vars=array_merge($_GET, $new);
    foreach ($vars as $key => $var) {
        $params[$x]='&' . $key . '=' . $var;
        $x++;
    } $str='?' . trim(implode($params), '&');
    return $url .= $str;
}

Пример использования:

 <a href="' . urlVars(array('page'=>'2', 'view'=>'30', etc.)) . '">Go To Page 2 & Show 30 Results</a>

Использование переменной $currenturl, которая возвращает только домен и путь к текущей странице, а не $_SERVER['REQUEST_URI'], которая также возвращает строку запроса, также решает проблему повторяющихся запросов и позволяет изменять ранее установленные параметры.

Это связано с тем, что array_merge() будет соединять два или более массива вместе, и если есть несколько ключей с одинаковым именем, последний объявленный получает торт, а все остальные игнорируются. А так как массив $_GET заполнен старыми параметрами, он должен стоять перед массивом $new. Пример:

$_GET['page']='1';
if ($new['page']='1') {array_merge($_GET, $new);} // 'page'=>'1'
elseif ($new['page']='4') {array_merge($_GET, $new);} // 'page'=>'4'

$_GET['page']='4';
if ($new['page']='2') {array_merge($_GET, $new);} // 'page'=>'2'

Примечание

Изящная особенность этой функции и единственная причина, по которой я возился с ней часами, пока она не стала идеальной, заключается в том, что вам не нужно указывать одни и те же параметры каждый раз, когда у вас есть новая ссылка/форма или отключается какой-либо массив в другой. скрипт, который содержит возможные ключи параметров. Все, что вы помещаете в массив $new, это параметры, которые являются новыми (очевидно) или изменяются. Это универсально!

person tst_ehbw    schedule 03.04.2017