PHP高级搜索

PHP高级搜索,php,mysql,database,Php,Mysql,Database,我目前正在做一个网站,我需要一个非常先进的搜索引擎。我希望用户能够说Person@company或Product@Category。如何检测@符号或任何特殊字符,过滤掉它们,并根据返回的字符串生成单个变量。所以$a=Person和$b=company将其作为格式为a=Person&b=company等的get请求发送。另一种方法正是您所说的,循环遍历字符串并逐个检查字符。当你遇到@符号时,你知道它前面的字母(不包括空格)是a的值,@(不包括空格)后面的所有字母都是b的值 抱歉,我试图尽可能清楚地

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

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

抱歉,我试图尽可能清楚地说明问题。

您可以使用拆分字符串:

$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.
}

这是很容易实现的

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();
}
您没有指定数据库架构,因此我不得不猜测您有一个
人员
表和一个
公司
表,其中人员与公司的表相关,并带有
公司
字段

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中的变量
好的,谢谢!我想把它作为一个职位只是为了安全,所以我会对你的第二个选择的工作。谢谢将其作为。。。POST只是为了安全*facepalm*@Joseph,以POST请求的形式发送内容不会对相应的GET请求增加安全性。下载Firefox的tamperdata插件作为一个例子,看看用户操纵POST请求是多么微不足道。非常感谢。我只是浏览了一下手册,想知道怎么做。我相信这只是一个简单的解析问题,不是“高级搜索”: