使用PHP进行精确值搜索

时间:2018-07-20 13:15:21

标签: php

我正在使用以下代码搜索生成的表并过滤数据。我的问题是,当我搜索假设1时,它不仅搜索和过滤1,而且还搜索和过滤包含1的数据,例如11, 21, etc.

如何使其搜索和过滤输入的确切数据?

<?php

if(isset($_POST['search']))
{
    $valueToSearch = $_POST['valueToSearch'];
    // search in all table columns
    // using concat mysql function
    $query = "SELECT * FROM `tbstats` WHERE CONCAT(`date`, `mode`, `svar`, `sdev`) LIKE '%".$valueToSearch."%'";
    $search_result = filterTable($query);

}
 else {
    $query = "SELECT * FROM `tbstats`";
    $search_result = filterTable($query);
}


function filterTable($query)
{
    $connect = mysqli_connect("localhost", "root", "", "dbstats");
    $filter_Result = mysqli_query($connect, $query);
    return $filter_Result;
}

?>

<!DOCTYPE html>
<html>
    <head>
        <title>Stats</title>
        <style>
            table,tr,th,td
            {
                border: 1px solid black;
            }
        </style>
    </head>
    <body>

        <form action="stats_filter.php" method="post">
            <input type="text" name="valueToSearch" placeholder="Value To Search"><br><br>
            <input type="submit" name="search" value="Filter"><br><br>

            <table>
                <tr>
                    <th>Date</th>
                    <th>Mode</th>
                    <th>Svar</th>
                    <th>Sdev</th>
                </tr>


                <?php while($row = mysqli_fetch_array($search_result)):?>
                <tr>
                    <td><?php echo $row['date'];?></td>
                    <td><?php echo $row['mode'];?></td>
                    <td><?php echo $row['svar'];?></td>
                    <td><?php echo $row['sdev'];?></td>
                </tr>
                <?php endwhile;?>
            </table>
        </form>

    </body>
</html>

2 个答案:

答案 0 :(得分:9)

执行LIKE '%".$valueToSearch."%'后,您将搜索包含%value%的值。

如果您要搜索以valueToSearch开头的值,请使用LIKE '".$valueToSearch."%',对于以valueToSearch结尾的值,请使用LIKE '%".$valueToSearch."',对于确切值,请使用= '".$valueToSearch."'

因此,您只需将LIKE '%".$valueToSearch."%'替换为= '".$valueToSearch."'

编辑:

在您的情况下,您正在做一些CONCAT,所以我想您想在您的某个字段中找到确切的值,对吧?

如果是,请尝试替换:

$query = "SELECT * 
          FROM `tbstats` 
          WHERE CONCAT(`date`, `mode`, `svar`, `sdev`) LIKE '%".$valueToSearch."%'";

作者

$query = "SELECT * 
          FROM `tbstats` 
          WHERE `date` = '".$valueToSearch."'
             OR `mode` = '".$valueToSearch."'
             OR `svar` = '".$valueToSearch."'
             OR `sdev` = '".$valueToSearch."'";

这样,仅当您的确切searchValue存在于一个或四个字段中时,您才返回数据

答案 1 :(得分:1)

当前,您将所有列合并为一个字符串,然后在此串联的字符串中的任意位置搜索搜索字符串的出现。

您可能真正想要的是将每一列与您的搜索字符串完全匹配,然后返回每一行,其中每一列都具有完全匹配的内容。要进行完全匹配,请不要使用LIKE。您想要一个简单的=。要合并它们,只需使用OR运算符。

$query = "SELECT * FROM tbstats WHERE
    date = '" . $valueToSearch . "' OR
    mode = '" . $valueToSearch . "' OR
    svar = '" . $valueToSearch . "' OR
    sdev = '" . $valueToSearch . "'";

最重要的是,您应该真正避免输入错误,或者甚至更好地使用准备好的语句。