PHP高级搜索

时间:2012-01-10 01:21:30

标签: php mysql database

我目前正在建立一个网站,我需要一个非常先进的搜索引擎。我希望用户能够说Person @ companyProduct @ Category。我如何检测@符号或任何特殊字符,过滤掉它们并根据返回的字符串创建单个变量。所以$a = Person$b = company

3 个答案:

答案 0 :(得分:1)

将其作为格式为a = Person& b = company等的get请求发送。另一种方式正是您所说的,循环遍历字符串并逐个检查字符。当你遇到@符号时,你知道它前面的字母(不包括空格)是a的值,而@(不包括空格)之后的所有内容都是b的值。

抱歉,我尽可能地保持清醒。

答案 1 :(得分:1)

您可以使用explode()拆分字符串:

$items = explode('@', 'Person @ Company', 2);

if(count($items) === 2) {
    // Person @ Company
    $person = trim($items[0]);
    $company = trim($items[1]);
    // Do your searching here...
} else {
    // Search normally, not Person @ Company.
}

答案 2 :(得分:0)

这很容易实现;

function searchForPersonAtCompany($searchQuery) {
    global $db;

    $queryComponents = explode('@', $searchQuery, 2);

    if (count($queryComponents) != 2) {
        // '@' was not specified in the search query, return an empty array.
        return array();
    }

    $person = $queryComponents[0];
    $company = $queryComponents[1];

    $sql = 'SELECT p.id AS personId, c.id AS companyId FROM people p JOIN companies c ON p.company = c.id WHERE p.name LIKE :person AND c.name LIKE :company';
    $stmt = $db->prepare($sql);
    $stmt->bindValue(':person', $person);
    $stmt->bindValue(':company', $company);
    $stmt->execute();

    return $stmt->fetchAll();
}

您没有指定数据库架构,因此我不得不猜测您有一个people表和一个companies表,其中的人员与公司表格中的company相关联领域。

Table: People
id | name              | company
--------------------------------------------
 1 | Alice             | 1
 2 | Bob               | 1
 3 | Charles           | 2

Table: Companies
id | name              
--------------------------------------------
 1 | Company A       
 2 | Company B

您必须根据自己的需要调整代码,但使用我的测试数据时,以下内容应该有效;

searchForPersonAtCompany('Alice@Company A');
searchForPersonAtCompany('Charles@Company B');

注意:

  • 这是一个非常简单的搜索实现,你可能会更好地研究一个基于数据库的搜索引擎,它可以处理更复杂的查询。
  • 我使用PDO作为我的数据库的连接(bindValue,exec等),你可能正在使用不同的东西。 :person:company只是SQL中的变量。