按价格筛选表,不显示id期望值


Filtering table by price, not showing what id expect

问题

我在筛选我的表格时遇到了问题,我已经根据产品类别对其进行了筛选,但在查看数字时我不确定如何进行筛选。

预期结果

当用户按下提交按钮时,我希望看到的是表更改为以前提交的表。例如,在下拉框中有一个"低于1英镑"的选项,这意味着价格范围低于1英镑。如果我按下这个键,我希望看到表格发生变化,只显示价格低于1英镑的产品。

这是代码

下拉菜单

<form action="database.php" method="post">
<select name="price" id="price">
    <option value="">All Products</option>
    <option value="1">Less than £1</option>
    <option value="2">More than £1, Less than £5</option>
    <option value="3">More than £5, Less than £10</option>
</select>
<input  type="submit" name="submit" value="Search"/>
</form>

表中与此相关的代码

if (!empty($_POST['price'])) {
    // Where conditional that will be used in the SQL query
    $where = " WHERE price = '".pg_escape_string($_POST['price'])."'";
    switch ($_POST['price']) {
        case 1: 
            $where = $where." and Price BETWEEN 0.00 AND 1.00";
            break;
        case 2: 
            $where = $where." and Price BETWEEN 1.00 AND 5.00";
            break;
        case 3: 
            $where = $where." and Price BETWEEN 5.00 AND 10.00";
            break;
        default:
            break;
    }
}

当我按下其中一个选项时会发生什么

例如,如果我选择"低于1英镑"选项,则只显示价值1英镑的产品。如果我选择"大于1英镑,小于5英镑"选项,则只显示价值2英镑的产品等。我理解它,因为我已将值设置为1、2和3。有办法绕过这个吗?

初始化WHERE子句时,您将从下拉列表中设置price列和value之间的精确匹配,因此您最终会得到类似的结果

SELECT ...
  WHERE price = '2'
    AND price BETWEEN 1.00 AND 3.00...

将代码更改为设置$where = 'WHERE 1 = 1 ';,以创建一个始终真实的基本WHERE,您可以安全地扩展它,如

SELECT ...
  WHERE 1 = 1
    AND price BETWEEN 1.00 AND 3.00...

希望能有所帮助。

之前,您将$where设置为的switch语句

$where = " WHERE price = '".pg_escape_string($_POST['price'])."'";

对于谈话,这将使$where等于

" WHERE price = '1'"

然后,在您的交换机中,您添加到当前位置,如果价格为1,$where最终等于

" WHERE price = '1' and Price BETWEEN 0.00 AND 1.00" 

这会产生冲突,你所需要做的就是修改你的代码,删除你设置$where等于的第一件事,并像这样修改你的开关:

if (!empty($_POST['price'])) {
switch ($_POST['price']) {
        case 1: 
            $where = " WHERE price BETWEEN 0.00 AND 1.00";
            break;
        case 2: 
            $where = " WHERE price BETWEEN 1.00 AND 5.00";
            break;
        case 3: 
            $where = " WHERE price BETWEEN 5.00 AND 10.00";
            break;
        default:
            break;
    }
}