如果你想在这里实现自动化,你应该使用另一种方法,这里最重要的是对事物进行分组
一个真实的例子
控制器
class So extends CI_Controller
{
public function so50157398()
{
if ($this->input->post())
{
$this->load->model('so/So50157398_model');
$this->So50157398_model->buildSearch($this->input->post('search'));
}
$this->load->view('so/so50157398');
}
}
查看(一个简单的样板引导模板)
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<div class="container">
<h1>Automatic Search Builder</h1>
<form method="post">
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputEmail4">Email</label>
<input type="email" name="search[or_where][email]" class="form-control" id="inputEmail4" placeholder="Email">
</div>
<div class="form-group col-md-6">
<label for="inputPassword4">Password</label>
<input type="password" name="search[or_where][password]" class="form-control" id="inputPassword4" placeholder="Password">
</div>
</div>
<div class="form-group">
<label for="inputAddress">Address</label>
<input type="text" class="form-control" name="search[where][address]" id="inputAddress" placeholder="1234 Main St">
</div>
<div class="form-group">
<label for="inputAddress2">Address 2</label>
<input type="text" class="form-control" name="search[where][address2]" id="inputAddress2" placeholder="Apartment, studio, or floor">
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputCity">City</label>
<input type="text" class="form-control" name="search[where][city]" id="inputCity">
</div>
<div class="form-group col-md-4">
<label for="inputState">State</label>
<select id="inputState" name="search[where][state]" class="form-control">
<option selected>Choose...</option>
<option>Option 1</option>
<option>Option 2</option>
<option>Option 3</option>
</select>
</div>
<div class="form-group col-md-2">
<label for="inputZip">Zip</label>
<input type="text" name="search[where][zip]" class="form-control" id="inputZip">
</div>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
</body>
</html>
型号
class So50157398_model extends CI_Model
{
private $arrAllowedFields = ['email', 'password', 'address', 'address2', 'city', 'state', 'zip'];
public function buildSearch($arrSearchFields)
{
$this->db
->select('*')
->from('records');
foreach($arrSearchFields AS $key => $arrFields)
{
$this->buildQuery($key, $arrFields);
}
echo $this->db->get_compiled_select();
}
private function buildQuery($group, $arrFields)
{
$this->db->group_start();
foreach($arrFields AS $key => $value)
{
if (in_array($key, $this->arrAllowedFields)) $this->db->$group($key, $value);
}
$this->db->group_end();
}
}
如您所见,我已将输入字段分组为不同类别(例如,在本例中为 or_where、where)
如果您采用这种方法,那么在不构建冗余代码片段的情况下构建动态搜索非常简单
当然,您必须进行一些实地检查 - 但就此而言,您应该使用 Form_Validation 库。