【发布时间】:2016-07-13 08:10:12
【问题描述】:
我正在尝试根据发布的值获取数据库。这是一个属性网站,一个名为 attr 的列具有 json 数据。这就是我获取数据的方式
if(isset($_POST['search'])){
$proptpe = $_POST['proptype'];
$q= mysqli_query($connect,"SELECT * FROM properties");
$savemyval = array();
while($row= mysqli_fetch_assoc($q)) {
$data = json_decode($row['attr']);
if($proptpe == $data->proptype) {
$savemyval[] = $row['id'];
}
$myquery = '';
foreach($savemyval as $arr){
$myquery.= '`id` = '.$arr.' OR ';
}
$myquery = rtrim($myquery, " OR ");
$type = $_POST ['optionsRadios'];
if(isset($_POST['unit_type'])){
$unit_type = $_POST['unit_type'];
}
else {
$unit_type = '';
}
$min_price = $_POST['min_price'];
$max_price = $_POST['max_price'];
$min_bedroom = $max_bedrooms = '';
if(isset($_POST['res_min_bed'])){
$min_bedrooms=$_POST['res_min_bed'];
}
else{
$min_bedrooms='';
}
if(isset($_POST['res_max_bed'])){
$max_bedrooms = $_POST['res_max_bed'];
}
else{
$max_bedrooms='';
}
if(isset($_POST['com_min_size'])){
$min_size=$_POST['com_min_size'];
}
else{
$min_size='';
}
if(isset($_POST['com_max_size'])){
$max_size=$_POST['com_max_size'];
}
else{
$max_size='';
}
$query= "SELECT * FROM properties WHERE 1=1";
if($type != ""){
$query.=" AND type= '{$type}'";
}
if($unit_type!=""){
$query.=" AND unit_type='$unit_type'";
}
if(($min_price!="") && ($max_price!="")){
$query.=" AND price BETWEEN {$min_price} AND {$max_price} ";
}
if($proptpe){
if($myquery != ''){
$query.=" AND ".$myquery;
}
}
if($min_bedrooms != "" && $max_bedrooms != ""){
if($myquery != ''){
$query.=" AND ".$myquery;
}
}
if(($min_size!="") && ($max_size!="")){
$query.=" AND size BETWEEN {$min_size} AND {$max_size}";
}
if($query==FALSE){
echo mysqli_error($connect);
die;
}
else {
$result = mysqli_query($connect,$query);
}
echo $query;
die;
}
当我打印查询时,我只从数据库中获取商业类型的第一条记录,对于住宅类型,我获取所有可用记录,
如果我为发布的值执行 print_r,这就是我得到的
Array
(
[optionsRadios] => sale
[unit_type] =>
[min_price] =>
[max_price] =>
[res_min_bed] =>
[res_max_bed] =>
[proptype] => commercial
[search] => Search
)
Array ([0] => 42) SELECT * FROM properties WHERE 1=1 AND type= 'sale' AND
id= 42
在这方面需要你的帮助
【问题讨论】:
-
请正确缩进你的代码,这样更容易阅读。
-
警告:当使用
mysqli时,您应该使用parameterized queries 和bind_param将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿将$_POST或$_GET数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 -
有什么问题?您的查询 where 子句的 id=42 所以它只返回一行。
-
值得注意的是,像 Doctrine 或 Propel 这样的 ORM 使这样的查询变得更加容易。更好的是 development frameworks 可以帮助您更好地组织代码。 Laravel 对初学者非常友好,并且有大量用于临时搜索的社区代码。
-
Sikander 如果其中一个答案对您有帮助,请选择它(如果您愿意,请点赞)。研究、测试和撰写这些答案需要时间。