【问题标题】:mysqli search like only works with 1 parametermysqli search like 仅适用于 1 个参数
【发布时间】:2017-11-10 18:58:03
【问题描述】:

我正在尝试进行 mysqli 搜索,例如基于名字和姓氏进行搜索的查询。当我在搜索中输入名字和姓氏时,我没有得到任何结果。但是,当我只输入名字或姓氏时,我会得到结果。

这是我的代码:

<?php
if (isset($_POST['search'])) {
$name = $_POST['search'];
$sql = "SELECT * FROM users WHERE fname LIKE '%$name%' OR lname LIKE '%$name%'";
$res = mysqli_query($conn, $sql);

}
while ($row = mysqli_fetch_assoc($res)) {
    $fname = $row['fname'];
    $lname = $row['lname'];
    $city = $row['city'];
    $state = $row['state'];
    $id = $row['id'];
    $url = '<a href ="profile/?id='.$id.'">';
    if ($id !== ($_SESSION['id'])){
    $pic = "SELECT profilephotopatch FROM users WHERE id = '$id'";
    $res = mysqli_query($conn, $pic);
    $row = mysqli_fetch_assoc($res);
    $picloc = $row['profilephotopatch'];
    $displaypic = '<div id="userphoto"><img src="../'.$picloc. '"style="width: 100%;max-height: 100%"></div>';
    $output = $displaypic. $url. '<div id="name">'. $fname. ' '. $lname. ' '. $city. $state. '</a></div><br>';
 echo ($output);
}
 }
 ?>

提前感谢您的帮助!

【问题讨论】:

  • fname LIKE '%bob smith%' 不会匹配 fname='bob'fname LIKE '%bob%'
  • 我尝试使用两个变量作为名称,但它不起作用。
  • 如果我理解正确,我需要使用两个不同的搜索字段来搜索名字和姓氏以及两个 php 变量?
  • fname LIKE '%bob% OR fname like %smith%' OR lname LIKE '%bob% OR lname like %smith%' 但深入了解您获得的人数可能会得到意想不到的回报结果。您可能需要 2 个帖子字段,以便确定什么是名字,什么是姓氏,并非所有文化都使用相同的顺序。我可以看到有人在搜索“bob smith”或“smith bob”或“smith, bob”

标签: php mysql search mysqli


【解决方案1】:

当您同时输入名字和姓氏时,我相信您的代码会尝试从 fnamelname 列中查找全名,这当然不会给您结果。

例如,您在fname 中将名称“John Doe”存储为“John”,在lname 列中存储为“Doe”。

当您查看“John”或“Doe”时,您会在fnamelname 中找到它。但是使用全名,两列都不满足条件并且没有结果。

【讨论】:

    【解决方案2】:

    Mysql 的 LIKE 构造会查找相似的条目,例如“LIKE 'bob'”成功返回 'bobbette'。 'bob smith' 不像 'bob' (它是空格,它总是无法通过测试)并且不会返回一行。试试这样的:

    if(isset($_POST['search'])){
        $names = explode(" ", $_POST['search']);
        $search_fname = array_shift($names);
        $search_lname = array_pop($names);
        if($search_lname != ''){
            $sql = "SELECT * FROM users WHERE fname LIKE '%$search_fname%' OR lname LIKE '%$search_lname%'";
        } else {
            $sql = "SELECT * FROM users WHERE fname LIKE '%$search_fname%' OR lname LIKE '%$search_fname%'";
        }
        ...
    }
    

    如果您的搜索是“bob smith”,这将返回名字类似于“bob”或姓氏类似于“smith”的所有行。可能有很多行。例如,“bob jones”、“bob smith”、“dan smith”都将被返回。如果您的搜索仅是“bob”并且您有“bob smith”和“john bobbett”的条目,那么您会得到这两个条目。这是您的预期吗?

    如果您在搜索“bob smith”时只期望(例如)一行,那么您的查询应该寻找 AND 而不是 OR。

    【讨论】:

      【解决方案3】:

      在这里,如果我理解正确,请从输入字段尝试这个爆炸值

      $search= explode(" ",$_POST['search']);
      $name = $search[0];
      $surname = $search[1]; 
      $sql = "SELECT * FROM users WHERE fname LIKE '%$name%' OR lname LIKE '%$surname %'";
      

      【讨论】:

        【解决方案4】:

        尝试使用 concat,您可以在要一起搜索的数据库行之间放置空引号。例如

        $sql0 = "SELECT * FROM users WHERE CONCAT(`fname`, ' ', `lname`,  ' ', `fname`) LIKE '%$name%' OR lname LIKE '%$name%'"
        

        在该示例中,您可以看到 fname 和 lname 之间以及 lname 和 fname 之间的空引号。这将允许搜索成功,例如:

        鲍勃·史密斯

        史密斯鲍勃

        你会得到你正在寻找的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-27
          • 1970-01-01
          • 2016-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-20
          • 1970-01-01
          相关资源
          最近更新 更多