尝试使用PHP创建动态生成的mySQL select语句

时间:2011-06-13 15:33:42

标签: php mysql select

我有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 ....等

3 个答案:

答案 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)并将值ASCDESC放入其中。那样做而不是

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