如何根据GET搜索选择多个字段?

时间:2011-01-08 16:43:04

标签: php mysql logic

我正在创建一个搜索网站,用户可以通过商家名称或表格行cat1,cat2,cat3进行搜索。 “cat”行与业务名称位于同一个表中。我已经设置好了,所以如果我搜索正确的商家,我会返回商家信息。但我需要让它显示具有您搜索的类别名称的商家。

**基本上我要求的是获取搜索(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"

2 个答案:

答案 0 :(得分: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 = array('name', 'cat1', 'cat2', 'cat3', 'cat4', )

EDIT 添加不区分大小写的


编辑添加了PDO

请注意,由于我写了这个答案,社区已经开始了古代mysql_*的{​​{3}}。请参阅deprecation process?相反,您应该了解red box并使用prepared statementsPDO。如果您无法决定,MySQLi将有助于选择。如果您想学习,this article

使用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 :(得分:-1)

让我们说,你想搜索商务名称'杰克'和类别'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());


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