$ _POST变量

时间:2009-07-10 20:36:03

标签: php html forms post

我遇到了问题。我正在使用Wordpress,但这不是Wordpress问题。

我正在使用两个表单,在一个表单上我有所有输入字段和一个隐藏的输入字段,我用它来检查用户提交的表单。我把它的价值保存为'保存'。另一种形式仅用于重置所有选项,其值为“重置”。在PHP中,我检查隐藏字段的值并采取相应的操作。但问题是重置的东西不起作用。

以下是表单的HTML:

<fieldset>
    <form method="post">
        <!-- Some input fields here-->
        <p class="submit">
            <input name="save" type="submit" value="Save changes" />
            <input type="hidden" name="action" value="save" />
        </p>
    </form>
</fieldset>
<fieldset>
    <form method="post">
        <p class="submit">
            <input name="reset" type="submit" value="Reset" />
            <input type="hidden" name="action" value="reset" />
        </p>
    </form>
</fieldset>

在PHP中,我像这样验证它们:

// if I change the 'save' literal to something else like 'savea', $_POST variable will not be empty
// but if I dont, then $_POST variable is NULL
if ('save' == $_POST['action']) {
    foreach ($this->cp_options as $option) {
        if (isset($_POST[$option['id']])) {
            update_option($option['id'], $_POST[$option['id']]);
        }
        else {
            delete_option($option['id']);
        }
    }

    header("Location: themes.php?page=functions.php&saved=true");
    die;
}
// if I change the 'reset' literal to something else like 'reseta', $_POST variable will not be empty
// but if I dont, then $_POST variable is NULL

elseif ('reset' == $_POST['action']) {
    foreach($this->cp_options as $option) {
        delete_option($option);
    }

    header("Location: themes.php?page=functions.php&reset=true");
    die;
}

问题是,如果我将'reset''save'字面值更改为'reseta''saveasdfasd'之类的其他内容,则$_POST变量不会为空,但如果我不这样做,那么$_POST变量就是NULL

关于为什么会发生这种情况的任何想法?

5 个答案:

答案 0 :(得分:2)

[旧答案已编辑]

修改

首先尝试隔离您的测试环境。这给了我预期的结果。

<?php

if ( isset( $_POST['action'] ) )
{
  switch( $_POST['action'] )
  {
    case 'save':
      echo 'Save Action Requested';
      break;
    case 'reset':
      echo 'Reset Action Requested';
      break;
    default:
      echo 'Unknown action requested:';
      var_dump( $_POST['action'] );
  }
} else {
  echo 'No action parameter received';
}

?>
<fieldset>
    <form method="post">
        <!-- Some input fields here-->
        <p class="submit">
                <input name="save" type="submit" value="Save changes" />
                <input type="hidden" name="action" value="save" />
        </p>
    </form>
</fieldset>
<fieldset>
    <form method="post">
        <p class="submit">
                <input name="reset" type="submit" value="Reset" />
                <input type="hidden" name="action" value="reset" />
        </p>
    </form>
</fieldset>

答案 1 :(得分:0)

我知道你说$ _POST是null但是你假设那个或者你确实检查过$ _POST == null吗?您是否尝试过执行var_dump($ _ POST)来准确打印出发送的内容?只需注释掉你的重定向并查看$ _POST中的内容。也许这会让你更好地了解发生的事情。

答案 2 :(得分:0)

简单...删除隐藏的输入并更改两个“提交”按钮,使其具有相同的名称,但值不同:

<input type="submit" name="action" value="Reset" />
<input type="submit" name="action" value="Save" />

然后你可以这样测试:

if ($_POST['action'] === 'Reset') {
    // Do a reset here
} else {
    // Do a save here
}

你可能想把整个事情包装成:

if (isset($_POST['action'])) {
    // Put your form handling here
}

答案 3 :(得分:0)

如果您在一个页面上有多个表单,我建议您将每个表单发送到不同的URL。这是迄今为止最简单,最可靠的方法来检测表单的去向,只需要两个不同的脚本来处理表单的处理。然后,您可以包含或重定向到您希望用户查看的最终页面。

答案 4 :(得分:0)

这可能是因为存在具有相同名称的重复元素。 您可以尝试在表单中输入ID或名称吗?