【发布时间】:2019-05-31 07:32:00
【问题描述】:
(剧透:标题与代码的问题无关。)
我正在创建一个实时搜索系统,只是为了向用户展示我的网站上已经列出的可能的事件类型。在我的猜测中,我可能在通配符绑定方面遇到了一个我看不到的错误。
我尝试使用不同类型的“WHERE LIKE”语句,但其中大多数根本不起作用。比如我尝试使用占位符查询(问号),但根本不起作用。如果我在我的数据库上手动运行这个查询,我会得到我期望的结果。
这是我的代码的样子,变量 $q 是使用 $_GET 方法获得的。
$query = $pdo->prepare('SELECT DISTINCT EventCategory FROM Events
WHERE EventCategory LIKE CONCAT(\'%\',:q,\'%\')');
$query->bindParam(":q", $q);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div> $row->EventCategory </div>";
}
预期结果将是:如果 $q 等于 n,则返回会议和夜生活。当 $q 等于 ni 时,只返回 Nightlife。
搜索不区分大小写,N 和 n 被同等对待。
SHOW CREATE TABLE 事件查询返回以下内容:
CREATE TABLE `Events` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(100) NOT NULL,
`Image` varchar(600) NOT NULL,
`Date` date NOT NULL,
`Description` varchar(1200) NOT NULL,
`SpacesAvailable` int(11) NOT NULL,
`EventCategory` varchar(50) NOT NULL,
`Trending` varchar(30) DEFAULT NULL,
`TrendingID` int(255) NOT NULL,
`Sale` int(255) NOT NULL,
PRIMARY KEY (`ID`)
)DEFAULT CHARSET=latin1
显示网站运作的图片:https://imgur.com/a/yP0hTm3 如果您正在查看图像,请从下到上查看。谢谢
【问题讨论】:
-
您可能会在不需要的地方获得额外的报价。试试
WHERE EventCategory LIKE :q和bindParam(':q', '%' . $q . '%'); -
$q = $_GET['something'];是如何分配$q的?concat的用法看起来是正确的。 -
family fun也应该与n搜索一起返回。 -
但
n是最后一个字母。您在图片中搜索了n。如果问题与排序规则/字符集相关,我们应该在数据库中得到相同的结果。能否展示一下在 DB 界面中执行SELECT DISTINCT EventCategory FROM Events WHERE EventCategory LIKE CONCAT('%', 'n','%')时会发生什么? -
尝试将查询存储到变量中,然后转储变量,以说服自己查询是正确的。如果您在 phpmyadmin 或其他一些 sql 客户端程序中键入等效查询会发生什么?