PHP:编码“高级搜索”的最佳方式

时间:2010-10-02 13:37:24

标签: php search

好的,我想就如何以正确的方式对配置文件进行高级搜索编码提出一些建议。

“高级”搜索包含:

Gender   female/both/male
Search in    All/latest profiles 1/2/7/14/32 days ago
Online: Yes(checked)
Age (xx) to (xx) years (xx means you can write e.g 12 and 18)
Cities: all/city1/city2/city3

您可以选择许多标准。

我想知道如何以最有效的方式对此进行编码,并且代码重复次数最少。我应该根据用户选择的内容构建查询吗?例如:

$query = "SELECT * FROM users WHERE"
if(!empty($gender){ // if its empty, then the user chose both..
    $query .= "gender = $gender";
}
....

或者有更好的解决方案吗?我认为这样做会导致问题,因为如果用户没有选择任何性别,而另一个如果$ online(示例)以AND开头,则会产生WHERE AND ..

3 个答案:

答案 0 :(得分:0)

我认为您的解决方案是一个良好的开端。继续检查高级搜索字段,并根据需要构建SQL where子句。

如果你需要做模糊逻辑,那就会出现问题 - 男性或城市1。但你没有在你的OP中表明这一点。

要避免WHERE AND只使用true表达式启动where子句:

$query = "SELECT * FROM users WHERE 1"

这将始终评估为true,当您添加更多条件时,它们会正确追加 - SELECT * FROM users WHERE 1 AND city = 'city1'

答案 1 :(得分:0)

“和”问题很容易解决:

$andArr[] = "gender = $gender";
$andArr[] = "age between $from and $to";
...

$adsString = implode(' AND ', $andArr);

对于性别,我会使用“两者”作为预选的下拉列表。

答案 2 :(得分:-1)

请不要编写允许SQL injections的代码。另外,请确保您的PHP代码与register_globals set to off一起运行。除此之外,我认为没有任何理由不这样做。

所以这是一个简单的例子,使用PDO

$query = 'SELECT * FROM users WHERE 1';
$params = array();
if (!empty($_POST['gender'])) {
    $query .= ' AND gender=:gender'
    $params[':gender'] = $_POST['gender'];
}
...
$st = $pdo->prepare($query);
$result = $st>execute($params);
相关问题