【问题标题】:PHP - Best practice to retain form values across postbackPHP - 在回发中保留表单值的最佳实践
【发布时间】:2011-06-01 16:32:08
【问题描述】:

在这里完成PHP新手,我以前的工作几乎都是在ASP.NET中。我现在正在做一个 PHP 项目,我偶然发现的第一块石头是在回发中保留值。

对于最简单但仍然现实的示例,我有 10 个下拉菜单。它们甚至还没有数据绑定,因为这是我的下一步。它们是简单的下拉菜单。

我将整个页面包含在一个标签中。每个下拉列表的 onclick() 事件调用一个 javascript 函数,该函数将使用下拉列表的选定值填充相应的下拉列表隐藏元素。然后,在页面重新加载时,如果该隐藏值不为空,我将所选选项设置为我隐藏的选项。

这非常适合单次回发。但是,当另一个下拉列表被更改时,原来的第一个下拉列表失去了它的价值,因为它对应的隐藏值也失去了它的价值!

这让我开始研究使用查询字符串、会话或……其他一些想法。

有人能指出我正确的方向吗,哪个选项最适合我的情况?我是 PHP 新手,但是我需要为我的技能水平做一些非常激烈的事情,所以我需要一些灵活且易于使用的东西。

谢谢!

-----编辑-----

对我的问题再澄清一点:)

当我说“PostBack”时,我指的是正在提交的页面/表单。控制权传回服务器,再次执行 HTML/PHP 代码。

至于下拉列表和隐藏,我使用隐藏变量来保留“选定值”或“选定索引”的原因是,当页面提交时,我可以用之前的选择重新绘制下拉列表,而不是默认回到第一个索引。当我使用 $_POST[] 命令时,我无法按名称检索下拉列表,但我能够按名称检索隐藏的值。这就是为什么在下拉更改事件时,我调用 javascript 将下拉列表中的选定值设置为其对应的隐藏值。

-------- 再次编辑 -------- 好吧好吧,我知道我需要退后一步并解释总体目标:)我很抱歉一开始就不太清楚。

我的最终设计将是一个页面,用户可以在该页面中选择我们公司内的一个部门,以查看其数据。一旦选择了该部门(从下拉列表中),我将显示更具体的数据选择下拉列表:颜色、尺寸、供应商、样式、日期、商店#等...此时我还将显示销售数据选定的部门。选择任何颜色、尺寸等后,我将更新销售数据结果以满足新标准

------ 编辑 ---------- 我无法提供对我的示例的外部访问,但是这里有一个带有解释的截图。在下图中,用户将展开部门下拉菜单以选择一个部门。此时,下面的销售数据将根据该部门刷新。然后,用户将选择“分组依据”选项,例如商店,页面/数据将刷新以显示按商店分组的数据。然后他们可以选择一种颜色,例如我的示例中的黑色,数据将显示所选部门和颜色的销售额,按商店分组。

然而,为了做到这一切,页面需要在每次刷新/发布时保留部门、颜色和分组下拉选择...

【问题讨论】:

  • 有趣的话题。但是您应该解释postback 的含义;这是一个 ASP 术语,在 PHP 领域是未知的。如果您需要重新显示下拉菜单,或者通过隐藏的表单字段传递值是否足够,还可以添加更多信息。
  • 为什么会有一个单独的隐藏字段来存储选择的值?选择存储自身的值。我很困惑。我们可以查看一些代码并解释您要完成的工作吗?
  • 你能提供一个现场例子的链接吗?我可以理解确切的过程
  • 这与您的尝试相似吗? jankoatwarpspeed.com/examples/webform_to_wizard |点击页面顶部的红色块。

标签: php postback retain


【解决方案1】:

听起来您只需要重新输出表单字段,并预先填充正确的值。

例如,假设您想要这样的下拉菜单:

<select name="department">
  <option value="s">Sales</option>
  <option value="m">Marketing</option>
</select>

当您提交表单时,该值将作为 $_POST["department"] 提供给 PHP。现在您想再次输出表单,并选择正确的部门。

你需要一个这样的函数(这只是一个简单的草图):

function outputSelect($name, $values, $currentValue) {
  echo '<select name="'.htmlspecialchars($name).'">';
  foreach ($values as $value => $text) {
    if ($value === $currentValue) {
      echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>';
    } else {
      echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>';
    }
  }
  echo '</select>';
}

