我想将GET参数添加到可能包含但不包含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
如果您发现我试图不重复问号,如果找到了。
网址只是一个字符串。
附加特定GET参数的可靠方法是什么?
答案 0 :(得分:151)
基本方法
$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);
parse_str($url_parts['query'], $params);
$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'];
如果不是一个类,你应该把它放在一个函数中。
答案 1 :(得分:41)
这是接受答案的缩写版本:
$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';
编辑:正如在接受的答案中所讨论的那样,这是有缺陷的,因为它不会检查category
是否已经存在。更好的解决方案是将$_GET
视为数组 - 并使用in_array()
之类的函数。
答案 2 :(得分:15)
$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
答案 3 :(得分:8)
使用strpos来检测?既然?只能出现在查询字符串开头的URL中,你知道它是否已经存在params并且你需要使用&
添加paramsfunction addGetParamToUrl(&$url, $varName, $value)
{
// is there already an ?
if (strpos($url, "?"))
{
$url .= "&" . $varName . "=" . $value;
}
else
{
$url .= "?" . $varName . "=" . $value;
}
}
答案 4 :(得分:8)
此函数会覆盖现有参数
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 ) );
}
答案 5 :(得分:7)
更新现有参数的示例。
还使用了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;
}
答案 6 :(得分:4)
<?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";
答案 7 :(得分:3)
$parameters = array();
foreach ($get as $key => $value)
{
$parameters[] = $key.'='.$value;
}
$url = 'http://example.com/movies?'.implode('&', $parameters);
答案 8 :(得分:3)
我认为你应该这样做。
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;
答案 9 :(得分:2)
/**
* @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;
}
答案 10 :(得分:1)
在搜索了关于此主题的许多资源/答案后,我决定编写自己的代码。根据@ TaylorOtwell的答案,这是我处理传入的$ _GET请求并修改/操作每个元素的方法。
假设网址为: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。
然后我有表行标题,我想在第一次点击时对DESC进行排序,并在第二次点击同一标题时对ASC进行排序。 (每次第一次点击应该&#34; ORDER BY列DESC&#34;首先)如果没有排序,它将按&#34; date然后id&#34;排序。默认情况下。
您可以进一步改进它,就像您可以为每个$ _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, '&');}
(对于以http://domain.com开头的完整网址,您可以使用$ _SERVER [SCRIPT_URI])
然后我在MySQL查询中使用了上面的$ ORDER:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
现在,如果存在先前的排序,则查看URL的功能,并使用&#34;&#34;添加排序(和排序)参数到URL。或&#34;&amp;&#34;根据顺序:
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&#34;?&#34;和&#34;&amp;&#34;
答案 11 :(得分:0)
我认为这就是你要找的东西:
答案 12 :(得分:0)
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;
}
答案 13 :(得分:0)
另一个改进的功能版本。将现有答案与小改进(端口支持)和错误修正(正确检查密钥)相结合。
/**
* @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;
}
答案 14 :(得分:0)
尝试使用此功能添加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>
答案 15 :(得分:0)
如果您使用的是WordPress,则只需使用
add_query_args(['sort' => 'asc'], 'http:/example.com/?search=news')
文档https://developer.wordpress.org/reference/functions/add_query_arg/
答案 16 :(得分:0)
单线:
$url .= (strpos($url, '?') ? '&' : '?') . http_build_query($additionalParams);
建议使用 http_build_query
,因为它编码特殊字符(例如电子邮件地址中的空格或 @
)