如何在php中动态添加多个WHERE子句
我有五个输入字段,即技能、位置、公司、经验和薪水。根据用户需求,我将从数据库中获取值。我的问题是,如何动态地使用where条件?考虑用户在技能和公司输入字段中输入值,我想从数据库中获得这些值该怎么做?现在我保留了20个if条件来解决这个问题如何在php中动态添加多个WHERE子句,php,mysql,Php,Mysql,我有五个输入字段,即技能、位置、公司、经验和薪水。根据用户需求,我将从数据库中获取值。我的问题是,如何动态地使用where条件?考虑用户在技能和公司输入字段中输入值,我想从数据库中获得这些值该怎么做?现在我保留了20个if条件来解决这个问题 public function get_jobonline($skillname,$userid,$location) { $company=$this->input->post('searchcompany'); $experi
public function get_jobonline($skillname,$userid,$location)
{
$company=$this->input->post('searchcompany');
$experience=$this->input->post('experience');
$salary=$this->input->post('salary');
echo $company;
if($location==NULL)
{
$query=$this->db->query("SELECT j.id AS job_id, j.created_date,j.title, l.city AS location, cm.name AS company_name,
cm.logo FROM `jobs` AS j
LEFT JOIN `keyword` AS k ON `k`.`job_id` = `j`.`id`
LEFT JOIN `keyword_master` AS km ON `km`.`id` = `k`.`keyword_id`
LEFT JOIN `location_master` AS l ON `l`.`id` = `j`.`location`
LEFT JOIN `company_master` AS cm ON `cm`.`id` = `j`.`company_id`
WHERE km.name = '$skillname' AND j.uid='$userid'
;");
}
else
{
$query=$this->db->query("SELECT j.id AS job_id, j.created_date,j.title, l.city AS location, cm.name AS company_name,
cm.logo FROM `jobs` AS j
LEFT JOIN `keyword` AS k ON `k`.`job_id` = `j`.`id`
LEFT JOIN `keyword_master` AS km ON `km`.`id` = `k`.`keyword_id`
LEFT JOIN `location_master` AS l ON `l`.`id` = `j`.`location`
LEFT JOIN `company_master` AS cm ON `cm`.`id` = `j`.`company_id`
WHERE km.name = '$skillname' AND j.uid='$userid' AND l.city='$location'
;");
}
// if($company != NULL && )
return $query->result_array();
}
如果我理解正确,您希望根据用户输入动态更改查询。 要做到这一点,你应该把查询本身和查询的函数分开 伪代码中的Ex:
// Let's suppose it's your base query
// (that meets the minimum field required to do the research).
$sql = "SELECT j.id AS job_id, j.created_date,j.title,... WHERE
km.name = '$skillname'";
// U add the condition skill if the user typed it
if(isset($_POST['skill'])
$sql .= "AND j.skill = '$_POST['skill']'";
... (for every input filled u add condition to the query)
// WHEN all input u needed to add are tested
// Query the DB
$query = $this->db->query($sql);
你甚至可以做得更好,制作一个包含所有输入名称字段的数组,以便在其上循环。查询是字符串(几乎,请继续阅读)。您可以使用字符串处理创建它们。如果你看一下由这样的软件生成的查询,你会发现它们经常被读取
WHERE 1=1 AND name='value' and address = 'street' and job = 'driver'
等等。其中1=1
部分是一个提示,用于生成查询的代码如下所示:
$q = "SELECT something JOIN something ON something...WHERE 1=1 ";
if (isset($val1)) $q .= " AND name= '$val1'";
if (isset($val2)) $q .= " AND street = '$val2'";
if (isset($val3)) $q .= " AND job = '$val3'";
if(!($result = db->query($q)) {
/* error */
} else {
/* process the resultset */
}
WHERE 1=1
是一种黑客行为,它可以确保即使没有搜索条件,查询也是有效的:即使if
语句都不是真的。这有点难看,但SQL理解这一点,不会让查询花费更多时间
如您所见,此策略会根据用户提供的查询参数向查询中添加数量可变的AND子句
这个例子只有一个问题。它不使用绑定变量,因此可以进行SQL注入。可以通过在
if
语句系列中建立一系列绑定变量以及和column=?
子句来解决这个问题 使用和/或运算符!!这个问题太模糊了,无法很好地回答。它基本上是问:SQL查询中的WHERE操作符是如何工作的。试着让你的问题更具体,例如通过添加代码的相关部分。这可能有助于得到一个有意义的答案,这对你真正的问题有帮助。。。您要求的是SQLInjection谢谢,如果我使用上述方法,是否可以添加多个和子句是的,这就是问题所在。