表格中的htmlspecialchars和&符号?

时间:2013-10-21 11:42:59

标签: php forms url html-entities

我有一点静态功能,以便我可以在我的本地网站上轻松构建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&amp;index=0" method="post">

主播html如下

<a href="http://example.com/test?category=innate&amp;index=0">

即使我有GET参数,它可能与服务器发送POST请求有关吗?

编辑#3

好的,所以它与我的功能或我传递的内容有关,我在表单提交中输入了硬盘并且它有效,没有问题,这意味着它只能是我的函数返回的内容。

我自己看不到自己的样子!

ANSWER

在提交表单后,我使用header重定向到同一页面以反复重新提交表单。标题的字符串由Root::url()生成。

这让我想出了两个小时,但男孩感觉很好!

2 个答案:

答案 0 :(得分:1)

通常,您不会将查询字符串添加到POST URL。但这并不是禁止的,它可能只会有点混乱,特别是如果你使用$_REQUEST(你似乎没有)。

我不知道为什么您的浏览器显示未解释的&amp;,它应该解释它。

您的问题可能是由于以下原因之一:

  1. 糟糕的浏览器 - 尝试另一个
  2. 表单输入字段的错误内容
  3. 其他

答案 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&amp;index=0


这里发生了什么?你首先连接了字符串,然后htmlspecialchars()'编辑了&amp;用来分隔参数。为了不打破网址,你不想转换 THAT '&amp;'。

另外,为了清理网址,您不应该使用htmlspecialchars(),因为大多数html实体都会转换为&amp; + somename + ; 之类的内容,例如欧元符号将转换为&euro;,您不希望实际的&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";
}

希望这是你需要的