我有一个搜索表单,可能有15个左右的字段,但并不是所有字段都需要进行搜索,例如;
用户可能会在“伦敦”中搜索“财务”中的注册用户,但将所有其他字段留空,例如$ availability或$ salary等,因此$ _POST数据可能如下所示:
$location = $_POST['location']; // Value - London
$sector = $_POST['sector']; // Value - Finance
$available = $_POST['available']; // Value - Any
$salary = $_POST['salary']; // Value - Any
请记住,我可能还有另外12个左右来自其他字段的'Any'值,查询数据库(PHP / MySQL)返回结果的最佳方法是什么,而不会循环查看可能有几十个查询的内容。 / p>
为了尝试并且更清楚一点,我想要的是一个类似(故意伪代码)的查询:
SELECT * FROM table where location = 'location' AND if($availability !='Any') { available = '$available' } etc etc
这样的事情可能吗?
或者我可以创建一个包含所有$ _POST字段的单个字符串!='Any'然后对包含字符串中所有单词的行进行搜索(我认为理论上会起作用)?
我希望这对某人有意义,你可以指出我正确的方向。
P.S。在与数据库交互之前,所有$ _POST都被转义和保护,这里不包括:)
答案 0 :(得分: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
答案 1 :(得分:1)
为了论证的缘故,您可以将所有$ _POST收集到foreach($ key => $ val)中,然后通过开关运行密钥,或者如果将“AND x = x”附加到语句中吗? / p>
类似的东西:
$sql = "SELECT * FROM table WHERE required='required'";
foreach($_POST as $key=>$val){
if(!empty($val)){ $sql .= " AND ".$key."='".$val"'"; }
}
不确定这是否有效但理论上这是我首先想到的。
答案 2 :(得分:0)
感谢那些提供答案的人,但是我使用了上述链接中的建议答案,因为它对我来说更清楚。粘贴在FYI下方的示例代码:
$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的地方。