如何在 CONCAT 中正确使用通配符
How to properly use Wildcard with CONCAT
(剧透:标题与代码错误无关。)
我正在创建一个 live-search 系统,只是为了向用户显示我的网站上已经列出的可能的事件类型。在我的推测中,我可能无法看到通配符绑定错误。
我尝试使用不同类型的 "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,则返回 Meeting and Nightlife。当$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
如果您正在查看图像,请从下到上查看。谢谢
我怀疑您 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,\'%\')'
This explains how 在 MySQL.
上查找可用的字符集和排序规则
How to change collation of database, table, column? 解释了如何更改 table 或列的默认排序规则。这通常是个好主意,因为排序规则已包含在索引中。
为了补充 O.Jones 的综合答案,另一个更简单的解决方案是只执行不区分大小写的搜索,例如:
'SELECT DISTINCT EventCategory
FROM Events
WHERE UPPER(EventCategory) LIKE CONCAT(\'%\',UPPER(:q),\'%\')'
问题不在 LIKE
,而是在 PHP 和 PDO。关注代码中 冲突 的 $row
用法:
$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div> $row->EventCategory </div>"; }
然后查看文档和示例。 (抱歉,我不会给你答案;你需要学习才能理解。)
(剧透:标题与代码错误无关。)
我正在创建一个 live-search 系统,只是为了向用户显示我的网站上已经列出的可能的事件类型。在我的推测中,我可能无法看到通配符绑定错误。
我尝试使用不同类型的 "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,则返回 Meeting and Nightlife。当$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 如果您正在查看图像,请从下到上查看。谢谢
我怀疑您 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,\'%\')'
This explains how 在 MySQL.
上查找可用的字符集和排序规则How to change collation of database, table, column? 解释了如何更改 table 或列的默认排序规则。这通常是个好主意,因为排序规则已包含在索引中。
为了补充 O.Jones 的综合答案,另一个更简单的解决方案是只执行不区分大小写的搜索,例如:
'SELECT DISTINCT EventCategory
FROM Events
WHERE UPPER(EventCategory) LIKE CONCAT(\'%\',UPPER(:q),\'%\')'
问题不在 LIKE
,而是在 PHP 和 PDO。关注代码中 冲突 的 $row
用法:
$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div> $row->EventCategory </div>"; }
然后查看文档和示例。 (抱歉,我不会给你答案;你需要学习才能理解。)