1

可能重复:

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

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

自然地,我做了几次谷歌搜索,但所有与数据库或文本文件相关的内容都不适用。

我当前的表单代码:

<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 以外的地方,周一会尽快赶上。感谢迄今为止所有的好评!等不及要回来试试这个。

4

5 回答 5

2

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

PHP 将变量传递到下一页

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

于 2012-10-19T20:54:50.877 回答
1

首先在首页设置会话:

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 保护。但这只是为了安全。

于 2012-10-19T21:01:43.440 回答
1

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

这些方面的东西:

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

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

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

于 2012-10-19T20:55:25.443 回答
0

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

于 2012-10-19T20:53:24.127 回答
0

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

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

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

或者

<input value="<?php echo $value; ?>"/>
于 2012-10-19T20:56:36.870 回答