2012-01-10 214 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