无法从输入字段之间的价格中选择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"] . "'
";
}
结果
答案 0 :(得分:1)
您的列prs
是varchar
列(即它存储文本),而不是数字列(例如int
或money
)。因此,数据库软件正在执行字典比较,而不是数字排序。
money
或int
美分/便士来存储货币/货币值。
real
,float
,double
等)存储货币值,因为它们不精确(请阅读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
运算符:
AND
中BETWEEN
的含义与AND
逻辑运算符不同,这意味着您需要仔细格式化代码,以使其易于阅读,以使人们不会混淆{ {1}},尤其是当对AND
或y
使用非平凡表达式时。z
运算符是使用包含边界还是排除边界并不是很明显。BETWEEN
,则无论如何您都需要使用单独的NULL
比较,这将导致可怕的查询。IS NULL
几乎总是IMO更好的主意。