用PHP进行精确值搜索

用PHP进行精确值搜索,php,Php,我使用以下代码搜索生成的表并过滤数据。我的问题是,当我搜索1时,它不仅搜索并过滤1,还搜索包含1的数据,如11、21等 我如何让它搜索和过滤我输入的准确数据 <?php if(isset($_POST['search'])) { $valueToSearch = $_POST['valueToSearch']; // search in all table columns // using concat mysql function $query = "S

我使用以下代码搜索生成的表并过滤数据。我的问题是,当我搜索1时,它不仅搜索并过滤1,还搜索包含1的数据,如11、21等

我如何让它搜索和过滤我输入的准确数据

<?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>
如果喜欢“%$valueToSearch.%”,则搜索包含%value%的值

如果要搜索以valueToSearch开头的值,请使用“%$valueToSearch.%”,以valueToSearch结尾的值,请使用“%$valueToSearch.”,确切值使用“%$valueToSearch.”

因此,在您的情况下,只需将“%$valueToSearch.%”替换为“%$valueToSearch.”

编辑:

在你的例子中,你正在做一些CONCAT,所以我猜你想在你的一个字段中找到确切的值,对吗

如果是,请尝试更换:

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


这样,只有在一个或四个字段中存在精确的搜索值时,才能返回数据。当前,您将所有列合并为一个字符串,然后在该合并字符串中的任何位置搜索搜索字符串

实际上,您可能希望将每一列与搜索字符串完全匹配,并返回每一行,每一行在任何列中都有完全匹配的内容。要进行精确匹配,请不要使用LIKE。简单的=就是你想要的。要组合它们,只需使用OR运算符

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

最重要的是,你应该真正避开你的输入,或者更好的是,使用准备好的语句。

不确定简单的替换是否有效,因为他做了一些连接。好的,我按照你说的做了,比如$query=SELECT*FROM tbstats`WHERE CONCATdate,mode,svar,sdev like.$valueToSearch'。;`但现在它没有显示任何结果。@Jason我做了一次编辑,因为Philipp的评论是对的:你做了一个concat,所以你在一个大字符串中搜索一个词……所以它什么也不返回。如果你想要精确的术语出现,我想你应该做一个WHERE条件,在这里你测试每个字段的值。谢谢米克尔,我有一些错误,我尝试了philip的解决方案。是的,我最后忘了一个!我仍然得到完全相同的东西,所以我的安瑟仍然很好,但他首先看到了康卡特的东西,所以安瑟对他来说很好!
$query = "SELECT * FROM tbstats WHERE
    date = '" . $valueToSearch . "' OR
    mode = '" . $valueToSearch . "' OR
    svar = '" . $valueToSearch . "' OR
    sdev = '" . $valueToSearch . "'";