当你想显示菜单时你会调用它。通常这是来自 HTML 模板:

<?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?>

您将需要类似的函数用于文本字段、隐藏字段、单选按钮等。最后,您将获得一个用于输出表单字段的可重用函数库。

不要忘记在任何 HTML 标记的属性或内容周围使用 htmlspecialchars,就像我在上面所做的那样。这在显示用户输入的数据时尤其重要,以防止 XSS 攻击,但无论数据来源如何,都应该这样做。

【讨论】:

    【解决方案2】:

    没有自动回发的本地方法,您必须像这样回显 $_POST 数组中的数据:

    <input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" />
    

    另一种方法是创建一个表单助手,它将为您动态创建输入等,然后检查 post 数组的键,例如:

    class FormHelper
    {
        public function input($name,$type = "text",$default_value = "",$postback = false)
        {
            return '<input name="' . $name  . '" type="' . $type . 'value="' . $this->_postback($name,$default_value ) . '" />';
        }
    
        //More Methods
    
    
        private function _postback($key,$default = "")
        {
            return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default;
        }
    }
    

    然后您可以添加将能够构建表单,指定它是否应该包含以前的值。

    你会像这样创建表单:

    <form>
        <?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?>
    </form>
    

    显然创建了单例方法getInstance()

    一些可能对您有所帮助的链接。

    1. Form validation using PHP
    2. PHP/CSS Form validation
    3. PHP Form Validation

    在您更新之后,即使您的帖子难以理解,我也可能知道您的意思。

    如果我是对的,您想执行以下操作:

    • 在您的页面上显示表单
    • 让用户填写表格
    • 当用户点击提交时
      • 通过 Ajax 将数据发送到服务器
      • 处理用户提供的信息
      • 生成新表单,或重新生成有错误的旧表单
      • 将表单通过管道发送回页面
      • 删除旧表单,用新生成的表单替换旧表单

    如果以上是正确的,那么这不是 PHP 的特定功能,而是主要基于 javascript

    完成上述操作的最佳方法是确保您的应用程序是基于模板的,因此在初始页面加载时,您会显示如下形式的表单:

    <html>
        <!-- Head, Meta, Etc-->
        <body>
            <?php $this->template->load("templates/forms/specific_form.php"); ?>
        </body>
    </html>
    

    这将是我们通常加载页面的方式,然后单击您想通过 ajax 提交表单,我会为此合并 jQuery。

    表格是这样的:

    <form rel="__postback" ... >
    </form>
    

    然后在 jQuery 中,您将执行以下操作:

    $(document).ready(function(){
        $("form[rel*=__postback]").each(function(){
            var Form = $(this);
    
            //Send the form with ajax, bin the __PostbackComplete()
            function __PostbackComplete(server_data)
            {
                //Overwite the form using jQuery LIVE!!!!
            }
        });
    });
    

    在 PHP 中,您将分析数据并代表从模板部分处理表单。

    希望这会有所帮助。

    【讨论】:

    • 刚刚更新了我的原始帖子,提供了更多细节,我希望这有助于更好地解释我的目标。感谢您抽出宝贵时间提供帮助!
    【解决方案3】:

    如果你的问题没有错,我认为问题实际上出在你的 javascript 解决方案上。

    为什么只发送选定的字段?有很多形式吗?我的意思是,如果所有下拉列表都在一个表单中,您应该在输入更改时发送完整的表单,是的,您将再次发送以前的下拉列表值,但这是使用 $_POST 获取该值的方法。

    【讨论】:

    • 所以不要有多个隐藏对象来包含它们对应的下拉值。我应该有一个隐藏的对象,其中包含我表单中的所有 html?然后在我提交/重新加载时使用 $_POST[] 解析它,以检索下拉列表的选定值?如果是这样的话,你能给我举个例子吗?谢谢你:)
    • 如果您显示一点您的 html 和 javascript,事情会变得更容易。我所说的是始终处理发布的数据,进行输出,但还要检查所有选项并使用@RobertPitt 的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2010-10-14
    • 2020-08-15
    • 2012-03-03
    相关资源
    最近更新 更多