2009-03-04 2 views
2

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

Под этим я имею в виду ... если URL является index.php? CatID = 3 & рода = дата & года = 2009 & страницы = 2 и я хочу иметь пользовательский переход на страницу 3, или изменить вид метод ..... как бы сохранить оставшиеся вары, не проверяя для каждого отдельного var условие if/else и вывести его в ссылку, которая будет ссылаться на страницу 3 или альтернативный метод сортировки.

ответ

2

Чтобы обработать фактический запрос строки (формат строки), вы можете использовать parse_str(). Когда вы хотите построить строку запроса, используйте http_build_query().

На этих страницах документации имеется немало примеров.

Если по какой-либо причине вы не можете использовать http_build_query, ознакомьтесь с моим вопросом о fastest way to implode an associative array.

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

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); 
+0

Это действительно классный трюк, чтобы удалить переменную $ _GET. –

+0

-1, что implode не сохранит ключи, он только объединяет значения вместе. – matpie

+0

Что должно делать $ _GET.slice()? Это не PHP, поскольку $ _GET является массивом и поэтому не имеет методов для вызова. –

1

Если вы имеете в виду, что вы хотели бы, чтобы ссылка на страницу 3 будет только

index.php?page=3 

или ссылку на изменение способа сортировки будет только

index.php?sort=date 

Вы должны хранить другие переменные в session variables (или печенье, если вы хотите, чтобы они сохраняются дольше).

Что-то вроде этого:

<?php 

    session_start(); 

    foreach($_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); 

     $_SESSION[$var] = $val; 
    } 
    } 

    // do stuff based on the values stored in $_SESSION 

    echo '<a href="index.php?page='.($_SESSION['page'] + 1).'">Next page</a>'; 
?> 
-1

Не удается строку непосредственно, но управлять массив (ключ => значение) представление о нем и только перевести его обратно в строку, когда это необходимо.

Один из возможных способов сделать это:

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; 
+0

Я знаю, что есть $ _GET, но это только для текущего запроса. иногда вам нужно разбирать произвольные количества запросов. – Kris

+0

Это именно то, что parse_str() и http_build_query() делают изначально. – matpie

0

Я имел точно такие же проблему с общим «построить мне сортируемый, выгружаемая таблицу» класс. Вот почему кто-то изобрел подпроцедуры, называемые «функциями» в php.

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

/** 
* $set: associative array of changing vars 
* $unset : normal array of vars to delete 
**/ 
function get_link($set,$unset=array()) 
{ 
$set+=$_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 $_SERVER['SCRIPT_NAME']."?".join('&',$pairs); 
} 

UNTESTED CODE! Используйте ваши мозги

или вы можете использовать $ _SESSION-ВАР для pageing и сортировок (Ани вещей) и иметь ссылки только изменить те (что я в основном делаю в настоящее время)

0

Добавьте имя переменной и значение в конце строки запроса (изменение страницы до 3):

index.php?catid=3&sort=date&year=2009&page=2&x=page&y=3 

Затем, после извлечения $ _GET, используйте простую функцию, чтобы проверить, если х и y заданы.

Если они есть, задайте переменную, имя которой содержится в x для значения y.

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

+0

Интересное решение, но оно делает вещи слишком сложными и вызывает создание дублирующих страниц, что не очень полезно для SEO. – matpie

1

Хотя большинство решений, предлагаемых здесь будет работать, я думаю, что самый простой способ сделать это будет

// parse query string into an array 
$queryData = array(); 
parse_str($_SERVER['QUERY_STRING'], $queryData); 
/* 
* ... manipulate array $queryData 
*/ 
// rebuild query string 
$queryString = http_build_query($queryData, null, '&amp;'); // or use & if you don't need XHTML compliance 

Вот так. Пожалуйста, см. Документацию по http_build_query() и parse_str() (это одна из тех функций, чье имя было перепутано - никто не ожидал, что функция будет делать то, что она делает, просто глядя на имя).

Смежные вопросы