在数据库中搜索php jquery ajax的许多参数

时间:2015-02-27 04:09:02

标签: php jquery mysql ajax

首先让我解释一下我的项目。在我的项目中,我有许多搜索参数,例如First NameLast NameAddressValid ID。这些是我从用户那里搜索数据库的参数。我让用户可以灵活地使用4 parameters or 3 or 2 or 1搜索数据库,具体取决于用户。增加搜索参数会降低搜索范围。目前我搜索数据库的方式是检查每个参数。我有所有可能性或所有4个参数的组合。

4 combinations of using 1 parameter

6 combination of using 2 parameters

4 combinations of using 3 parameter

1 for using 4 parameters

总共给我15 if statements。是否有一个更简洁的方法来制作它?我问这个,因为现在我正在制作7个参数,组合非常大。

在代码中它看起来像这样

if(!empty(fname)){}
else if(!empty(lname)){}
else if(!empty(address)){}
else if(!empty(vid)){}
else if(!empty(fname) && !empty(lname)){}
else if(!empty(fname) && !empty(address)){}
else if(!empty(fname) && !empty(vid)){}
else if(!empty(address) && !empty(lname)){}
else if(!empty(vid) && !empty(lname)){}
else if(!empty(adress) && !empty(vid)){}
else if(!empty(fname) && !empty(lname) && !empty(address)){}
else if(!empty(fname) && !empty(lname) && !empty(vid)){}
else if(!empty(fname) && !empty(add) && !empty(vid)){}
else if(!empty(lname) && !empty(add) && !empty(vid)){}
else if(!empty(fname) && !empty(add) && !empty(vid) && !empty(lname)){}

3 个答案:

答案 0 :(得分:1)

Try this code.

 <?php
    //parameters
    $First_Name="val1";
    $Last_Name="val2";
    $Address="val3";
    $Valid_ID="";
    $Age="val5";
    $Gender="val6";
    $Dob="val7";
    //push the parameter names to array
    $parms=array("First_Name","Last_Name","Address","Valid_ID","Age","Gender","Dob");
    //iterate parameter name
    foreach($parms as $s){
        //check whether the parameter value is not empty
         if(!empty(${$s})){
            //your sql where condition
          echo $s.'='.${$s}."<br>"; //here it will print only non empty param and values
          }
    }
 ?>

答案 1 :(得分:0)

在变量中写入选择查询,然后将其附加到下面给出的条件,然后追加(和/或)关键字,直到最后一个参数之前。

   $qry="select * from table where ";
    $i=0;
    $paramcount=0;
     $cond=array(); //condition paramters
    foreach($parms as $c){
         if(!empty(${$c})){
             $paramcount++; //non empty parameters count
             $cond[]= $c.'="'.${$c}.'"';    //condition parameters 
      }
    }
    foreach($cond as $s){
        if($i<$paramcount-1){
        $qry=$qry.$s." and "; //appending add/or keyword with sql query
    }
    else{
        $qry=$qry.$s; //if last parameter means append parameter without and/or keyword
    }
        $i++;
    }

   echo "Final Query is --><br> ".$qry;

答案 2 :(得分:0)

你真的需要控制每个组合状态。如果是这样,使用标志变量,按位运算符和case语句可以更方便。 即便如此,我建议改变你的算法。使用更灵活的东西。比如开发一个类处理所有逻辑,将所有参数设置为默认值并动态创建SQL查询字符串。

这是我的代码,来自与您类似的项目。我在laravel上使用了DB Query Builder类。

class recSQL {

    protected $recFinder;

    // $search_criteria is an instance of a class that 
    // contains default paramaters and overriden by user input parameters

    public function findRec($search_criteria, $sort_criteria)
    {
        $this->recFinder = DB::table('myTable')
            ->join('users', 'recs.user_id', '=', 'users.id')
            ->join('placelar', 'recs.place_id', '=', 'placelar.id')
            ->join('nested_categoris', 'recs.cat_id', '=', 'category.id')
            ->select(   'recs.user_id', 
                        'users.name as user_name',
                        'recs.id', 
                        'recs.baslik', 
                        'recs.price', 
                        'recs.durum_id', 
                        'category.name as category_name',
                        'recs.updated_at as date',
                        'placelar.ad as place');
        $this->applySearchCriteria($search_criteria);
        $this->applySortCriteria($sort_criteria);
        return $this->recFinder->paginate(3);
    }



    protected function applySearchCriteria($search_criteria)
        {
            // the parameters that allways in query
            $this->recFinder->where('recs.price', '<', $search_criteria->max_price());
            $this->recFinder->where('recs.price', '>', $search_criteria->min_price());
            $this->recFinder->where('recs.durum_id', '=', $search_criteria->durum());
            // the parameters if exists add to query
            if($search_criteria->place()) {
               $this->recFinder->where('recs.place_id','=', $search_criteria->place());}
            if($search_criteria->size()) {
               $this->recFinder->where('recs.size_id','=', $search_criteria->size());}
            if ($search_criteria->category()>0) {
                $secilen_category = Nestedcategory::where('id',$search_criteria->category())->first();
                $this->recFinder->where('category.lft','>=' , $secilen_category->lft);
                $this->recFinder->where('category.rgt','<=' , $secilen_category->rgt);
            }
        }



    protected function applySortCriteria($sort_criteria)
        {
            switch ($sort_criteria)
            {
                case Sirala::$dateasc:
                    $this->recFinder->orderBy('recs.updated_at', 'asc');
                    break;
                case Sirala::$datedesc:
                    $this->recFinder->orderBy('recs.updated_at', 'desc');
                    break;
                case Sirala::$priceasc:
                    $this->recFinder->orderBy('recs.price', 'asc');
                    break;
                case Sirala::$pricedesc:
                    $this->recFinder->orderBy('recs.price', 'desc');
                    break;
                // default:
                   // handle error;
            }
        }

}

我希望这会对你有所帮助。