0

我有一个可能包含 15 个左右字段的搜索表单,但并非所有字段都需要执行搜索,例如;

用户可能会在 'London' 中搜索在 'Finance' 工作的注册用户,但将所有其他字段留空,例如 $availability 或 $salary 等,因此 $_POST 数据可能类似于:

$location = $_POST['location'];    // Value - London
$sector = $_POST['sector'];        // Value - Finance
$available = $_POST['available'];  // Value - Any
$salary = $_POST['salary'];        // Value - Any

请记住,我可能还有来自其他字段的另外 12 个左右的“任何”值,查询数据库(PHP/MySQL)以返回结果而不循环可能是几十个查询的最佳方法是什么。

为了尝试更清楚一点,我想要的是一个类似于(故意伪代码)的查询:

SELECT * FROM table where location = 'location' AND if($availability !='Any') { available = '$available' } etc etc

这样的事情可能吗?

或者我可以创建一个包含 !='Any' 的所有 $_POST 字段的单个字符串,然后对包含字符串中所有单词的行进行搜索(我认为这在理论上可行)?

我希望这对某人有意义,您可以为我指明正确的方向。

PS 所有 $_POST 在与数据库交互之前都被转义和保护,只是不包括在这里:)

4

3 回答 3

2

试试这个:

$sql = "SELECT * FROM table where 1 ";
foreach ($_POST as $key => $post) {
    if ($post != 'Any') {
        $sql .= " AND $key = '$post' ";
    }
}

// now you can run $sql against the database
于 2013-03-05T21:15:48.717 回答
1

您是否可以将所有 $_POST 收集到 foreach($key=>$val) 中,然后通过 switch 或 if 语句将“AND x=x”附加到语句中运行密钥?

就像是:

$sql = "SELECT * FROM table WHERE required='required'";
foreach($_POST as $key=>$val){
if(!empty($val)){ $sql .= " AND ".$key."='".$val"'"; }
}

不确定这是否有效,但理论上这是我首先想到的。

于 2013-03-05T21:16:28.200 回答
0

感谢那些提供答案的人,但是我使用了问题上方链接中的建议答案,因为它对我来说更清楚。粘贴在下面的示例代码仅供参考:

$tmp = "where ";
if($A and $A!="any" and $A!="not used")
$tmp .= "row1 = '".$A."'";
if($B and $B!="any" and $B!="not used")
$tmp .= "AND row2 = '".$B. "'";
if($C and $C!="any" and $C!="not used")
$tmp .= "AND row3 = '".$C."'";
$db_q = "Select * from table $tmp"; 

再次感谢,不知道没有 SO 我会在哪里。

于 2013-03-06T12:05:57.243 回答