PHP:从数组

时间:2016-07-13 08:10:13

标签: php mysql sql arrays

我正在尝试根据发布的值获取数据库。这是一个属性网站,一个名为attr的col具有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
)
  

数组([0] => 42)SELECT * FROM属性WHERE 1 = 1 AND   type ='sale'和id = 42

需要你的帮助

2 个答案:

答案 0 :(得分:1)

您正在做的是以下内容:

 For all database records
    If proptype is what you selected in form then
        Accumulate ID in array savemyval
    Immediately loop through savemyval
        Generate some SQL
    ...
    die() statement

这里几个问题:

  1. 您正在退出第一个主循环
  2. 您正在累积ID
  3. 的同一循环上生成SQL
  4. ID不应以这种方式累积。为什么不用SQL来做这一切呢?
  5. 使用一些有意义的方法创建类,并分离关注点。要理解你想要做什么并不是直截了当的。数据检索,SQL生成,搜索逻辑和控制器逻辑不应该在一个循环中。
  6. 正确退出POST值。正如tadman所提到的,SQL注入是该代码中的一个问题

答案 1 :(得分:0)

我的建议是重新开始;这段代码构造不良,有很多错误。如果您想继续尝试修补它,我会在下面粘贴我的反馈:

您的代码存在很多问题。我抓到了其中一些,但可能会有更多。

使用以下行将OR AND附加到$myquery时,您的$query$query.=" AND ".$myquery; 条款之间没有分开:

id=1 OR id=2...

您应该将不同的部分包装在括号中。不要将查询的ID部分写为id IN (1,2...),而是使用foreach($savemyval as $arr){ $myquery.= '`id` = '.$arr.' OR '; } $myquery = rtrim($myquery, " OR ");

替换:

$myquery = "`id` IN (".implode(",",$savemyval).")";

使用:

$min_bedroom = $max_bedrooms = '';

稍后你有这一行:

$min_bedrooms

我认为你的意思是复数$myquery

稍后您将$query添加到if($proptpe){ if($myquery != ''){ $query.=" AND ".$myquery; // append $myquery here } } if($min_bedrooms != "" && $max_bedrooms != ""){ if($myquery != ''){ $query.=" AND ".$myquery; // do the same here?? } } 两次。我不确定原因:

AND bedroom BETWEEN $min_bedrooms and $max_bedrooms

我认为你的意思是if($query==FALSE){ echo mysqli_error($connect); die; }

后来你写道:

false

我不明白为什么它会等于$query?此时if(mysqli_query($connect,$query)===false) die(mysqli_error($connect)); 只是一个字符串;你从未执行过查询。你是说这个吗?

eg:
------------------------
| Program | Module      |
------------------------
| I       | 1,2,3       |
------------------------
| II      | 2, 3        |
------------------------
| III     | 1,3         |
------------------------

无论如何这只是一种品味。我的建议。重新开始。