首先让我解释一下我的项目。在我的项目中,我有许多搜索参数,例如First Name
,Last Name
,Address
,Valid 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)){}
答案 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;
}
}
}
我希望这会对你有所帮助。