PHP - URL-адрес для send-script - PullRequest
       7

PHP - URL-адрес для send-script

0 голосов
/ 19 сентября 2009

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

http://example.com/news.php?type=bla&smth=bla

Есть у меня список новостей со ссылками на другие страницы. Ссылка на первую страницу:

http://example.com/news.php?type=bla&smth=bla&<b>page=1</b>

Вот скрипт, который создает ссылки на страницы:

print '<a href="?'.$_SERVER['QUERY_STRING'].'&page=1"><<</a>'; 

Но после перехода на другие страницы URL ссылки очень большой и выглядит следующим образом:

http://example.com/news.php?type=bla&smth=bla&page=1&page=2&page=1&page=3

Как я могу это изменить?

Ответы [ 5 ]

6 голосов
/ 19 сентября 2009

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

// either by merging both arrays
$query = array_merge($_GET, array('page'=>1));
// or by the union of both
$query = array('page'=>1) + $_GET;
// or by altering the array
$query = $_GET;
$query['page'] = 1;

И в PHP уже есть http_build_str, который может создать строку запроса из ассоциативного массива:

print '<a href="?' . htmlspecialchars(http_build_str($query)) . '">&lt;&lt;</a>';

Редактировать Вот альтернативное определение http_build_str:

if (!function_exists('http_build_str')) {
    function http_build_str($query, $prefix='', $arg_separator='') {
        if (!is_array($query)) {
            return null;
        }
        if ($arg_separator == '') {
            $arg_separator = ini_get('arg_separator.output');
        }
        $args = array();
        foreach ($query as $key => $val) {
            $name = $prefix.$key;
            if (!is_numeric($name)) {
                $args[] = rawurlencode($name).'='.urlencode($val);
            }
        }
        return implode($arg_separator, $args);
    }
}
1 голос
/ 30 ноября 2010

Альтернативный http_build_str не обрабатывает внутренние массивы, Поэтому я предлагаю следующее:

function http_build_str_inner($query, $prefix, $arg_separator,&$args) {
    if (!is_array($query)) {
        return null;
    }
    foreach ($query as $key => $val) {
        $name = $prefix."[".$key."]";
        if (!is_numeric($name)) {
            if(is_array($val)){
                http_build_str_inner($val,$name,$arg_separator,$args);
            }else{
                $args[] = rawurlencode($name).'='.urlencode($val);
            }
        }
    }   
}

function http_build_str($query, $prefix='', $arg_separator='') {
    if (!is_array($query)) {
        return null;
    }
    if ($arg_separator == '') {
        $arg_separator = ini_get('arg_separator.output');
    }
    $args = array();
    foreach ($query as $key => $val) {
        $name = $prefix.$key;
        if (!is_numeric($name)) {
            if(is_array($val)){
                http_build_str_inner($val,$name,$arg_separator,$args);
            }else{
                $args[] = rawurlencode($name).'='.urlencode($val);
            }
        }
    }
    return implode($arg_separator, $args);
}

Наслаждайтесь ...

1 голос
/ 19 сентября 2009

Самое простое сделать следующее:

$params = $_GET;     // make a copy of the querystring params
$params['page'] = 1; // will replace any existing 'page' parameter
echo '<a href="?'.http_build_query($params)'">Page 1</a>';
0 голосов
/ 19 сентября 2009

Вы также можете просто использовать

print '<a href="http://'. $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'].'?page=1"><<</a>';

при этом каждый раз генерируется абсолютный URL.

0 голосов
/ 19 сентября 2009

Каждый раз, когда вы запускаете этот скрипт, параметр страницы будет добавляться к строке запроса. Например, когда вы попадете на первую страницу, строка запроса будет выглядеть так:

http://site.com/news.php?type=bla&smth=bla

и при переходе на страницу к строке запроса будет

http://site.com/news.php?type=bla&smth=bla&page=1

и т. Д. Для каждой страницы, на которую вы переходите.

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

Так что-то вроде:

<?php

$parameters = array(
  'type' => 'bla',
  'smth' => 'bla',
  'page' => 1,  // Of course, logic up front to change the value of this
);

print print '<a href="?' . format_url_parameters($parameters) .'>Link</a>';

// format_url_parameters producing a valid query string here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...