2012-01-10 118 views
-2

我目前正在制作一个网站,我需要一个非常先进的搜索引擎。我希望用户能够说Person @ companyProduct @ Category。我如何检测@符号或任何特殊字符,将其过滤出来并根据返回的字符串生成各个变量。所以$a = Person$b = companyPHP高级搜索

+0

我相信这只是一个简单的解析问题,不是'高级搜索':) – ianace 2012-01-10 02:39:40

回答

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. 
} 
+0

非常感谢。只是通过手册来查看如何做到这一点。 – 2012-01-10 01:36:00

1

将它作为获取请求发送,格式为a =人& b =公司等。另一种方式正是你说的,循环查看字符串并逐个检查字符。当你遇到@符号时,你知道它前面的字母(不包括空格)是a的值,而@(不包括空格)后的所有符号都是b的值。

对不起,我试图尽可能清楚。

+1

好的谢谢!我想将它作为POST发送,只是为了安全,所以我会在第二个选项上工作。谢谢!! – 2012-01-10 01:26:10

+2

*发送为... POST只是为了安全* \ * facepalm \ * – 2012-01-10 01:37:32

+0

@Joseph,作为POST请求发送内容会在相应的GET请求中增加NO SECURITY。下载Firefox的tamperdata插件作为示例,以查看用户如何操作POST请求。 – atxdba 2012-01-10 01:40:59

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('[email protected] A'); 
searchForPersonAtCompany('[email protected] B'); 

注:

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

使用1作为极限参数是错误的。 – Ryan 2012-01-10 01:37:13

+0

发现那个,编辑为2;) – xconspirisist 2012-01-10 01:39:23