【问题标题】:How to select multiple fields based on a GET search?如何根据 GET 搜索选择多个字段?
【发布时间】:2011-01-08 16:43:04
【问题描述】:

我正在创建一个搜索站点,用户可以在其中按公司名称或表行 cat1、cat2、cat3 进行搜索。 “猫”行与公司名称在同一个表中。我已经设置好了,所以如果我搜索正确的商家,我会返回商家信息。但我需要让它显示具有您搜索的类别名称的企业。

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

【问题讨论】:

  • 您需要对您在 SQL 查询中使用的所有“不可信”变量使用 mysql_real_escape_string。这是等待发生的 SQL 注入攻击。
  • 你也应该使用$_GET 而不是$_REQUEST
  • 好的,我刚改了。有区别吗?

标签: php mysql logic


【解决方案1】:
 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

请注意,自从我写了这个答案以来,社区已经开始使用古老的 mysql_*deprecation process。看到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'])) . '%',
));

【讨论】:

  • 老兄,你太棒了......非常感谢。
【解决方案2】:

比方说,您想搜索业务名称“Jake”和类别“php”。
您的请求的 URL 将是这样的......

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


你需要有一些列,那是表行的唯一标识符。在此示例中,我使用“id”列。根据您的需要对其进行编辑。现在让我们设置您的查询...

$query = "SELECT * FROM `gj` WHERE name LIKE '%{$_GET['name']}%' AND `gj.id` IN ( 从测试中选择 id 在哪里 cat1 LIKE '%{$_GET['category']}%' 或 cat2 LIKE '%{$_GET['category']}%' 或 cat3 LIKE '%{$_GET['category']}%' )"; // 或者编辑这个 cat1 LIKE '%{$_GET['category']}%' // to cat1 = '{$_GET['category']}' // 如果你想比较精确的值


通过此查询,您可以从数据库中检索数据

$result = mysql_query($query) 或 trigger_error(mysql_error());


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

【讨论】:

  • 将其作为可接受的答案,以便其他人识别。这可以帮助别人:)
  • SQL 注入等待发生
  • 伙计,他可以对查询做任何事情...我只向他展示了如何构建查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2023-02-14
  • 2018-05-08
  • 2016-01-11
相关资源
最近更新 更多