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");

然后将结果打印回表格中,我认为表格代码没有必要而且太长。

如果我只搜索姓氏或名字或昵称,上述查询适用

但是,例如,如果数据库中有一个名为 John Smith 的用户,那么

名字:约翰姓氏
:史密斯

如果只是搜索“John”,他将被打印到表格中,如果我只是搜索“Smith”,这很好并且相同

但如果我搜索“John Smith”,他不会被打印到表格中。

如何更改此查询以便发生这种情况,我已经尝试过:

$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");
4

4 回答 4

1

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

此外,您应该绑定参数而不是直接将用户输入插入到查询字符串中,您当前的代码容易受到 SQL 注入的影响。

于 2013-04-10T19:36:19.110 回答
0
$keyword = str_replace(" ", "%", $keyword);
于 2013-04-10T19:39:36.100 回答
0

你可以试试正则表达式:

$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");
于 2013-04-10T19:41:11.387 回答
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";
于 2013-04-10T19:42:15.327 回答