mysqli搜索只适用于1个参数

时间:2017-06-08 22:00:52

标签: php mysql search mysqli

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

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

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

例如,您将{John Doe'名称存储为fname中的“John”和lname列中的“Doe”。

当您使用'John'或'Doe'查看时,您会在fnamelname中找到它。但是使用全名,两列都没有满足标准,也没有产生任何结果。

答案 1 :(得分:0)

Mysql的LIKE构造查找类似的条目,例如&#34; LIKE&#39; bob&#39;&#34;成功回归&#39; bobbette&#39;。 &#39; bob smith&#39;不喜欢&#39; bob&#39; (它是空间,它总是不通过测试)并且不会返回一行。尝试这样的事情:

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%'";
    }
    ...
}

如果您的搜索是&#34; bob smith&#34;,这将返回所有行的名字类似于&#34; bob&#34;或类似于&#34;史密斯&#34;的姓氏。可能有很多行。例如,&#34; bob jones&#34;,&#34; bob smith&#34;,&#34; dan smith&#34;都会被退回。如果你的搜索只是&#34; bob&#34;你有&#34; bob smith&#34;和#34; john bobbett&#34;你得到了这两个。这是你所期望的吗?

如果您在搜索&#34; bob smith&#34;时只想(例如)一行。那么你的查询应该是寻找AND而不是OR。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

Bob Smith

史密斯鲍勃

您将获得您正在寻找的结果。

相关问题