如何正确使用concat的通配符

5rgfhyps  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(650)

(剧透:标题与代码的错误无关。)
我正在创建一个实时搜索系统,只是为了显示用户可能的事件类型已经在我的网站上列出。在我的推测中,我可能有一个通配符绑定错误,我看不到。
我尝试使用不同类型的“where-like”语句,但大多数都不起作用。例如,我尝试使用占位符查询(问号),但根本不起作用。如果我在我的数据库上手动运行这个查询,我将得到我期望的结果。
这就是我的代码的样子,变量$q是使用$\u 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,则返回meeting和nightlife。当$q等于ni时,只返回夜生活。
搜索不区分大小写,n和n被同等对待。
show create table events查询返回以下内容:

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 如果您正在查看图像,请从下至上查看。谢谢

nc1teljy

nc1teljy1#

作为对o.jones综合答案的补充,另一个更简单的解决方案是只执行不区分大小写的搜索,如:

'SELECT DISTINCT EventCategory 
 FROM Events 
 WHERE UPPER(EventCategory) LIKE CONCAT(\'%\',UPPER(:q),\'%\')'
vhmi4jdf

vhmi4jdf2#

我怀疑你的 EventCategory 列区分大小写。这就是为什么 Ni 以及 ni 不匹配 Nightlife .
请改为尝试此查询。

'SELECT DISTINCT EventCategory FROM Events WHERE EventCategory COLLATE utf8_general_ci LIKE CONCAT(\'%\',:q,\'%\')'

或者,如果列的字符集不是unicode而是iso8859-1,请尝试以下操作:

'SELECT DISTINCT EventCategory FROM Events WHERE EventCategory COLLATE latin1_general_ci LIKE CONCAT(\'%\',:q,\'%\')'

这说明了如何在mysql上查找可用的字符集和排序规则。
如何更改数据库、表、列的排序规则?说明如何更改表或列的默认排序规则。这通常是一个好主意,因为排序规则被烘焙到索引中。

kh212irz

kh212irz3#

问题不在这里 LIKE ,但在php和pdo中。盯着三个相互矛盾的用法 $row 在代码中:

$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div>  $row->EventCategory </div>"; }

然后回顾文档和示例(对不起,我不会给你答案的;你需要学习来理解它。)

相关问题