【问题标题】:How to search for multiple words in database如何在数据库中搜索多个单词
【发布时间】:2018-10-12 06:36:46
【问题描述】:

我似乎不知道如何搜索(和显示)我的数据库中的多个单词。这是数据库列的图像

所有不同的地点:非洲 |英国威尔士 |瑞典斯德哥尔摩和我想搜索相同的位置并显示它们,如果列中有一个单词,则以下代码有效,但如果有多个则无效。

<?php 
        $sessionid = $_SESSION['id'];
        $sql = "SELECT * FROM users WHERE id = '$sessionid';";
        $rsults = mysqli_query($conn, $sql);
        $resultsCheck = mysqli_num_rows($rsults);
        if ($resultsCheck > 0) {
            while ($row = mysqli_fetch_assoc($rsults)){
                $follow = $row['follow'];
                $loc = $row['places'];
            }
        }
    $sql = "SELECT * FROM posts WHERE ext LIKE '$loc' OR username LIKE '$follow' ORDER BY `a_date` DESC LIMIT 4";
    $rsults = mysqli_query($conn, $sql);
    $resultsCheck = mysqli_num_rows($rsults);
    if ($resultsCheck > 0) {
        while ($row = mysqli_fetch_assoc($rsults)){
            echo '<div class="posts">';
            echo '<img class="img"src='.$row['img'].' width="1500px">';
            echo '</div>';
            echo '<div class="contain">';
            echo '<div class="over">';
            echo '<div class="username2">';
            echo '<img src="focus.png" width="25px" height="25px" style="padding-right: 10px;">'.'<a href="./Profile.php?data='.$row['username'].'">'.$row['username'].'</a>'.'<img src="loc.png" width="25px" height="25px" style="padding-right: 5px; padding-left: 10px;">'.'<a href="./Location.php?data='.$row['ext'].'">'.$row['ext'].'</a>';
            echo '</div>';
            echo '<div class="content">';
            echo $row['content'];
            echo '</div>';         
            echo '</div>';
        }
    }

?>

我也知道这对 sql 注入是开放的,这只是一个概念证明。感谢您的帮助!

【问题讨论】:

    标签: php html mysql database


    【解决方案1】:

    mysql 中的like 运算符带有通配符,例如'%'、'_'等

    你可以像这样使用mysql查询

    $sql = "SELECT * FROM posts WHERE ext LIKE '%$loc%' OR username LIKE '$follow' ORDER BY `a_date` DESC LIMIT 4"; 
    

    例如,如果 $loc = 'canada',它将返回列中包含 'canada' 的所有行,无论该列是否包含 'canada, abc' 或 'abc, canada'

    【讨论】:

    • 还要记住这个搜索是区分大小写的!这意味着搜索“%canada%”将找不到“加拿大”。您可以通过使用 LOWER() 函数将查询数据格式化为小写来传递它。 $sql = "SELECT * FROM posts WHERE LOWER(ext) LIKE '%$loc%' OR LOWER(username) LIKE '$follow' ORDER BY a_date DESC LIMIT 4";
    【解决方案2】:

    使用 LIKE 时,您应该在 LIKE 参数的开头和/或结尾添加“%”符号,这样它就不会搜索相同的词,而是以您提供的字符串开头或结尾的词。比如:

    $sql = "SELECT * FROM posts WHERE ext LIKE '%$loc%' OR username LIKE '$follow' ORDER BY `a_date` DESC LIMIT 4";
    

    因此它会找到包含您的搜索条件的位置,而不仅仅是那些相同的位置。 '%' 在这里替换任意数量的字符。

    如果您有一个搜索词并且在数据库列中有多个词,则会出现这种情况。但是,如果您有多个搜索词,则必须动态生成查询,为每个词添加一个“OR ext LIKE '%$loc%'”。

    【讨论】:

      【解决方案3】:

      使用 LIKE 功能时使用“%”符号。

      $sql = "SELECT * FROM posts WHERE ext LIKE '%$loc%' OR username LIKE '$follow' ORDER BY `a_date` DESC LIMIT 4";
      

      这将允许您搜索字段的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多