SQL BETWEEN不会从2个输入字段中选择给定的价格范围

时间:2019-11-18 07:11:46

标签: php sql

无法从输入字段之间的价格中选择db行,当我输入5000 to 8800的价格范围时,我尝试使用以下代码,它从价格中选择了第{no.5}行中的所有db行和8。

有人可以解释出什么问题吗,或者我需要对代码进行任何更改。

SQL

`prs` varchar(255) NOT NULL DEFAULT '',

HTML

<input type="text" id="minimum_price" class="form-control">
<input type="text" id="maximum_price" class="form-control">
<input type="submit" class="filter_all">


$(document).ready(function () {
            filter_data();
            function filter_data() {
                $('.filter_data');
                var action = 'fetch_data';
                var minimum_price = $('#minimum_price').val();
                var maximum_price = $('#maximum_price').val();
                $.ajax({
                    url: "fetch.php",
                    method: "POST",
                    data: {
                        action: action,
                        minimum_price: minimum_price,
                        maximum_price: maximum_price
                    },
                    success: function (data) {
                        $('.filter_data').html(data);
                    }
                });
            }
            function get_filter(class_name) {
                var filter = [];
                $('.' + class_name + ':checked').each(function () {
                    filter.push($(this).val());
                });
                return filter;
            }
            $('.filter_all').click(function () {
                filter_data();
            });
        });

PHP

if (isset($_POST["action"])) {
  $query = "SELECT * FROM allpostdata WHERE sts = '1' ";

  if (isset($_POST["minimum_price"], $_POST["maximum_price"]) && !empty($_POST["minimum_price"]) && !empty($_POST["maximum_price"])) {
    $query .= "
     AND prs BETWEEN '" . $_POST["minimum_price"] . "' AND '" . $_POST["maximum_price"] . "'
    ";
}

结果

enter image description here

1 个答案:

答案 0 :(得分:1)

您的列prsvarchar列(即它存储文本),而不是数字列(例如intmoney)。因此,数据库软件正在执行字典比较,而不是数字排序。

  • 更改数据库设计,以使用moneyint美分/便士来存储货币/货币值。
    • 请勿使用浮点类型(例如realfloatdouble等)存储货币值,因为它们不精确(请阅读IEEE-754的工作原理) 。
  • 此外,如上所述,您的代码对SQL Injection攻击非常开放。在这里阅读:What is SQL injection?How does the SQL injection from the "Bobby Tables" XKCD comic work?

  • 此外,由于以下原因,我建议避免使用x BETWEEN y AND z运算符:

    • ANDBETWEEN的含义与AND逻辑运算符不同,这意味着您需要仔细格式化代码,以使其易于阅读,以使人们不会混淆{ {1}},尤其是当对ANDy使用非平凡表达式时。
    • z运算符是使用包含边界还是排除边界并不是很明显。
    • 如果3个值中的任何一个都可以是BETWEEN,则无论如何您都需要使用单独的NULL比较,这将导致可怕的查询。
    • 因此,始终使用显式IS NULL几乎总是IMO更好的主意。