2015-01-13 113 views
0

我有一个这样的日子,MySQLi编写条件语句

我有四个可能的变量,只有其中一个是必需的。我的问题是,如果有可能显示或不显示的部分查询,我该如何准备一个语句/构造sql查询。

这样的事情,我想:

sql = "SELECT * FROM dogs WHERE name = ?" 
if(isset($dogid)) { 
sql .= "AND WHERE id = ?"; 
} 

} 
if(isset($dogcolour)) { 
sql .= "AND WHERE colour = ?"; 
} 

我的大脑完全打破了,我想,必须有一个更好的方法比使用类似$ dogID =“true”以做准备;在每个if中,然后用一堆if语句绑定它。

MySQL显然有办法处理这个,我只是不记得那是什么。

谢谢。

+0

留出空间,它出来'WHERE name ='blah'AND..'但并没有什么错有条件构建查询 – Mihai

+0

严,我不认为有一个问题与建设它,但我认为必须比做$ bind_params。=“s”,$ bind_params。=“i”;等等,以及$ bind_vars。='$ id'; $ bind_vars。=“$ color”等全部在不同的if(){}中 - –

+0

如果你正在用低级别的'mysqli'抨击,这是实现它的方法。您可以通过在数组中组合条件来简化它,然后在最后一步使用“AND”将它们连接在一起。更好的方法是使用像[Laravel](http://laravel.com/)这样的[开发框架](http://codegeekz.com/best-php-frameworks-for-developers/)具有强大的ORM,简化了描述过滤器的方法。 – tadman

回答

1

那么我会定义一些空值,然后检查数据库中的所有内容。

$sql = "SELECT * FROM dogs WHERE (IF(? = 0, 1 = 1, name = ?)) AND (IF(? = 0, 1 = 1, colour = ?))" 

这个解决方案有一个缺点,你需要传递所有参数两次:

$statement->bind_param('ssss', $name, $name, $colour, $colour); 

如果名称或$颜色变量是0,那么1 = 1是在陈述(巫女始终是真实的)执行。应该有可能性将NULL值传递给mysqli,但是对于我来说它不起作用,如果它工作的话可以简化查询。在与运算之前

$sql = "SELECT * FROM dogs WHERE name = (IFNULL(?, name)) AND colour = (IFNULL(?, colour))" 
+0

这是一个聪明的做法,但可能太聪明了一半。我注意到,由于条件的动态特性,可以正确使用索引,因此可能需要非常昂贵的表扫描。 – tadman