我有一点静态功能,以便我可以在我的本地网站上轻松构建html有效网址,它位于下方;
public static function url($path = false) {
// Build return url with special html characters escaped
return 'http://127.0.0.1/' . htmlspecialchars($path);
}
我有两个网址在一个锚点内,另一个在一个表单操作中,它们在下面;
Root::url('test?category=' . $category . '&index=' . $index) // Href
Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']) // Form
GET === $
,您可以在我的静态函数中看到我使用htmlspecialchars
从我的网址中转义特殊的html字符。
锚点返回一个有效的链接并按预期工作。然而,表单一返回以下内容,就像我单击表单提交时,我的浏览器中的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">
即使我有GET参数,它可能与服务器发送POST请求有关吗?
编辑#3
好的,所以它与我的功能或我传递的内容有关,我在表单提交中输入了硬盘并且它有效,没有问题,这意味着它只能是我的函数返回的内容。
我自己看不到自己的样子!
ANSWER
在提交表单后,我使用header
重定向到同一页面以反复重新提交表单。标题的字符串由Root::url()
生成。
这让我想出了两个小时,但男孩感觉很好!
答案 0 :(得分:1)
通常,您不会将查询字符串添加到POST URL。但这并不是禁止的,它可能只会有点混乱,特别是如果你使用$_REQUEST
(你似乎没有)。
我不知道为什么您的浏览器显示未解释的&
,它应该解释它。
您的问题可能是由于以下原因之一:
答案 1 :(得分:1)
这是非常逻辑的。
我认为您的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()
'编辑了&amp;用来分隔参数。为了不打破网址,你不想转换 THAT '&amp;'。
另外,为了清理网址,您不应该使用htmlspecialchars()
,因为大多数html实体都会转换为&amp; + somename + ; 之类的内容,例如欧元符号将转换为€
,您不希望实际的&amp;在您的网址中,当您有另一个新参数等待时,浏览器会对其进行解释。
您应该使用urlencode()
,这将转换您的&amp; into:%26,同样,函数的名称是不言自明的,它编码一个字符串用于URL。
仍然,你想要&amp;分隔参数,但不在$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
这将从表单的字段名称和值中删除特殊字符。
我注意到你将使用2个固定参数,类别和索引,所以方法可以是这样的:
function url($page, $get){
$page = urlencode($page);
$category = urlencode($get['category']);
$index = urlencode($get['index']);
echo "$page?category=$category&index=$index";
}
希望这是你需要的