使用&在URL中错误$ _GET

时间:2011-06-12 14:45:45

标签: php url

通过http://validator.w3.org/check运行我的网站,收到大量错误消息,指出我的链接应使用&而不是&

所以我更新了我的代码,但却发现$_GET不喜欢这个。

我的网址是:www.mysite.com/?foo=1&bar=2
我将其更改为:www.mysite.com/?foo=1&bar=2

问题是做print_r($_REQUEST)会给我这个结果:

Array ( [foo] => 1 [amp;storeid] => 2 ) 

为什么$_GET$_POST$_REQUEST无法识别&

更新
这是我生成URL的方法之一:

$url = get_bloginfo('url')."/?foo=".$element['name']."&bar=".$element['id'];
$link = '<a href="'.$url.'" title="'.$element['name'].'">'.$element['name'].'</a>';

4 个答案:

答案 0 :(得分:20)

&amp;&的HTML实体参考。网址参数仍由单个&分隔,但如果您在HTML中提及网址,则需要对其进行编码。对于

<img src="img?width=100&amp;height=100" />
然后,浏览器会请求img?width=100&height=100

答案 1 :(得分:4)

您必须在某处进行双重编码,例如您的链接:

www.mysite.com/?foo=1&bar=2

变为:

www.mysite.com/?foo=1&amp;bar=2

然后:

www.mysite.com/?foo=1&amp;amp;bar=2

你读到的是正确的。为了澄清,HTML中的 &必须编码为&amp;。当然,URL本身仍然只包含&; PHP永远不会看到“&amp;”,因为该编码是为了您的浏览器的利益。

答案 2 :(得分:1)

// Fix for &amp; bug in url
if( $_GET ) foreach( $_GET as $key => $value )
{
    if( strpos( $key, 'amp;' ) === 0 )
    {
        $new_key = str_replace( 'amp;', '', $key );
        $_GET[ $new_key ] = $value;
        unset( $_GET[ $key ] );
    }
}

它不适用于filter_input:(

答案 3 :(得分:0)

在任何情况下,手动编码各种URL部分都不是一个好习惯。你应该这样做:

$query_string = 'foo=' . urlencode($element['name']) . '&bar=' . urlencode($element['id']);
echo '<a href="mycgi?' . htmlspecialchars($query_string) . '">';

我认为这将解决不必要的问题。