Я хочу добавить параметры GET к URL-адресам, которые могут содержать или не содержать параметры GET без повторения ?
или &
.
Пример:
Если я хочу добавить category=action
$url="http://www.acme.com";
// will add ?category=action at the end
$url="http://www.acme.com/movies?sort=popular";
// will add &category=action at the end
Если вы заметили, я стараюсь не повторять вопросительный знак, если он найден.
URL-адрес - это просто строка.
Каков надежный способ добавить определенный параметр GET?
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Но вам нужноpecl install pecl_http
или установить jakeasmith / http_build_url через composer.Ответы:
Основной метод
$query = parse_url($url, PHP_URL_QUERY); // Returns a string if the URL has parameters or NULL if not if ($query) { $url .= '&category=1'; } else { $url .= '?category=1'; }
Более продвинутый
$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great'; $url_parts = parse_url($url); // If URL doesn't have a query string. if (isset($url_parts['query'])) { // Avoid 'Undefined index: query' parse_str($url_parts['query'], $params); } else { $params = array(); } $params['category'] = 2; // Overwrite if exists $params['tags'][] = 'cool'; // Allows multiple values // Note that this will url_encode all values $url_parts['query'] = http_build_query($params); // If you have pecl_http echo http_build_url($url_parts); // If not echo $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query'];
Вы должны поместить это хотя бы в функцию, если не в класс.
источник
?logout
можно проверить с помощьюisset($_GET["logout"])
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Но вам нужноpecl install pecl_http
или установить jakeasmith / http_build_url через composer.Вот сокращенная версия принятого ответа:
$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';
Изменить: как обсуждалось в принятом ответе, это недостаток в том, что он не проверяет,
category
существует ли уже. Лучшим решением было бы рассматривать$_GET
объект как массив и использовать такие функции, какin_array()
.источник
.
перед=
.$url
есть ли уже параметры. Отредактировано.#
.$data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext processor'); $queryString = http_build_query($data); //$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor echo 'http://domain.com?'.$queryString; //output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor
источник
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Но вам нужноpecl install pecl_http
или установить jakeasmith / http_build_url через composer.Используйте strpos для обнаружения?. Поскольку ? может появляться только в URL-адресе в начале строки запроса, вы знаете, существуют ли уже существующие параметры, и вам нужно добавить параметры с помощью &
function addGetParamToUrl(&$url, $varName, $value) { // is there already an ? if (strpos($url, "?")) { $url .= "&" . $varName . "=" . $value; } else { $url .= "?" . $varName . "=" . $value; } }
источник
Эта функция перезаписывает существующий аргумент
function addToURL( $key, $value, $url) { $info = parse_url( $url ); parse_str( $info['query'], $query ); return $info['scheme'] . '://' . $info['host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) ); }
источник
$info['query']
набора? Вы не учли этого.Пример с обновлением существующих параметров.
Также используется url_encode и возможность не указывать значение параметра
<? /** * Add parameter to URL * @param string $url * @param string $key * @param string $value * @return string result URL */ function addToUrl($url, $key, $value = null) { $query = parse_url($url, PHP_URL_QUERY); if ($query) { parse_str($query, $queryParams); $queryParams[$key] = $value; $url = str_replace("?$query", '?' . http_build_query($queryParams), $url); } else { $url .= '?' . urlencode($key) . '=' . urlencode($value); } return $url; }
источник
<?php $url1 = '/test?a=4&b=3'; $url2 = 'www.baidu.com/test?a=4&b=3&try_count=1'; $url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2'; $url4 = '/test'; function add_or_update_params($url,$key,$value){ $a = parse_url($url); $query = $a['query'] ? $a['query'] : ''; parse_str($query,$params); $params[$key] = $value; $query = http_build_query($params); $result = ''; if($a['scheme']){ $result .= $a['scheme'] . ':'; } if($a['host']){ $result .= '//' . $a['host']; } if($a['path']){ $result .= $a['path']; } if($query){ $result .= '?' . $query; } return $result; } echo add_or_update_params($url1,'try_count',1); echo "\n"; echo add_or_update_params($url2,'try_count',2); echo "\n"; echo add_or_update_params($url3,'try_count',3); echo "\n"; echo add_or_update_params($url4,'try_count',4); echo "\n";
источник
$query = $a['query'] ? $a['query'] : '';
на$query = isset($a['query']) ? $a['query'] : '';
/** * @example addParamToUrl('/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS')) * @example addParamToUrl('//example.com/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS')) * @example addParamToUrl('https://example.com/path/to/?find=1&FILTER=Y', array('find' => array('search', 2), 'FILTER' => 'STATUS')) * * @param $url string url * @param array $addParams * * @return string */ function addParamToUrl($url, array $addParams) { if (!is_array($addParams)) { return $url; } $info = parse_url($url); $query = array(); if ($info['query']) { parse_str($info['query'], $query); } if (!is_array($query)) { $query = array(); } $params = array_merge($query, $addParams); $result = ''; if ($info['scheme']) { $result .= $info['scheme'] . ':'; } if ($info['host']) { $result .= '//' . $info['host']; } if ($info['path']) { $result .= $info['path']; } if ($params) { $result .= '?' . http_build_query($params); } return $result; }
источник
$parameters = array(); foreach ($get as $key => $value) { $parameters[] = $key.'='.$value; } $url = 'http://example.com/movies?'.implode('&', $parameters);
источник
Я думаю, тебе стоит сделать это примерно так.
class myURL { protected $baseURL, $requestParameters; public function __construct ($newURL) { $this->baseurl = $newURL; $this->requestParameters = array(); } public function addParameter ($parameter) { $this->requestParameters[] = $parameter; } public function __toString () { return $this->baseurl. ( count($this->requestParameters) ? '?'.implode('&', $this->requestParameters) : '' ); } } $url1 = new myURL ('http://www.acme.com'); $url2 = new myURL ('http://www.acme.com'); $url2->addParameter('sort=popular'); $url2->addParameter('category=action'); $url1->addParameter('category=action'); echo $url1."\n".$url2;
источник
После поиска множества ресурсов / ответов по этой теме я решил написать свой собственный код. Основываясь на ответе @ TaylorOtwell здесь, вот как я обрабатываю входящий запрос $ _GET и изменяю / манипулирую каждым элементом.
Предполагая, что URL-адрес: http://domain.com/category/page.php?a=b&x=y И мне нужен только один параметр для сортировки: либо? Desc = column_name, либо? Asc = column_name. Таким образом, для одновременной сортировки и сортировки достаточно одного параметра url. Таким образом, URL-адрес будет http://domain.com/category/page.php?a=b&x=y&desc=column_name при первом щелчке по строке заголовка связанной таблицы.
Затем у меня есть заголовки строк таблицы, которые я хочу отсортировать по убыванию при первом щелчке мыши и ASC при втором щелчке того же заголовка. (При каждом первом щелчке сначала следует «ORDER BY column DESC»). И если сортировка отсутствует, по умолчанию выполняется сортировка по «дате, затем идентификатору».
Вы можете улучшить его дальше, например, вы можете добавить функции очистки / фильтрации к каждому компоненту $ _GET, но нижеследующая структура закладывает основу.
foreach ($_GET AS $KEY => $VALUE){ if ($KEY == 'desc'){ $SORT = $VALUE; $ORDER = "ORDER BY $VALUE DESC"; $URL_ORDER = $URL_ORDER . "&asc=$VALUE"; } elseif ($KEY == 'asc'){ $SORT = $VALUE; $ORDER = "ORDER BY $VALUE ASC"; $URL_ORDER = $URL_ORDER . "&desc=$VALUE"; } else { $URL_ORDER .= "&$KEY=$VALUE"; $URL .= "&$KEY=$VALUE"; } } if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';} if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');} if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}
(Вы можете использовать $ _SERVER [SCRIPT_URI] для полного URL, начинающегося с http://domain.com )
Затем я использую полученный $ ORDER, полученный выше, в запросе MySQL:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Теперь функция просмотра URL-адреса, если есть предыдущая сортировка, и добавление параметра сортировки (и упорядочивания) к URL-адресу с помощью "?" или «&» в порядке:
function sort_order ($_SORT){ global $SORT, $URL_ORDER, $URL; if ($SORT == $_SORT){ return $URL_ORDER; } else { if (strpos($URL, '?') !== false){ return "$URL&desc=$_SORT"; } else { return "$URL?desc=$_SORT"; } } }
Наконец, заголовок строки таблицы для использования функции:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Резюме: это прочитает URL-адрес, изменит каждый из компонентов $ _GET и сделает конечный URL-адрес с параметрами по вашему выбору с правильной формой использования "?" а также "&"
источник
public function addGetParamToUrl($url, $params) { foreach ($params as $param) { if (strpos($url, "?")) { $url .= "&" .http_build_query($param); } else { $url .= "?" .http_build_query($param); } } return $url; }
источник
еще одна улучшенная версия функции. Сочетание существующих ответов с небольшими улучшениями (поддержка порта) и исправлениями (правильная проверка ключей).
/** * @param string $url original url to modify - can be relative, partial etc * @param array $paramsOverride associative array, can be empty * @return string modified url */ protected function overrideUrlQueryParams($url, $paramsOverride){ if (!is_array($paramsOverride)){ return $url; } $url_parts = parse_url($url); if (isset($url_parts['query'])) { parse_str($url_parts['query'], $params); } else { $params = []; } $params = array_merge($params, $paramsOverride); $res = ''; if(isset($url_parts['scheme'])) { $res .= $url_parts['scheme'] . ':'; } if(isset($url_parts['host'])) { $res .= '//' . $url_parts['host']; } if(isset($url_parts['port'])) { $res .= ':' . $url_parts['port']; } if (isset($url_parts['path'])) { $res .= $url_parts['path']; } if (count($params) > 0) { $res .= '?' . http_build_query($params); } return $res; }
источник
Попробуйте эту функцию, чтобы добавить параметры URL .
Затем вы можете отключить ссылку, когда параметр установлен, чтобы не было дублирования параметра url.
<?php function addQueryString($a) { if (empty($_SERVER['QUERY_STRING'])) return '?' . $a; else if (!empty($_SERVER['QUERY_STRING'])) return '?' . $_SERVER['QUERY_STRING'] . '&' . $a; } ?> <a href="<?php echo addQueryString('lang=en'); ?>">test</a> <a href="<?php echo addQueryString('category=5'); ?>">sat</a>
источник
Если вы используете WordPress, вы можете просто использовать
add_query_args(['sort' => 'asc'], 'http:/example.com/?search=news')
Документы https://developer.wordpress.org/reference/functions/add_query_arg/
источник