2011-06-13 135 views
0

我有5个变量,可以是真或假,我要为每一个不同的可能结果不同的SQL SELECT语句动态生成的MySQL的SELECT语句。现在我有一吨,如果else语句,但我想知道孤单如果一个更聪明的方式来做到这一点?试图使用PHP创建

因此,例如,我有

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...." 
} 

第一个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"; 

,这里是一个,如果他们输入的文本,选择一个INDUST RY,但没有选择anythign其他:

$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 ....等

+3

什么是Select语句?也许Select语句本身可以处理这些情况,但是我们需要确切地看到您在Select – Veign 2011-06-13 15:35:49

+0

中尝试使用开关/外壳进行的尝试。 – kinakuta 2011-06-13 15:36:09

+0

您需要发布sql语句的示例以获得最佳结果。 – Kzqai 2011-06-13 15:36:27

回答

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` "; 

如果这种方式不适合你,你可以发布额外的代码,所以我们可以做出更好的判断?

+0

我喜欢这种方法。我打算把它分解成一个if/else语句,它将写入sql语句的部分。天才! – SQLnoob 2011-06-13 15:55:15

0

我要去的权利,并假设你的真实和虚假陈述不涉及您的SQL,因为如果他们这么做,你可以简单地说,可以直接放入你的SQL变量替换它们。例如

而不是真正的$x变量意味着ASC命令和虚假变量意味着DESC命令。你可以创建一个新的变量(我们就叫它a),并把价值ASCDESC在里面。通过这种方式,而不必

if($x){ 
    //sql 
} 
else{ 
    //sql 
} 

你可以有对成才的

SELECT * FROM search $a; 

现在的效果,如果由于某种原因,这些变量是完全随机的,不相关的。

而你使用ifs和其他ifs,我会建议改变你的代码的可理解性和逻辑。但是如果你发布你的原始代码,或者至少是变量,我将能够帮助你。

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 
+0

你也可以在MySQL中使用按位运算符 – dqhendricks 2011-06-13 15:48:27