我正在使用以下代码搜索生成的表并过滤数据。我的问题是,当我搜索假设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>
答案 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 . "'";
最重要的是,您应该真正避免输入错误,或者甚至更好地使用准备好的语句。