【问题标题】:php dynamic dropdown not holding value after submissionphp动态下拉列表在提交后不保存值
【发布时间】:2021-01-12 14:15:39
【问题描述】:

我正在尝试构建用于搜索目的的 php 动态下拉列表。例如 - 按最低价格和最高价格搜索。尽管它显示了正确的结果,但下拉列表不包含 POST 值。这是我的代码

<div class="form-group">
    <select class="form-control" name="minprice" id="minprice">
        <option value="">--Min Price--</option>
            <?php
                $args=array(':type' => 'general');
                $sql='SELECT DISTINCT price FROM cars  WHERE cartype=:type AND  price !=" "';
                $stmt=$pdo->prepare($sql);
                $stmt->execute($args);
                while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
                    echo '<option value="'.$row['price'].'"'.($row['price']==$_POST['price'] ? '  selected="selected"' : '').'>'.$row['price'].'</option>';
                } 
            ?>
    </select>
</div>
<div class="form-group">
    <select class="form-control" name="maxprice" id="maxprice">
        <option value="">--Max Price--</option>
            <?php
                $args=array(':type' => 'general');
                $sql='SELECT DISTINCT price FROM cars  WHERE cartype=:type AND  price !=" "';
                $stmt=$pdo->prepare($sql);
                $stmt->execute($args);
                while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
                    echo '<option value="'.$row['price'].'"'.($row['price']==$_POST['price'] ? '  selected="selected"' : '').'>'.$row['price'].'</option>';
                } 
            ?>
    </select>
</div>

if (isset($_POST['submit']))
{
   ........
   .......
    $minprice= $_POST['minprice'];
    $maxprice= $_POST['maxprice'];
    $stmt=$pdo->query("SELECT * FROM cars  WHERE cartype='general' 
        ............
        ...................
        AND price >= '".$minprice."'
        AND price <= '".$maxprice."'
        ");
        while($row=$stmt->fetch(PDO::FETCH_ASSOC))
            {
                include 'carlist.php';
            }
}else{.....}

【问题讨论】:

  • 您的意思是当您提交表单时,它会从数据库中获取正确的数据,但下拉菜单不会重新填充用户选择的值
  • 感谢@RiggsFolly。是的。例如,如果按最低价格搜索为 500,则提交后,最低价格下拉菜单应显示为 500。

标签: php mysql dropdown


【解决方案1】:

我认为您只是为 $_POST 值使用了错误的名称

选择名为minpricemaxprice,您正在测试不存在的$_POST['price']

<select class="form-control" name="minprice" id="minprice">
    <option value="">--Min Price--</option>
        <?php
            $args=array(':type' => 'general');
            $sql='SELECT DISTINCT price FROM cars  WHERE cartype=:type AND  price !=" "';
            $stmt=$pdo->prepare($sql);
            $stmt->execute($args);
            while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
                echo '<option value="'.$row['price'].'"'.($row['price']==$_POST['minprice'] ? '  selected="selected"' : '').'>'.$row['price'].'</option>';
    //      The correction is here                                              ^^^^^^^
    ?>
</select>

当然,maxprice 下拉菜单也有同样的问题

即使在 LIVE 环境中也可以从 PHP 中获取错误,请将这 4 行添加到要调试的任何基于 MYSQLI_ 的脚本的顶部 ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);。 这将强制任何MYSQLI_ 错误生成一个您可以在浏览器上看到的异常以及正常的 PHP 错误。

【讨论】:

    【解决方案2】:

    您呈现的表单字段名为minpricemaxprice。除非您向我们隐瞒,否则没有名为 price 的字段。

    因此,当您调用 $_POST['price'] 时,该变量将触发警告,指出您正在尝试访问未声明的变量。

    也有可能适当的$_POST 变量还没有被声明,因为在初始页面加载时还没有提交。

    要修复您的代码,请使用“空合并运算符”并引用正确的 $_POST 键。

    $selectedMin = $_POST['minprice'] ?? null;
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo '<option' . ($row['price'] == $selectedMin ? ' selected' : '') . '>' . $row['price'] . '</option>';
    } 
    

    然后重复最高价格。

    请注意,我没有在选项标签中声明value 属性。这是因为重复选项的文本值的好处为零。一切都将完全相同,并且任何 javascripting 都将完全一样地工作,而无需多余的 value 声明。


    更广泛的评论:

    尽可能少地访问数据库,当然不要重复查询。将结果集缓存在一个变量中,以便您可以多次使用它。

    您的两个表单字段实际上是相同的,因此请在循环中创建 html 标记。

    您的查询没有注入风险,因此您不需要准备好的语句。

    重写代码:(Demo)

    $prices = $pdo->query("SELECT DISTINCT price FROM cars WHERE cartype = 'general' AND price != ' '")->fetchAll(PDO::FETCH_COLUMN);
    
    foreach (['min', 'max'] as $key) {
        $selectedPrice = $_POST[$key . 'price'] ?? '';
        $options = [];
        foreach ($prices as $price) {
            $options[] = sprintf(
                '<option%s>%s</option>',
                $price == $selectedPrice ? ' selected' : '', // 1st %s
                $price                                       // 2nd %s
            );
        }
        printf(
            '<div class="form-group">
                <select class="form-control" name="%1$sprice" id="%1$sprice">
                    <option value="">--%2$s Price--</option>
                    %3$s
                </select>
            </div>
            ',
            $key,                      // represented by %1$s
            ucfirst($key),             // represented by %2$s
            implode(PHP_EOL, $options) // represented by %3$s
        );
    }
    

    【讨论】:

    【解决方案3】:

    我不确定这是否能回答您的问题,但您知道,一旦“发布”页面,下拉菜单中的信息就会丢失,除非您:(i) 将其存储在 PhP $_SESSION 变量中;或 (ii) 以其他方式将您想要的信息保存到数据库或 .txt 文件中。

    因此,如果您尝试做的是在 POST 之后保存用户的选择,那么一种解决方案是创建两个 $_SESSION 变量,这是您在 PhP 页面刷新或不同页面之间存储信息的方式。

    【讨论】:

    • 感谢@Rasputin 的帮助。我在表单上有更多字段,并且使用我当前的编码,其他字段正在保存 POST 值。只有这两个字段没有保存 POST 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2020-08-29
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多