【问题标题】:PHP : Getting only first record from database in arrayPHP:仅从数组中的数据库中获取第一条记录
【发布时间】: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 queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET 数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 有什么问题?您的查询 where 子句的 id=42 所以它只返回一行。
  • 值得注意的是,像 DoctrinePropel 这样的 ORM 使这样的查询变得更加容易。更好的是 development frameworks 可以帮助您更好地组织代码。 Laravel 对初学者非常友好,并且有大量用于临时搜索的社区代码。
  • Sikander 如果其中一个答案对您有帮助,请选择它(如果您愿意,请点赞)。研究、测试和撰写这些答案需要时间。

标签: php mysql sql arrays


【解决方案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 的同一循环中生成 SQL
  3. 不应以这种方式累积 ID。为什么不使用 SQL 来完成这一切?
  4. 使用一些有意义的方法创建类并进行关注点分离。了解您要做什么并不容易。数据检索、SQL 生成、搜索逻辑和控制器逻辑不应处于一个循环中。
  5. 正确转义 POST 值。正如 tadman 提到的,SQL 注入是该代码中的一个问题

【讨论】:

  • 我支持你直到 die 部分。没有理由在正确编写的 PHP 代码中调用它。这是一个极端的措施。
【解决方案2】:

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

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

当您使用以下行将$myquery 附加到$query 时,您的ORAND 子句之间没有分隔:

$query.=" AND ".$myquery;

您应该将不同的部分用括号括起来。不要将查询的 ID 部分写为id=1 OR id=2...,而是使用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));

无论如何,这只是一种味道。再次我的建议。重新开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-03
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多