Каков наилучший способ управления QUERY_STRING в php?
-
03-07-2019 - |
Вопрос
Один из моих сайтов имеет несколько очень сложных функций сортировки поверх разбивки на страницы, и различные переменные в сумме образуют довольно сложный URL-адрес, управлять которым очень сложно.Есть ли способ эффективно управлять QUERY_STRING?
Под этим я подразумеваю...если URL-адрес index.php?catid=3&sort=date &year= 2009&page = 2, и я хочу, чтобы пользователь перешел на страницу 3 или изменил метод сортировки.....как бы мне сохранить оставшиеся переменные, не проверяя каждую отдельную переменную с условием if / else, и отобразить их в ссылке, которая будет ссылаться на страницу 3 или альтернативный метод сортировки.
Решение
Для обработки фактического запроса строки (формат строки) вы можете использовать parse_str ( ) код>
. Если вы хотите создать строку запроса, используйте http_build_query ()
.
На этих страницах документации немало примеров.
Если по какой-то причине вы не можете использовать http_build_query
, проверьте мой вопрос о самый быстрый способ взорвать ассоциативный массив .
<?php
$QueryString = 'catid=3&sort=date&year=2009&page=2'; // sample querystring
parse_str($QueryString, $HttpQuery);
print_r($HttpQuery); // will be an associative array
$HttpQuery['page'] = 3; // change any values
$NewQueryString = http_build_query($HttpQuery); // rebuild the querystring
Другие советы
PHP предоставляет вам глобальный $_GET, который содержит всю строку вашего запроса, разбитую на элементы
$_GET['catid'] will be '3'
$_GET['sort'] will be 'date'
$_GET['year'] will be '2009'
и т.д.
Вы могли бы отменить те, которые вы не хотите передавать, а затем перейти на новый URL-адрес с помощью чего-то вроде:
$get = array_intersect_key($_GET, array_keys($_GET));
unset($get['sort']);
$url = 'target.php?' . http_build_query($get);
Если вы хотите сказать, что ссылка на страницу 3 будет только
index.php?page=3
или ссылка на изменение метода сортировки будет только
index.php?sort=date
Вы должны будете хранить другие переменные в переменных сеанса (или куки, если вы хотите, чтобы они сохранялись дольше).
Примерно так:
<?php
session_start();
foreach( Если вы хотите сказать, что ссылка на страницу 3 будет только
index.php?page=3
или ссылка на изменение метода сортировки будет только
index.php?sort=date
Вы должны будете хранить другие переменные в переменных сеанса (или куки, если вы хотите, чтобы они сохранялись дольше).
Примерно так:
<*>GET as $var => $val) {
// filter any malicious stuff and invalid variables out of $var and $val here
// like
if (in_array($var, $array_of_valid_variable_names)) {
if ($var == 'page') $val = intval($val);
Если вы хотите сказать, что ссылка на страницу 3 будет только
index.php?page=3
или ссылка на изменение метода сортировки будет только
index.php?sort=date
Вы должны будете хранить другие переменные в переменных сеанса (или куки, если вы хотите, чтобы они сохранялись дольше).
Примерно так:
<*>SESSION[$var] = $val;
}
}
// do stuff based on the values stored in Если вы хотите сказать, что ссылка на страницу 3 будет только
index.php?page=3
или ссылка на изменение метода сортировки будет только
index.php?sort=date
Вы должны будете хранить другие переменные в переменных сеанса (или куки, если вы хотите, чтобы они сохранялись дольше).
Примерно так:
<*>SESSION
echo '<a href="index.php?page='.( Если вы хотите сказать, что ссылка на страницу 3 будет только
index.php?page=3
или ссылка на изменение метода сортировки будет только
index.php?sort=date
Вы должны будете хранить другие переменные в переменных сеанса (или куки, если вы хотите, чтобы они сохранялись дольше).
Примерно так:
<*>SESSION['page'] + 1).'">Next page</a>';
?>
Хотя большинство решений, представленных здесь, будут работать, я думаю, что самый простой способ сделать это будет
// parse query string into an array
$queryData = array();
parse_str( Хотя большинство решений, представленных здесь, будут работать, я думаю, что самый простой способ сделать это будет
<*>
Вот и все. Пожалуйста, смотрите документацию по http_build_query ()
и parse_str ()
(это одна из тех функций, чье имя было полностью запутано - никто не ожидал, что функция сделает то, что делает, просто посмотрев на имя).
SERVER['QUERY_STRING'], $queryData);
/*
* ... manipulate array $queryData
*/
// rebuild query string
$queryString = http_build_query($queryData, null, '&'); // or use & if you don't need XHTML compliance
Вот и все. Пожалуйста, смотрите документацию по http_build_query ()
и parse_str ()
(это одна из тех функций, чье имя было полностью запутано - никто не ожидал, что функция сделает то, что делает, просто посмотрев на имя).
У меня была точно такая же проблема с обычным " построить мне сортируемую таблицу с возможностью просмотра страниц " учебный класс. Вот почему кто-то изобрел подпроцедуры под названием «функции» в php.
Вы должны создать функцию, которая будет обрабатывать именно процесс создания ссылок. вот так:
/**
* $set: associative array of changing vars
* $unset : normal array of vars to delete
**/
function get_link($set,$unset=array())
{
$set+= У меня была точно такая же проблема с обычным " построить мне сортируемую таблицу с возможностью просмотра страниц " учебный класс. Вот почему кто-то изобрел подпроцедуры под названием «функции» в php.
Вы должны создать функцию, которая будет обрабатывать именно процесс создания ссылок. вот так:
<*>
НЕПРОВЕРЕННЫЙ КОД! Используйте свой мозг
или вы можете использовать $ _SESSION-vars для разбивки на страницы и сортировки (и т. п.) и иметь ссылки, изменяющие только те (что я в основном и делаю в настоящее время)
GET;
if ($unset && is_array($unset))
foreach($unset as $idx)
unset($set[$idx]);
if ($set)
foreach($set as $name=>$value)
$pairs[]=$name.'='.urlencode($value);
return У меня была точно такая же проблема с обычным " построить мне сортируемую таблицу с возможностью просмотра страниц " учебный класс. Вот почему кто-то изобрел подпроцедуры под названием «функции» в php.
Вы должны создать функцию, которая будет обрабатывать именно процесс создания ссылок. вот так:
<*>
НЕПРОВЕРЕННЫЙ КОД! Используйте свой мозг
или вы можете использовать $ _SESSION-vars для разбивки на страницы и сортировки (и т. п.) и иметь ссылки, изменяющие только те (что я в основном и делаю в настоящее время)
SERVER['SCRIPT_NAME']."?".join('&',$pairs);
}
НЕПРОВЕРЕННЫЙ КОД! Используйте свой мозг
или вы можете использовать $ _SESSION-vars для разбивки на страницы и сортировки (и т. п.) и иметь ссылки, изменяющие только те (что я в основном и делаю в настоящее время)
Добавьте имя и значение переменной в конце строки запроса (изменив страницу на 3):
index.php?catid=3&sort=date&year=2009&page=2&x=page&y=3
Затем, после извлечения $ _GET, используйте простую функцию, чтобы проверить, установлены ли x и y.
Если это так, задайте для переменной, имя которой содержится в x, значение y.
Вы можете использовать одну и ту же ссылку везде с простым добавлением в конце, и объем программирования минимален.
Не управляйте строкой напрямую, а управляйте ее представлением в виде массива (ключ =>) и переводите ее обратно в строку только при необходимости.
Один из возможных способов сделать это:
function explodeQueryString( $queryString )
{
$parts = array();
if ( strlen( $queryString ) > 1 && substr( $queryString, 0, 1 ) == '?' )
{
$q = explode( '&', substr( $queryString, 1 ) );
foreach( $q as $part )
{
list( $key, $value ) = explode( '=', $part );
$parts[ urldecode( $key ) ] = urldecode( $value );
}
}
return $parts;
}
function implodeQueryString( array $arguments )
{
$parts = array();
foreach( $arguments as $key => $value )
{
$parts[ ] = sprintf( '%s=%s', urlencode( $key ), urlencode( $value ) );
}
return sprintf( '?%s', implode( '&', $parts ) );
}
// $query = Не управляйте строкой напрямую, а управляйте ее представлением в виде массива (ключ =>) и переводите ее обратно в строку только при необходимости.
Один из возможных способов сделать это:
<*>GET;
$query = '?something=1&somethingelse=2&page=1&yetsomethingelse=3';
$q = explodeQueryString( $query );
print_r( $q );
$q[ 'page' ] += 1;
$query = implodeQueryString( $q );
echo $query;