2011-01-08 62 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()); 
检索数据


现在做任何你想要检索的数据。
让我知道结果;-)