0

我有一个小静态功能,这样我就可以轻松地在我的本地网站上构建 html 有效 url,它在下面;

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从我的 url 中转义特殊 html 字符的函数。

锚点返回一个有效链接并按预期工作。然而,表单一返回以下内容,当我点击表单提交时,我在浏览器中的网址如下所示。

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

好的,所以它与我的函数或我传入的内容有关,我在表单提交中硬输入了 url,它可以工作,没有问题,这意味着它只能是我的函数返回的内容。

我自己看不到我可能是什么!

回答

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

这花了我两个小时才弄清楚,但是男孩感觉很好!

4

2 回答 2

1

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

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

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

  1. 一个坏的浏览器 - 尝试另一个
  2. 表单输入字段的错误内容
  3. 其他
于 2013-10-21T12:17:04.010 回答
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()将 & 用于分隔参数。为了不破坏 url,您不想转换' &'。

还要清理你不应该使用的 url,htmlspecialchars()因为大多数 html 实体会转换为类似& + somename + ; 例如,欧元符号将转换为,&euro;并且您不希望在您的 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 

这将消除表单字段名称和值中的特殊字符。

我注意到您将使用 2 个固定参数,类别和索引,因此方法可能是这样的:

function url($page, $get){
    $page = urlencode($page);
    $category = urlencode($get['category']);
    $index = urlencode($get['index']);
    echo "$page?category=$category&index=$index";
}

希望这是你需要的

于 2013-10-21T12:52:21.473 回答