【问题标题】:PHP $_POST, $_GET, and $_REQUEST keysPHP $_POST、$_GET 和 $_REQUEST 键
【发布时间】:2010-08-26 14:25:30
【问题描述】:

有没有一种情况(比如一些古怪的浏览器)表单输入字段的 id 成为 $_POST、$_GET 或 $_REQUEST 中的键,而不是字段名称?

我们遇到了 ID 与名称不匹配的字段。更改 ID 以匹配似乎可以解决问题。问题纯粹是 PHP 解析;不涉及 JS。

巧合?

Google 不会返回这样的东西...


一个函数(对不起,旧的 php4 代码)生成该字段。这是其中的一部分

echo "<select name=\"$varName";
echo "_dd\" id=\"$varName";
echo "e_dd\">\n"; 

从最后一行中删除“e”显然修复了它。我不是自己做的;这里有人告诉我它解决了这个问题。它并没有破坏每个日期字段,这似乎是一个间歇性问题。这就是为什么我立刻想到了一些奇怪的浏览器怪癖。

【问题讨论】:

  • 一些代码和示例会有用吗?您是否使用 JavaScript 提交表单?
  • @Travis 粘贴一些代码。
  • 绝对没有JS,只是一个提交按钮。有问题的字段是一个日期字段,其中包含三个名为 (field_yyyy、field_dd、field_mm) 的下拉列表。在接收端,一个 PHP 函数通过 $_POST,识别出有一个日期,以适当的格式连接它们,转义它们,并将它们输入数据库。
  • 浏览器生成POSTGET请求,PHP处理这个请求并管理$_POST$_GET数组中的POST/GET变量。您的问题不能由 PHP 引起,只有浏览器是生成请求的那个。您可以使用例如调试请求萤火虫。
  • 我想知道是否有浏览器怪癖导致它...这是在哪个浏览器中发生的(您是否尝试过多种不同的浏览器)?

标签: php post get request


【解决方案1】:

在 XHTML 1.1 strict 中,id 已替换 name 并且 name 已被弃用。

如果您的 XHTML 是使用 HTTP Content-Type application/xhtml+xml 发送的(根据标准,它必须这样做),那么按照标准的浏览器很可能 Tee 将使用 id 来填充 PHP 中的 $_POST,而不是名称。

http://www.codingforums.com/archive/index.php/t-29229.html

查看 XHTML 1.1 规范:http://www.w3.org/TR/xhtml-modularization/abstract_modules.html

名称属性只允许在 a、applet、frame、iframe 和 map 元素中使用。任何其他恰好有名字的元素,都必须有一个同名的 id。

【讨论】:

  • 你错了。 name 属性仅对 aappletformframeiframeimgmap 弃用。 (见w3.org/TR/xhtml1/#h-4.10
  • 您确实意识到您链接到了 XHTML 1.0 文档。不是 1.1...w3.org/TR/xhtml-modularization/abstract_modules.html 它说 name="" 只能用于 frame、applet、a、iframe 和 map。不是 字段。它进一步指出,在 XHTML 1.1 中,只要有一个同时具有 name 和 id 的元素:“如果为元素定义了 name 属性,则 id 属性也必须定义为相同的”。
【解决方案2】:

不,是name attribute that names the control field

控件的“控件名称”由其name 属性给出。 FORM 元素中控件的name 属性的范围是FORM 元素。

【讨论】:

  • 我认为他的意思是,出于某种原因,情况似乎不是
  • @fredley 据我所知,这种情况是不可能的,除非他有一些 javascript 弄乱了他的元素属性。但他确实说“纯 PHP”
  • 您的答案仅涵盖 HTML 4。请参阅 hopeeekr 的答案。
【解决方案3】:

干净的代码是很好的代码:)。你能验证这不起作用吗?

echo "<select name='".$varName."_dd' id='".$varName."e_dd'>\n"; 

如果也能看到生成的 html 就好了。

【讨论】:

  • echo '&lt;select name="'.$varName.'_dd" id="'.$varName.'e_dd"&gt;\n'; 更快,因为 PHP 不必“解析”双引号字符串。我觉得也更好看。
  • @JoostK:无论如何都需要解析代码。但是您的示例将按字面意思打印\n
  • 我从来没有遇到过这个错误,所以我无法真正测试它。我很清楚它不是最佳的……它可能有 10 年的历史,是由设计师编写的。它现在可以工作,但无论如何我都会清理它。谢谢!
  • 最快的方法是echo '&lt;select name="',$varName,'_dd" id="',$varName,'e_dd"&gt;',"\n"; :)
  • 确实必须解析代码,但是如果使用单引号,则不会解析字符串(如在$variables 中不会解析)。 \n 是对的,应该是 '&lt;select name="'.$varName.'_dd" id="'.$varName.'e_dd"&gt;' . PHP_EOL;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多