【问题标题】:Retain select and multiple select array values on form POST在表单 POST 上保留选择和多选数组值
【发布时间】:2014-03-18 17:02:02
【问题描述】:

我确定我遗漏了一些明显的东西,但是当表单提交给自身时,我无法在表单 POST 上保留选择值和多个选择值。

这是基本形式:

    <?php
    // Setup Fields, Initially Empty
    $first_name = $last_name = $age = $fruit = "";

    // Start session
    session_start();

    // Register
    session_register('first_name');
    session_register('last_name');
    session_register('age');
    session_register('fruit');

    // Populate
    $_SESSION['first_name'] = $first_name;
    $_SESSION['last_name'] = $last_name;
    $_SESSION['age'] = $age;
    $_SESSION['fruit'] = $fruit;

    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        </head>
        <body>
            <div>

            <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" name="submit_data" method="POST" id="submit_data">

                        <p><label for="first_name">First Name</label><input type="text" id="first_name" size="20" maxlength="100" value="<?php echo $first_name;?>" name="first_name" />
                        </p>

                        <p><label for="last_name">Last Name</label><input type="text" id="last_name" size="20" maxlength="100" value="<?php echo $last_name;?>" name="last_name" />
                        </p>

                        <p><label for="age">Are you:</label>
                            <select id="age" name="age">
                                <option value=""></option>
                                <option value="0">Under 50</option>
                                <option value="1">50+</option>
                            </select>
                        </p>

                        <p><label for="fruit">Pick some fruit</label>
                            <select id="fruit" name="fruit[]" multiple="multiple">
                                <option value="Apple">Apple</option>
                                <option value="Banana">Banana</option>
                                <option value="Orange">Orange</option>
                            </select>
                        </p>

                <input type="submit" name="submit" value="Submit" />
            </form>
            </div>
        </body>
    </html>

“年龄”选择是一个单选选项,而“水果”选择是一个多选列表(它也是一个数组,因此是“水果[]”名称)。

如果提交了表单,我希望在页面刷新时选择选择值,就像通过 PHP 会话选择名字和姓氏字段一样。

我确定有一种方法类似于以下内容,但无法使其工作:

    if (isset($_POST['fruit'])){
        $chosen = $_POST['fruit'];
        foreach($chosen as $selected)
            echo 'selected'.$selected;
    }

请有人为我指出这个基本表单要求的正确方向吗?

谢谢

【问题讨论】:

  • 旁注:session_register() 自 PHP 5.3.0 起已弃用此功能,自 PHP 5.4.0 起已删除。
  • 您使用的是什么版本的 PHP? session_register 是一个完整的 NO NO。不要使用它。此外,您不应该使用register_globals,我认为您必须使用它,因为您从不引用 $_GET 或 $_POST。
  • 现在是 5.3.24 - 我不照顾环境,所以如果 session_register 是不,我将不得不寻找替代方案。谢谢。
  • 其实你已经在使用$_SESSION['first_name'] = $first_name; 等@MCG 删除包含session_register 的其他内容了
  • 您已经使用了正确的替代方法,它的 `$_SESSION['first_name'] = $first_name;等

标签: php forms session post


【解决方案1】:

内联你会做类似的事情

// for 'age' (single select)
<option value="0"<?php if(isset($_POST['age']) && $_POST['age']==0) echo ' selected'; ?> >Under 50</option>

//for 'fruit' (multiple select)
<option value="Apple"<?php if(isset($_POST['fruit']) && in_array('Apple',$_POST['fruit'])) echo ' selected'; ?>>Apple</option>

您需要为每个选择 &lt;option&gt; 执行此操作

如果你想这样做,你可以做一个 php 循环

// for 'age' (single select)
<select id="age" name="age">
    <option value=""></option>
    <?php 
      $opts = array(0=>'Under 50',1=>'50+');
      foreach($opts as $k=>$v) {
              $s = (isset($_POST['age']) && $_POST['age']==0) ? ' selected': '';
              echo "<option value=\"{$k}\"{$s}>{$v}</option>";
      }
    ?>
</select>

//for 'fruit' (multiple select)
<select id="fruit" name="fruit[]" multiple="multiple">
    <?php 
      $opts = array('Apple','Banana','Orange');
      foreach($opts as $v) {
              $s = (isset($_POST['fruit']) && in_array($v,$_POST['fruit'])) ? ' selected': '';
              echo "<option value=\"{$v}\"{$s}>{$v}</option>";
      }
    ?>
</select>

【讨论】:

  • 已添加示例以动态构建/选择选项
  • 这正是我所需要的——显然它现在就在我面前!结合 Fred-ii- 和 RiggsFolly 的关于会话设置的 cmets,效果非常好。谢谢大家。
【解决方案2】:

因为您使用的是register_globals,所以这些变量将在您的代码开始运行之前为您自动创建。

$first_name, $last_name, $age, $fruit

因此,当您在代码的第一行执行此操作时

// Setup Fields, Initially Empty
$first_name = $last_name = $age = $fruit = "";

您将那里的值设置为''。当您尝试将它们放入 $_SESSION 时,它们是空的也就不足为奇了。当您尝试将它们放回输入字段时也是如此。

停止使用register_globals 功能,使用$_POST['xxx']$_GET['xxx'] 或在绝对必要时使用$_REQUEST['xxx'] 引用来自提交表单的变量。这将使您的代码在以后更容易理解并且更便携。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2012-04-10
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多