Mysqli 搜索喜欢仅适用于 1 个参数



我正在尝试进行像查询一样的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);
}
 }
 ?>

提前感谢您的帮助!

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

例如,您将名称"John Doe"存储为fname中的"John"lname列中的"Doe"。

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

Mysql 的 LIKE 构造会查找类似的条目,例如成功返回 'bobbette'的 "LIKE 'bob'"。 "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 Jones"、"Bob Smith"、"Dan Smith"都将返回。 如果你的搜索只有"鲍勃",并且你有"鲍勃·史密斯"和"约翰·博贝特"的条目,你会得到这两个条目。 这是你所期望的吗?

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

在这里

,如果我理解正确,请尝试输入字段中的爆炸值

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

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

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

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

鲍勃·史密斯

史密斯·鲍勃

你会得到你想要的结果。

最新更新