【问题标题】:PHP/MYSQL advanced search script. How?PHP/MYSQL 高级搜索脚本。如何?
【发布时间】:2011-02-16 14:10:43
【问题描述】:

我需要一些指导来为我正在开发的网站制作高级搜索脚本。

我已经知道如何在数据库中搜索简单查询。我现在遇到的问题是如何在使用多个选择框时进行搜索。例如:

这只是一个具有不同搜索选项的简单表单。问题是:

访问者可以选择在一个国家或城市进行搜索,或者同时使用这三个选项。

如何在 PHP 脚本中捕捉到它?例如,我是否必须检查是否选择了一个城市,并基于此触发查询?但如果我这样做,我将不得不根据每个选择选项进行不同的查询。

在伪代码中会是这样的:(我想)

如果国家和城市等不为空,则启动查询以在数据库中的所有三个表中进行搜索。

但是如果只选择了国家,该怎么办?还是只是城市?

有没有一种简单的方法可以做到这一点?

提前致谢。

【问题讨论】:

  • 听起来您已经回答了自己的问题。
  • 嗯,实现这一点的简单方法是插入LuceneSphinx 之类的东西,但这可能取决于您对“简单”工作的定义:)
  • 在您的“伪代码”中,您提到城市和国家在不同的表格中。真的吗?或者它们是同一个表中的不同列?如果它们实际上位于单独的表中,则需要连接这些表,以便获得统一的结果集。
  • @sholsinger:这只是一些示例代码。我的数据库中没有任何国家/城市表。感谢您的回答! @Matt:谢谢伙计! @Andy:不,我没有。下面的其他答案回答了我的问题。 :)

标签: php mysql


【解决方案1】:

我喜欢使用数组来连接条件,因此我不必担心前导或尾随 AND。

$conditions = array();
if ($formCondition1) {
  $conditions[] = 'state = "'.$somevalue.'"';
}
if ($formCondition2) {
  $conditions[] = 'country = "'.$somevalue.'"';
}
...
if ($formConditionN) {
  $conditions[] = 'N = "'.$somevalue.'"';
}

//最后将条件连接在一起,最简单的情况是用AND(如果需要添加OR,听起来好像不需要,那么这段代码会复杂一点)

$sqlStatement = 'SELECT field1, field2 FROM tableABC WHERE '.implode(' AND ', $conditions);

编辑:不要忘记转义输入以防止注入攻击,当然还要在运行查询之前进行测试以确保至少有 1 个条件。 编辑:大声笑 jswolf 和我认为非常相似 :)

【讨论】:

  • 非常感谢您的详细解答。我想我会接受这个答案,即使其他两个工作也很好。非常感谢大家的帮助!
【解决方案2】:

我创建了一个$where 数组,根据需要将我的条件添加到其中,然后将implode 使用“AND”作为粘合剂。所以像:

$where = array();
if $city is defined
    $where[] = "city = '".mysql_real_escape_string($city)."'";
fi
if $country is defined
    $where[] = "country = '".mysql_real_escape_string($country)."'";
fi
...

if(count($where)) {
    $query.= ' WHERE '.implode(' AND ', $where);
}

【讨论】:

  • 看起来非常简洁优雅。谢谢!
  • 这就是我要找的东西!
【解决方案3】:

我会尝试类似:

$qry = "SELECT * FROM table WHERE ";
if ($country != '') {
    $qry .= "country='".mysql_real_escape_string($country)."' AND "
}
if ($city != '') {
    $qry .= "city='".mysql_real_escape_string($city)."' AND "
}
$qry .= '1';
$res = mysql_query($qry);

查询的建立取决于设置的内容。请注意查询字符串末尾的“1”始终为真。如果 $country 和 $city 都为空,则需要跟在“WHERE”之后,如果不是,则需要跟在最后一个“AND”之后。

【讨论】:

  • 非常感谢您的回答。我现在有 3 个不同的答案,它们都有效,我不知道该使用哪一个。再次感谢。
  • 我认为这是高级搜索概念的完美答案之一。感谢分享这个:)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2012-01-21
  • 2012-11-27
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多