[英]How to properly use Wildcard with CONCAT
(擾流器:標題與代碼錯誤無關。 )
我正在創建一個實時搜索系統,旨在向用戶顯示我網站上已列出的可能事件類型。 在進行推測時,我可能看不到通配符綁定錯誤。
我嘗試使用不同類型的“ 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時,僅返回夜生活。
搜索不區分大小寫,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如果您正在查看圖像,請從下至上查看。 謝謝
我懷疑您的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上查找可用的字符集和排序規則。
如何更改數據庫,表,列的排序規則? 說明如何更改表或列的默認排序規則。 通常,這是一個好主意,因為歸類已納入索引中。
為了補充O.Jones的全面回答,另一個更簡單的解決方案是僅執行不區分大小寫的搜索,例如:
'SELECT DISTINCT EventCategory
FROM Events
WHERE UPPER(EventCategory) LIKE CONCAT(\'%\',UPPER(:q),\'%\')'
問題不在於LIKE
,而在於PHP和PDO中。 盯着代碼中$row
的3種沖突用法:
$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div> $row->EventCategory </div>"; }
然后查看文檔和示例。 (對不起,我不會為您提供答案;您需要學習以了解它。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.