【问题标题】:PHP: isset() doesn't detect GET variablePHP:isset() 没有检测到 GET 变量
【发布时间】:2014-06-03 22:41:14
【问题描述】:

我有一个 html 表单(method = "get", action = "cart.php"),我在其中使用两个按钮发送相同的表单。

echo '<input type="image" src="data/images/back.png" height="40px" id="back" name="back">';
echo '<input type="image" src="data/images/continue.png" height="40px" id="go" name="go">';

现在,在 PHP 端,我想检查单击了哪个按钮(“开始”按钮或“返回”按钮)。

我已经完成了:

if(isset($_GET['go.x']) == true)
{
   echo 'form submitted using button GO';
}
else
{
   echo 'form submitted using button BACK';
}

我使用“go.x”变量名,因为表单传递“go.x”和“go.y”变量(用户单击的图像按钮内的确切 x、y 位置)

然而,isset() 函数总是返回 false……怎么可能呢? 谢谢

【问题讨论】:

  • 当你print_r($_GET);时会发生什么?
  • x 和 y 是单独的 GET 值,只需使用 'go'。
  • 天哪...我自己解决了...我做了 isset($_GET[back_x] == true) 并且它工作了
  • @Chirs:这行不通。已经试过了。不过我解决了

标签: javascript php html forms web


【解决方案1】:

来自the manual

因为 foo.x 和 foo.y 会在 PHP 中生成无效的变量名,所以它们 自动转换为 foo_x 和 foo_y。也就是说,时期 替换为下划线。因此,您可以访问这些变量,例如 检索变量部分中描述的任何其他内容 外部来源。例如,$_GET['foo_x']。

有一个open issue raised against this replacement of periods with underscores in PHP 表明该行为旨在在打开register_globals 时将提交的变量名称转换为有效的全局名称。

现在已弃用的register_globals 终于被删除了,看起来这种行为有可能会改变为您一直期待的行为。

【讨论】:

  • 谢谢。但是我对您的回答并不完全满意:foo.x 和 foo.y 在任何情况下都不是变量,它们只是关联数组 $_GET 的字符串键。 PHP 不禁止字符串中带有句点,为什么会出现这种奇怪的行为?
  • 我的猜测是由于历史原因与register_globals 相关,如果设置,也可以直接访问各个变量。也就是说,如果您打开了register_globals,那么以及$_GET['foo.x'],您会期望$foo.x 被创建,这是不可能的,因为它不是一个有效的名称。有一个 open bug 反对这种行为,这似乎表明它是出于这个原因,并且它现在可能会改变 register_globals 正在发生。
  • 有趣。从打开的错误报告来看,这似乎是预期的行为。他们甚至发布了执行句点->下划线转换的代码。
  • 是的。 at least fifteen years 的代码在那里;如果您想弄清楚它被放置在那里的确切原因,您可能需要考古学家而不是程序员。从this unofficial history 可以看出,它很可能是在$_GET 存在之前编写的。
  • 嗯好的。现在我弄清楚了整个问题。无论如何,我一直觉得 PHP 从标准化的角度来看是一种非常糟糕的编程语言(很像 HTML 和 CSS),尽管它是我最喜欢的语言之一 :-)。例如,我不喜欢强制的 C 风格范式,在这种情况下它非常适合。
【解决方案2】:

我正在尝试回答我自己的问题:

if(isset($_GET[go_x] == true))
{
}

它奏效了。现在我的新问题是:为什么 PHP 将我的 go.x GET 变量转换为 go_x?

【讨论】:

  • 是 apache 网络服务器的问题吗?
  • 它将所有变量传递给 PHP 脚本:php.net/manual/en/…
  • 这是一个遗留问题。 PHP 用于自动将 GET、POST 和 cookie 值中的值作为命名变量直接导入全局范围(例如,$go_x)。那些不能有句点,所以它将它们翻译成下划线。
【解决方案3】:

您在javascript中详细说明名称为“go”的对象,但php不理解变量x(“go.x”)的外推,我建议在javascript中的数据之前详细说明,而不是将输入类型设置为“隐藏” " 将数据发送到 php 页面,以供进一步阐述。

ps.

if(isset($_GET['go.x']) == true)
等于说
if(isset($_GET['go.x']))

(http://it2.php.net/isset)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2014-02-04
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多