25

嗨,任何人都可以帮我解决这个问题,我有一个类似的网址

parent/child/a=1&b=2$c=3

然后我有一个链接可以将变量添加到该 URL

<a href="<?php echo $_SERVER["REQUEST_URI"]."&d=test1";?>">LINK 1</a>
<a href="<?php echo $_SERVER["REQUEST_URI"]."&d=test2";?>">LINK 2</a>

每次我点击我的链接时,变量 d 到 URL 都会像这样继续复制

parent/child/a=1&b=2&c=3&d=test2&d=test2&d=test2&d=test1&d=test1

我知道 $_SERVER["REQUEST_URI"] 不断获取当前 URL,这就是我得到该结果的原因。我已经尝试了 $_SERVER[""] 的一些属性。我喜欢的是改变 d 变量值,知道怎么做。任何回应都非常感谢。谢谢!

4

8 回答 8

65
$query = $_GET;
// replace parameter(s)
$query['d'] = 'new_value';
// rebuild url
$query_result = http_build_query($query);
// new link
<a href="<?php echo $_SERVER['PHP_SELF']; ?>?<?php echo $query_result; ?>">Link</a>
于 2014-05-15T06:20:45.000 回答
6

试试下面的表达式,它应该工作

preg_replace("#&d=.*&#", '&d=newvalue&', $_SERVER['REQUEST_URI'])
于 2013-04-16T12:36:05.597 回答
6

要删除重复添加查询参数,请执行以下操作

// parse the url
$pathInfo = parse_url($_SERVER['REQUEST_URI']);
$queryString = $pathInfo['query'];
// convert the query parameters to an array
parse_str($queryString, $queryArray);
// add the new query parameter into the array
$queryArray['d'] = 1;
// build the new query string
$newQueryStr = http_build_query($queryArray);

// construct new url
?>
<a href="<?php echo $pathInfo['host'].'?'.$newQueryStr;?>">LINK 1</a>
于 2013-04-16T12:23:58.957 回答
6
modify_url_query($url, array('limit' => 50));

我在 url 中修改查询的功能

function modify_url_query($url, $mod){

$purl = parse_url($url);

$params = array();

if (($query_str=$purl['query']))
{
    parse_str($query_str, $params);

    foreach($params as $name => $value)
    {
        if (isset($mod[$name]))
        {
            $params[$name] = $mod[$name];
            unset($mod[$name]);
        }
    }
}        

$params = array_merge($params, $mod);

$ret = "";

if ($purl['scheme'])
{
    $ret = $purl['scheme'] . "://";
}    

if ($purl['host'])
{
    $ret .= $purl['host'];
}    

if ($purl['path'])
{
    $ret .= $purl['path'];
}    

if ($params)
{
    $ret .= '?' . http_build_query($params);
}    


if ($purl['fragment'])
{
    $ret .= "#" . $purl['fragment'];
}        

return $ret;

}
于 2017-02-27T20:27:17.327 回答
3
function replaceUrlParameters($url = '', $newParams = array()){
    if($url){
        $urlArray = parse_url($url);
        $queryString = $urlArray['query'];
        parse_str($queryString, $queryParams);
        $queryParams = array_merge($queryParams, $newParams);
        $urlArray['query'] = http_build_query($queryParams);

        if(!empty($urlArray)){
            $url = $urlArray['scheme'].'://'.$urlArray['host'].$urlArray['path'].'?'.$urlArray['query'];
        }
    }
    return $url;
}
// $newParams = array of new parameters or old parameters with new value
$replacedUrl = replaceUrlParameters($url, $newParams);

假设您有类似 :- 的 url,<?php echo $_SERVER["REQUEST_URI"]."&a=test1&b=test2";?>并且您想将参数 b 的值替换为 test3,然后只需将此 url 和具有相同索引的数组传递给新值。对于前<?$url = $_SERVER["REQUEST_URI"]."&a=test1&b=test2";?> <? $newParams = ['b' => 'test3']?>-然后你会得到-<? $_SERVER["REQUEST_URI"]."&a=test1&b=test3";?>

于 2018-01-11T14:29:06.737 回答
0

在这里你没有照顾双引号。将其替换为以下代码,然后检查。

<a href="<?php echo 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'].'&d=test1';?>">LINK 1</a>

并且还要在萤火虫中检查每次在 href 中的 URL 是什么。

于 2013-04-16T12:17:01.113 回答
0

自己还是找不到合适的解决方案,所以创建了一个..

static function changeParameters($url, $parameters)
{
    $urlParts = parse_url($url);


    $url = "";

    if (isset($urlParts['scheme'])) {
        $url .= $urlParts['scheme'] . "://";
    }

    if (isset($urlParts['host'])) {
        $url .= $urlParts['host'];
    }

    if (isset($urlParts['path'])) {
        $url .= $urlParts['path'];
    }

    $query = isset($urlParts['query']) ? $urlParts['query'] : "";

    $urlParameters = explode("&", $query);

    $urlParameterValuesByKey = new stdClass();

    foreach ($urlParameters as $urlParameter) {
        $equalsIndex = strrpos($urlParameter, "=");

        if ($equalsIndex) {
            $urlParameterValuesByKey->{substr($urlParameter, 0, $equalsIndex)} = substr($urlParameter, $equalsIndex + 1);
        } else {
            $urlParameterValuesByKey->{$urlParameter} = null;
        }
    }

    foreach ($parameters as $key => $value) {
        if(!is_string($value)) {
            unset($urlParameterValuesByKey->{$key});
        } else {
            $urlParameterValuesByKey->{$key} = $value;
        }
    }

    $query = "";

    foreach ($urlParameterValuesByKey as $key => $value) {
        if (strlen($query) === 0) {
            $query .= "?";
        }

        if (strlen($query) > 1) {
            $query .= "&";
        }
        if (is_string($value)) {
            $query .= $key . "=" . $value;
        } else {
            $query .= $key;
        }
    }


    $url .= $query;

    return $url;
}

使用 stdClass 而不是关联数组,因为关联数组在设置键之前为键做了一些时髦的事情,如此处所述

于 2019-11-30T10:51:24.247 回答
0
//for absolute path of the page. 
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
//first delete the param 
$url = str_replace('&d='.$_GET["d"], '', $actual_link); 
//Now add this param again with it new value
$newUrl=$url.'&d=NewValueHere';
echo '<a href="'.$newUrl.'">Refresh to get new param value</a>';
于 2021-01-04T17:50:49.787 回答