【问题标题】:Best practice to store and return form data with PHP使用 PHP 存储和返回表单数据的最佳实践
【发布时间】:2012-10-10 12:57:58
【问题描述】:

可能重复:

您好,我正在构建一个表单,用于查询 API 并过滤一些搜索结果。这些数据都没有存储在文本文件或数据库中。

表单提交自然会刷新页面,表单值默认为我在编写 HTML 时指定的原生选择选项。我希望存储用户提交的值,并在页面重新加载并加载过滤的选择后将这些值作为表单中的选定选项。实现这一目标的最佳解决方案是什么?会话,还是查询 POST 数组?

当然,我进行了几次 Google 搜索,但所有与数据库或文本文件相关的内容均不适用。

我当前的表单代码:

<form method="post" action="">
  <label>Year</label>
  <select class="minYear" name="minimuimYearFilter">
    <?php 
    $vehicleYear = date("Y") + 1;
    for ($i = 1993; $i <= $vehicleYear; $i++) {
        echo "<option value=".$i.">".$i."</option>";
    }
    ?>
  </select>
  To:
  <select class="maxYear" name="maximumYearFilter">
    <?php 
    for ($i = 1993; $i <= $vehicleYear; $i++) {
      if ($i == $vehicleYear) {
        echo "<option value=".$i." selected>".$i."</option>"; 
      } else {
        echo "<option value=".$i.">".$i."</option>";
      }
    }
    ?>
  </select>
  <label for="priceFilter">Price</label>
  <select class="priceFilter" name="priceFilter">
    <?php 
    for ($i = 1000; $i <= 50000; $i=$i+1000) {
      if ($i == 50000) {
        echo "<option value=".$i.">$".$i."+</option>";
      } elseif ($i == 20000) {
        echo "<option value=".$i." selected>$".$i."</option>";
      } else {
        echo "<option value=".$i.">$".$i."</option>";
      }
    }
    ?>
  </select>
  <label for="mileageFilter">Mileage</label>
  <select class="mileageFilter" name="mileageFilter">
    <?php 
    for ($i = 5000; $i <= 100000; $i=$i+5000) {
      if ($i == 100000) {
        echo "<option value=".$i.">".$i."+</option>";
      } elseif ($i == 75000) {
        echo "<option value=".$i." selected>".$i."</option>";
      } else {
        echo "<option value=".$i.">".$i."</option>";
      }
    }
    ?>
  </select>
  <input type="submit" value="Submit">
</form>

大家好,开个会,然后周末出城 wifi 以外的地方,周一会尽快赶上。感谢迄今为止所有的好评!迫不及待想回来试试这个。

【问题讨论】:

  • 会话。当他移动到另一个页面时,POST 会丢失。但是将单独的回显值与 , not 一起使用。作为 。 while 将它们连接起来是徒劳的,只是将它们一一输出。这是一个特殊的 PHP 回显噱头。

标签: php html forms session post


【解决方案1】:

如果您的意思是在页面之间传递数据 - 您应该阅读此问题的最佳答案:

PHP Pass variable to next page

在此之后 - 阅读有关 PHP 会话的更多信息。 Session是“记住应用程序状态”的最佳机制。

【讨论】:

  • 这是有道理的,尽管我试图避免必须实施会话,但这可能是我采取的路线。谢谢!
  • 会话没有那么可怕。它们比你想象的更容易使用 :)
  • 哈哈,我以前做过一些关于会话的工作,我希望可能有另一种“更简单”的方法来实现会话,因为这是我整个会话中唯一适用的文档地点。但我明白你的意思:) 再次感谢!
【解决方案2】:

您正在使用选择框这一事实使这变得更加困难,但总体思路是使用$_REQUEST 数组中每个选择框的值来决定哪个选项获取选定的属性。

类似的东西:

for ($i = 1993; $i <= $vehicleYear; $i++) {
    echo "<option value='".$i."'".(($_REQUEST['minimuimYearFilter']==$i)?"selected":"").">".$i."</option>";
}

