【问题标题】:$_POST variable$_POST 变量
【发布时间】:2009-07-10 20:36:02
【问题描述】:

我遇到了问题。我正在使用 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

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

【问题讨论】:

  • 你能在 Wordpress 之外重新创建吗?
  • 我不知道,但是 WordPress 是否有可能对 $_POST 和 $_GET 的内容做一些事情,可能是在它处理可能被破坏的(想想 magic_quotes)输入时? WordPress 是否有自己的机制来检索您可以尝试的表单值?
  • 您的页面是否出现异常?如果是这样,您可以将其添加到您的问题中吗?我看不到 $_POST 变量会因为您更改代码中的字符串文字而突然变为空值,所以我想知道您的问题是否实际上不是您的诊断。或者也许你的措辞令人困惑。

标签: php html forms post


【解决方案1】:

[旧答案已编辑]

编辑

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

<?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>

【讨论】:

  • 这太可笑了,如果您有多语言网站怎么办?那么每种语言的提交按钮的值都不一样?
  • 好吧,当我点击重置按钮时,我不想要第一个表单的数据,这并不能回答我的问题 :(
  • 对不起 - 我以为我理解你的问题的性质,但在第二次阅读时我意识到我错过了你的问题的重点。考虑编辑我的答案。
  • @usoban - 这并不荒谬。这是使用 javascript 实现多提交按钮表单的唯一方法。此外,对于多语言网站,您将存储 i18n 数据,因此通过某种反向查找来规范化提交的值是微不足道的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    <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
    }
    

    【讨论】:

    • 已完成但仍无法正常工作。我想这是 Wordpress 的问题,因为没有 Wordpress 我无法重现该行为谢谢大家
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      这可能是因为有相同名称的重复元素。 您可以尝试在表单中添加 id 或名称吗?

      【讨论】:

        猜你喜欢
        • 2013-12-05
        • 1970-01-01
        • 2021-11-26
        • 2012-08-06
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2014-09-28
        相关资源
        最近更新 更多