php - 如何在 CONCAT 中正确使用通配符

标签 php mysql pdo collation

(剧透:标题与代码错误无关。)

我正在创建一个实时搜索系统,只是为了向用户显示我的网站上已列出的可能的事件类型。在我的猜测中,我可能无法看到通配符绑定(bind)错误。

我尝试使用不同类型的“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 和 Nightlife。当$q等于ni时,则只返回Nightlife。

搜索不区分大小写,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 列中的默认排序规则区分大小写。这就是 NiniNightlife 中不匹配的原因。

试试这个查询。

'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?解释如何更改表或列的默认排序规则。这通常是一个好主意,因为排序规则被烘焙到索引中。

关于php - 如何在 CONCAT 中正确使用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043826/

相关文章:

php - 合并包含 xsl :include and xsl:import 的多个 XSLT 样式表

php - 具有多个条件的 Laravel 搜索查询

php - 是否可以从 mysql 列中获取特定信息?

php - 我正在做一个大学项目,我们必须创建一个博客

php - "The active result contains no fields"将 PDO 与 MS SQL 结合使用

php - Laravel Forge 上的 Laravel Nova 错误 403 页面

php - 如何在同一个表的同一查询中使用列的默认值?

php更新数据库中的多个选择选项值

php - 使用文本框从 MySQL 数据库中优化 PDO 结果

mysql - SQL 计数限制结果