2011-01-08 63 views
1

我正在創建一個搜索網站,用戶可以按商家名稱或表格行搜索cat1,cat2,cat3。 「貓」行與企業名稱在同一個表中。我已經設置好了,所以如果我搜索正確的業務,我會返回業務信息。但我需要讓它顯示的商家有你搜索的類別名稱。如何根據GET搜索選擇多個字段?

**我基本上要求的是獲取搜索(php),以搜索企業名稱或三個類別之一。

任何幫助,將不勝感激...這裏是我的代碼情況下你需要它(雖然我認爲這應該是一個很容易的事情,也許不是,雖然,我是一個PHP初學者)

  include('config.php'); 
      $var = $_REQUEST['search']; 
      $trimmed = trim($var); 
      $search = ucfirst($var); 


     $result = mysql_query("SELECT * FROM gj WHERE name like '%$search%' ORDER by name") or trigger_error(mysql_error()); 
     $num_rows = mysql_num_rows($result); 

然後我使用while循環從中獲取所有代碼。

while($row = mysql_fetch_array($result)) 
     { 
     $id=$row['id']; 
     $name=$row['name']; 
     $phone=$row['phone']; 
     $website=$row['website']; 
     $city=$row['city']; 
     $address=$row['address1']; 
     $zipcode=$row['zipcode']; 
     $addressmap = preg_replace('/\s/', '+',$address); 
     $citymap = preg_replace('/\s/', '+',$city); 

     echo" 
+0

您需要在SQL查詢中使用的所有「不可信」變量上使用mysql_real_escape_string。這是一個等待發生的SQL注入攻擊。 – 2011-01-08 16:45:38

+0

謝謝我剛剛那樣做! – 2011-01-08 16:49:51

+0

你也應該使用`$ _GET`不是`$ _REQUEST` – Prisoner 2011-01-08 16:52:09

回答

2
include('config.php'); 
$searchfields = array('name', 'cat1', 'cat2', 'cat3',) 
$cleandata = mysql_real_escape_string(trim(strtolower($_REQUEST['search']))); 

$where = array(); 
foreach($searchfields as $field) { 
    $where[] = 'lcase('.$field.') like \'%.$cleandata.%\''; 
} 

$result = mysql_query('SELECT * FROM gj WHERE '.implode(' OR ', $where).' ORDER by name') or trigger_error(mysql_error()); 
$num_rows = mysql_num_rows($result); 

我添加了一個可變cleandata含有清洗請求數據(以防止SQL注入)。

我創建了一個可以輕鬆擴展的變量searchfields來搜索更多的字段。

要在多個領域的搜索,只需展開數組數據:

$searchfields = array('name', 'cat1', 'cat2', 'cat3', 'cat4',) 

編輯 加區分大小寫


編輯新增PDO

注意,因爲我寫了這個回答社區已經開始deprecation process的古代mysql_*。請參閱red box?相反,您應該瞭解prepared statements並使用PDOMySQLi。如果你不能決定,this article將有助於選擇。如果你在意學習,here is a good PDO tutorial

使用PDO會是什麼樣子像下面上述答案的改寫:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); 
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$searchfields = array('name', 'cat1', 'cat2', 'cat3',) 

$where = array(); 
foreach($searchfields as $field) { 
    $where[] = 'lcase(' . $field . ') LIKE :keyword'; 
} 

$stmt = $dbConnection->prepare('SELECT * FROM gj WHERE ' . implode(' OR ', $where) . ORDER BY name); 
$stmt->execute(array(
    ':keyword' => '%' . trim(strtolower($_REQUEST['search'])) . '%', 
)); 
-1

比方說,你想搜索bussines名「傑克」和類別「PHP」。
網址爲您的要求會是這樣......

 
http://yourdomain.com/search.php?name=Jake&category=php 


你需要有一些列,那是錶行的唯一標識符。在這個例子中,我使用'id'列。編輯它以滿足您的需求。現在,讓我們建立您的查詢......

 
$query = "SELECT * FROM `gj` 
WHERE name LIKE '%{$_GET['name']}%' 
AND `gj.id` IN (
    SELECT id FROM test 
    WHERE 
     cat1 LIKE '%{$_GET['category']}%' OR 
     cat2 LIKE '%{$_GET['category']}%' OR 
     cat3 LIKE '%{$_GET['category']}%' 
    )"; 
    // or edit this cat1 LIKE '%{$_GET['category']}%' 
    // to cat1 = '{$_GET['category']}' 
    // if you want to compare exact values 


有了這個查詢,你從DB

 
$result = mysql_query($query) or trigger_error(mysql_error()); 
檢索數據


現在做任何你想要檢索的數據。
讓我知道結果;-)