gpt4 book ai didi

php - MySQLi:如果输入为空,则选择价格范围

转载 作者:行者123 更新时间:2023-11-28 23:26:59 25 4
gpt4 key购买 nike

我有 2 个变量来定义查询的价格范围。我要解决的问题是当这些未设置时,在这种情况下我想显示所有行(如果下边界为空,则从 1 开始,如果上边界为空,则到 max(price))。

我试过 ifnull,但没有成功。

$priceFrom = $_POST['priceFrom'];
$priceTo = $_POST['priceTo'];

if(is_null($priceFrom) || is_null($priceTo)){
$priceFrom = 0;
$priceTo = 0;
}
$mass = array();
foreach($data as $current){
$sql = "SELECT p.price,
p.type,
p.area,
p.floor,
p.construction,
p.id as propertyID,
CONCAT(u.name, ' ',u.family) as bname,
p.type as ptype,
n.name as neighborhoodName,
CONCAT(o.name,' ',o.surname,' ',o.family) as fullName
FROM `property` p
LEFT JOIN `neighbour` n ON p.neighbour = n.id
RIGHT JOIN `owners` o ON p.owner = o.id
LEFT JOIN users u ON p.broker = u.id
WHERE `neighbour`= '$current'
AND `price` BETWEEN ifnull('$priceFrom', '1') AND ifnull('$priceTo','2000000')
";}

最佳答案

SQL 注入(inject)

^ 请用谷歌搜索!您的代码严重易受攻击!您的数据可能会被盗或删除...

您必须至少使用 mysqli_real_escape_string() 清理您的输入

更好的方法是 take proper countermeasures to SQL injection并使用准备好的语句和参数化查询! (如下代码所示)


我认为最好的方法是根据变量的值更改查询来处理逻辑:

$sql = "SELECT  p.price,
p.type,
p.area,
p.floor,
p.construction,
p.id as propertyID,
CONCAT(u.name, ' ',u.family) as bname,
p.type as ptype,
n.name as neighborhoodName,
CONCAT(o.name,' ',o.surname,' ',o.family) as fullName
FROM `property` p
LEFT JOIN `neighbour` n ON p.neighbour = n.id
RIGHT JOIN `owners` o ON p.owner = o.id
LEFT JOIN users u ON p.broker = u.id
WHERE `neighbour`= :current "; //note: ending white space is recommended

//lower boundary clause -- if variable null - no restriction
if(!is_null($priceFrom){
sql = sql . " AND `price` >= :priceFrom "; // note: whitespace at end and beginning recommended
}

//upper boundary -- better than to set it to an arbitrary "high" value
if(!is_null($priceTo)){
sql = sql . " AND `price` <= :priceTo "; // note: whitespace at end and beginning recommended
}

这种方法允许任何上限值:如果通货膨胀严重,货币不同,或者突然用code卖housese,会有价格>200000的产品,你不用出门并更改大量代码以使其显示...

执行查询当然需要绑定(bind)参数:

$stmt = $dbConnection->prepare(sql);
$stmt->bind_param('current', $current);
if(!is_null($priceFrom)){
$stmt->bind_param('priceFrom', $priceFrom);
}
if(!is_null($priceTo)){
$stmt->bind_param('priceTo', $priceTo);
}
//execute and process in same way
$stmt->execute();

另请注意:从您的代码看来您是在循环中发出查询。这是不好的做法。如果你循环的数据来了

  • 来自数据库 --> 使用 JOIN
  • 来自数组或代码的其他位置 --> 最好对元素使用 IN 子句

通过一次查询获取所有数据。这对组织和维护代码有很大帮助,并且在大多数情况下通常会带来更好的性能。

关于php - MySQLi:如果输入为空,则选择价格范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38922837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com