2013-04-10 50 views
1

我有這個代碼非常像數據庫中的人名的搜索引擎。查詢如果搜索值等於兩行?

if (isset($_POST['submit'])){ 
     $keyword = $_POST['stats']; 
     $orderby = $_POST['orderby']; 

     if (!empty($_POST['stats'])) { 
      $getStats = $db->query("SELECT * FROM `stats` WHERE 
       `lastname` LIKE '%$keyword%' OR `firstname` LIKE '%$keyword%' OR 
       `nickname` LIKE '%$keyword%' ORDER BY `$orderby` 
       DESC"); 

然後將結果打印回表格中,我認爲表格代碼不是必需的,也不是太長。

上面的查詢適用於如果我搜索只是姓,或只是名字或暱稱

但如果例如在名爲數據庫中的用戶,約翰·史密斯 所以

姓:約翰
名字:史密斯

如果只是搜索「約翰」他會被打印成表,這是很好的和相同的,如果我只是大海'史密斯'

但是,如果我搜索'約翰史密斯',他不會被打印到表中。

我怎樣才能改變這種查詢,以便這會發生,我已經試過這樣:

$getStats = $db->query("SELECT * FROM `stats` WHERE 
    `firstname`, `lastname` = '$keyword' OR `lastname` LIKE '%$keyword%' OR `firstname` LIKE '%$keyword%' OR 
    `nickname` LIKE '%$keyword%' ORDER BY `$orderby` 
    DESC"); 

回答

1

WHERE CONCAT(firstname, ' ', lastname) LIKE %$keyword%

你也應該綁定參數,而不是直接插用戶輸入的查詢字符串,您當前的代碼容易受到SQL注入的影響。

0
$keyword = str_replace(" ", "%", $keyword); 
0

您可以嘗試REGEXP:

$keyword = $db->real_escape_string($_POST['stats']); // escape data 
$orderby = $db->real_escape_string($_POST['orderby']); // escape data 
$keyword = implode("|", explode(" ", $keyword)); 

$getStats = $db->query("SELECT * FROM stats 
         WHERE firstname REGEXP '$keyword' 
          OR lastname REGEXP '$keyword' 
          OR nickname REGEXP '$keyword' 
         ORDER BY $orderby DESC"); 
0

試試這個

$sql = "SELECT * 
    FROM stats 
    WHERE 
    firstname LIKE '%$keyword%' 
    OR lastname LIKE '%$keyword%' 
    OR CONCAT_WS(' ',firstname,lastname,) LIKE '%$keyword%' 
    OR CONCAT_WS(' ',lastname,firstname) LIKE '%$keyword%' 
    OR nickname LIKE '%$keyword%' 
    ORDER BY $orderby DESC";