我对$ _POST []变量和常规变量的流程感到困惑

时间:2011-12-25 19:19:04

标签: php forms session post

我有一个我创建的简单表单,在其中我有以下复选框:

<input type="checkbox" name="test">

注意:此表单已提交给自己。

在表单上方,我有以下PHP:

if (empty($_POST['test'])) {
    $thevalue = 0;
} else {
    $thevalue = 1;
}
var_dump($thevalue);

当我处理表单时,我得到了我期望的结果。如果我选中此复选框并提交,我会int(1)如果我取消选中此项,我会int(0)


在我的PHP代码的第一行,我想用一些简单的变量替换$_POST['test']

所以我在代码上面添加了以下行:

$simplevar = $_POST['test']

然后我将if statement中的条件替换为empty($simplevar)

但是当我提交表单时,我收到一条"Notice: Undefined index:"错误消息

  1. 为什么会这样?
  2. 假设有可能实现我的目标(即将$ _POST插入$ simplevar),我该怎么办呢?
  3. 提前感谢您的帮助!

    PS:我可能会对这个问题采取后续行动,但不想因为干扰这一切而混乱。

    再次感谢...哦,圣诞快乐! ; - )

5 个答案:

答案 0 :(得分:0)

取消选中复选框时,它不会作为键添加到$_POST数组,这就是$simplevar = $_POST['test']返回您发布的错误的原因。使用empty()可以通过empty()更好地处理错误(好吧,无论如何都是静默的)来解决这个问题。

您还没有指定在选中复选框时是否收到该错误,但上述说明是我唯一可以给出的解释。如果您不确定,请尝试print_r($_POST)查看$_POST实际包含的内容。

解决问题的方法是使用三元表达式来更好地处理错误:

$simplevar = isset($_POST['test']) ? 0 : 1;

如果0未设置(复选框未被选中),则会$simplevar分配$_POST['test'],否则为1


确保所有表单处理代码都放在

if(!empty($_POST)) {
    // Code
}

因此,每次加载页面时都不会执行,否则每次都会显示错误。

答案 1 :(得分:0)

这是因为当您不选中该复选框时,浏览器在提交表单时不会向该控件的服务器发送任何值。因此,$_POST['test']未定义,并且您尝试使用它而不检查它是否存在,因此您会收到警告。 empty()执行的检查之一是查看值是否已设置。因此,当您在$_POST中直接使用empty()键时,您不会收到错误,但是当您尝试在没有此检查的作业中使用它时,您将收到错误。

你可以粗略地做你想做的事情,你只需稍微改变逻辑。如果你这样做:

$simplevar = !empty($_POST['test']);
// You could also do
// $simplevar = isset($_POST['test']);

if ($simplevar) {
  // The box was checked
} else {
  // The box was not checked
}

......没有错误,它会做你想要的。使用此方法,$simplevar始终包含一个布尔值,指示是否已选中该框。

答案 2 :(得分:0)

仅在选中复选框时才会传输复选框值。这意味着未选中的复选框不会显示在$_POST数组中。

禁止PHP通知的一种方法是使用引用而不是变量:

$simplevar =& $_POST['test'];
if(empty($simplevar)) $thevalue = 1;
else $thevalue = 0;

答案 3 :(得分:0)

这是预期的行为。如果您要分配如下变量:

$simplevar = $_POST['test'];

然后$ _POST变量可能不存在。 Zend运行时然后分配NULL值,但是如果不是你想要的话,会给你一个有用的调试提示。

之前使用empty()时,内置了对变量存在的检查。empty()是一种语言结构。与isset()一样,它经常被用来避开这些通知。模拟这种语言行为的繁琐语法是:

$simplevar = empty($_POST['test']) ? NULL : $_POST['test'];

内置的语言是:

$simplevar = @( $_POST['test'] );

现在,我会因为提及它而被烤。 (如果你想在某些时候恢复调试通知,使用@是很有用的,而empty和isset结构会永久地抑制它们。)

答案 4 :(得分:0)

首先,在尝试使用它们之前,应始终检查$ _POST,$ _REQUEST和$ _GET中的变量是否已设置。即使您只是输出错误,也始终处理未设置的条件。

因为错误是一个未定义的索引,所以似乎错误是在$ _POST中没有设置测试,尽管这没有多大意义。我会添加一个检查,可能是一个echo或var转储来检查$ _POST。如果设置,则另一个问题可能是范围问题。 $ _POST是一种称为超级全局的东西,它可以在任何范围内使用。您设置的变量如果要跨范围访问它们,可能需要通过定义它们来实现全局变量。