我有5个变量,可以是true或false,我必须为每个不同的可能结果生成不同的sql SELECT语句。现在我有很多if else声明,但我想知道是否有更聪明的方法来做这个?
所以,例如,我有
if (x=true AND y=false AND z=false AND a=false AND b =false) {
$sql= "SELECT...."
} else if(x=true AND y=true AND z=false AND a=false AND b=false) {
$sql= "SELECT...."
}
第一个选择语句是用户输入文本而没有选择任何其他内容:
$sql="SELECT CompanyName, Keywords, Product, Industry, Link, region, hot FROM searchtest_tbl WHERE Keywords LIKE '%$formSearch%' OR CompanyName LIKE '%$formSearch%' OR Product LIKE '%$formSearch%' OR Industry LIKE '%$formSearch%' ORDER BY hot DESC, CompanyName";
这句话是指他们只选择了行业下拉列表:
$sql="SELECT CompanyName, Product, Industry, Link, hot, region FROM searchtest_tbl WHERE Industry='$formIndustry' ORDER BY hot DESC, CompanyName";
这是一个如果他们输入文字,选择了一个行业,但没有选择其他任何一个:
$sql="SELECT CompanyName, Product, Industry, Link, hot, region FROM searchtest_tbl WHERE Industry='$formIndustry' AND (Keywords LIKE '%$formSearch%' OR CompanyName LIKE '%$formSearch%' OR Product LIKE '%$formSearch%') ORDER BY hot DESC, CompanyName";
其余的基本上都是这样,但是如果选择了其他字段,它会说WHERE Product='$formProduct' AND
....等
答案 0 :(得分:1)
也许您可以将逻辑分解为更小的组件。例如,如果x=true
对应于select语句的特定部分,而y=false
对应于不同的部分,则逐个构建select语句:
$sql_statement = "SELECT ";
$sql_statement .= ($x) ? "`column_a` " : "`column_a`, `column_b` ";
$sql_statement .= "FROM ";
$sql_statement .= ($y) ? "`table_a` " : "`table_b` ";
如果这种方法不适合你,你可以发布额外的代码,以便我们做出更好的判断吗?
答案 1 :(得分:0)
我将立即出去并假设您的真假陈述与您的SQL无关,因为如果他们这样做,您可以简单地将它们替换为可以直接放入SQL的变量。例如
而不是真正的$x
变量意味着ASC
顺序而虚假变量意味着DESC
顺序。您可以创建一个新变量(我们称之为a
)并将值ASC
或DESC
放入其中。那样做而不是
if($x){
//sql
}
else{
//sql
}
你可以对
产生影响SELECT * FROM search $a;
现在,如果出于某种原因,这些变量是完全随机且不相关的。
你 使用ifs和ifs,我建议你更改代码以获得可理解性和逻辑性。但是如果您发布原始代码,或者至少是变量,我将能够帮助您。
答案 2 :(得分:0)
您可能需要考虑使用二进制数和按位运算符。
FLAG_1 = bindec('0001') = 1
FLAG_2 = bindec('0010') = 2
FLAG_3 = bindec('0100') = 4
FLAG_4 = bindec('1000') = 8
然后你可以使用按位运算符“|”
将所有标志组合成一个int所以如果标志2和4在
$combined_flags = (FLAG_2 | FLAG_4) = bindec('1010') = 10;
然后,您可以使用组合标志int来确定要生成的SQL语句
你甚至可以使用按位和&来测试各个标志。操作
if ($combined_flags & FLAG_2) // true
if ($combined_flags & FLAG_1) // false