我有一个小的静态功能,以便我可以轻松地在我的本地网站上建立html有效的网址,它在下面;
public static function url($path = false) {
// Build return url with special html characters escaped
return 'http://127.0.0.1/' . htmlspecialchars($path);
}我有两个urls,一个在锚内,另一个在表单动作中,它们在下面;
Root::url('test?category=' . $category . '&index=' . $index) // Href
Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']) // FormGET === $,您可以在我的静态函数中看到,我使用htmlspecialchars从url中转义特殊的html字符。
锚一个返回一个有效的链接,并按预期工作。但是,表单1返回以下内容,如单击表单提交时,浏览器中的url如下所示。
http://127.0.0.1/test?category=innate&index=0为什么会这样呢?我的网站崩溃是因为它依赖于GET参数是有效的。
谢谢你的时间,希望这是有意义的。
编辑
我将函数调用的返回值直接插入到表单操作中,
<form
action="<?= Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']); ?>"
method="post">编辑
表格html如下;
<form action="http://example.com/test?category=innate&index=0" method="post">锚html如下所示
<a href="http://example.com/test?category=innate&index=0">这是否与发送POST请求的服务器有关,即使我获得了参数?
编辑#3
好的,这与我的函数或传递的内容有关,我在表单submit中硬输入url,没有问题,这意味着它只能是我的函数返回的内容。
我自己看不出我是什么样子!
答案
表单提交后,我将使用header重定向到同一个页面,以防止表单重新提交。头的字符串是由Root::url()生成的。
我花了两个小时才弄明白,但是男孩,感觉很好!
发布于 2013-10-21 12:17:04
通常,您不会向POST URL添加查询字符串。这并不是禁止的,但它可能只是有点混乱,特别是如果您使用$_REQUEST (似乎您不使用)。
我不知道为什么您的浏览器显示一个未解释的&,它应该解释它。
你的问题很可能是由于以下其中之一:
发布于 2013-10-21 12:52:21
这是相当合乎逻辑的。
我假设您的url()方法如下所示:
url($string){
echo htmlspecialchars($string);
}让我们看看您正在传递的$string:
'test?category=' . $_GET['category'] . '&index=' . $_GET['index'];正如我在输出中看到的,替换这些值时,发生htmlspecialchars()之前的最后一个字符串是:
'test?category=innate&index=0'及其之后:test?category=innate&index=0
这里发生何事?您首先将字符串连接起来,然后htmlspecialchars()对用于分隔参数的&进行了编辑,并且为了不破坏url,您不希望将转换为 '&‘。
另外,为了净化url,您不应该使用htmlspecialchars(),因为大多数html实体都会转换为& + somename + ;,例如,欧元符号将转换为€,并且您不希望url中有实际的&符号,浏览器将解释它,因为您正在等待另一个新的参数。
您应该使用urlencode(),这将将您的&转换为:%26,而且,函数的名称是不言自明的,它正在编码一个字符串以便在URL上使用。
但是,您希望&分隔参数,但不希望在$GET值中。我们该怎么办?若要在连接字符串之前对值进行urlencode,请执行以下操作。我建议一种类似这样的方法:
function url($page, $get){
$parameters = array();
foreach($get as $k => $v) $parameters[] = urlencode($k)."=".urlencode($v);
//We are concatenating with ? and & the urlencoded() values in the next line:
echo urlencode($page).'?'.implode('&', $parameters);
}
url('test', $_GET); // outputs: test?category=innate&index=0 这将消除表单的字段名和值中的特殊字符。
我注意到您将使用两个固定的参数,类别和索引,因此该方法可以如下所示:
function url($page, $get){
$page = urlencode($page);
$category = urlencode($get['category']);
$index = urlencode($get['index']);
echo "$page?category=$category&index=$index";
}希望这是你所需要的
https://stackoverflow.com/questions/19493606
复制相似问题