这个想法是先前选择的选项获得一个选择的属性,使其成为默认选择值。

这应该是开箱即用的,至少在我的示例中是这样,原因是如果没有选择任何值,它们都不会获得选定的属性,而顶部的属性是默认值。如果您还想要一个“第一次”选择的选项,只需检测 $_REQUEST['whatever'] 是否返回任何内容,如果没有将其值设置为您想要选择的选项。

【讨论】:

  • 对,我认为这是有道理的。特别是因为我动态生成这些长选择选项,生成正确的选择元素来回显selected 似乎也是这个用例中最大的障碍之一......
  • 我已经用一个例子更新了我的问题,如果您需要更多详细信息,请告诉我。
  • 不,我真的很喜欢你在这里的解决方案。我让它腌制,我可以尝试实施。在初始页面加载、用户交互之前,您的 sn-p 是否有任何特殊注意事项需要注意,或者您认为这会“开箱即用”吗?
  • 非常酷,我要先尝试这个解决方案,虽然我有一个会议,而且要等到星期一才出城,所以可能要等到那时才能测试(并接受:))。再次感谢!
【解决方案3】:

首页设置会话的第一个:

session_start();

例如,如果 $_POST 被发送而不是在会话中设置:

if (isset($_POST['vehicle_selected']))
{
    $_SESSION['vehicle_selected'] = $_POST['vehicle_selected'];
}
else
{
    $_SESSION['vehicle_selected'] = ''; 
}

在 HTML 表单中添加这个值:

value="<?=$_SESSION['vehicle_selected']; ?>";

或完整示例:

<?php

session_start();

if (isset($_POST['vehicle_selected']))
{
    $_SESSION['vehicle_selected'] = $_POST['vehicle_selected'];
}
else
{
    $_SESSION['vehicle_selected'] = ''; 
}

?>

    <form method="post" action="">
      <label>Year</label>
      <select class="minYear" name="minimuimYearFilter">
        <?php 
        $vehicleYear = date("Y") + 1;
        for ($i = 1993; $i <= $vehicleYear; $i++) {
        echo "<option value=".$_SESSION['vehicle_selected'].">".$_SESSION['vehicle_selected']."</option>";
        }
        ?>
      </select>
    ....

另一种说法(不是答案,但出于安全目的推荐):

使用 REQUEST 方法可以比 POST 更简单的攻击,而不是 REQUEST ($_GET,$_POST) 只使用 $_GET。如果您想要更安全地探索 Stackoverflow 中 PHP 的 CSRF 保护。但这只是为了安全。

【讨论】:

  • 我很欣赏这里的回复,我喜欢你提出的安全考虑。我今天可能没有足够的时间来插入您的解决方案,但如果我今晚错过了,我会在星期一尝试。干杯!
【解决方案4】:

使用 cookie。 setcookies() 的 PHP 手册页非常不言自明:http://php.net/manual/en/function.setcookie.php

【讨论】:

  • $_COOKIE 只能包含 4kB 的数据:对于小型表单来说足够了,但是如果您有内容字段,则可以快速通过。当您超过 4kB 限制时,PHP 并没有真正给出错误,所以看起来 cookie 不起作用,这非常令人沮丧。因此,我不建议使用 cookie 来存储表单数据,除非它类似于登录表单中的电子邮件
  • @Tessmore 我同意,我觉得 cookie 是这个用例的延伸。不过感谢 sgroves 的回复。
  • 您有四个下拉菜单,每个下拉菜单都可以默认为一个数值。超过 4K 需要存储什么?也许我误读了您的问题,但看起来这正是您使用 cookie 的目的。
【解决方案5】:

我会使用 POST 数组。如果您没有跨多个页面使用输入,会话只会添加一个不必要的步骤。

$value = (isset($_POST['some_option']) ? $_POST['some_option'] : "";
?>

<select selected="<?php echo $value; ?>">

<input value="<?php echo $value; ?>"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多