在准备好的语句中使用 LIKE '%$var%' 的正确方法? [mysqli]

Posted

技术标签:

【中文标题】在准备好的语句中使用 LIKE \'%$var%\' 的正确方法? [mysqli]【英文标题】:Correct way to use LIKE '%$var%' with prepared statements? [mysqli]在准备好的语句中使用 LIKE '%$var%' 的正确方法? [mysqli] 【发布时间】:2015-04-07 17:44:07 【问题描述】:

这不起作用

$sql = 'SELECT * FROM `users` WHERE username LIKE \'%?%\' ';

警告:mysqli_stmt::bind_param():变量数与第 1 行 /home/rgero/public_html/php/searchadmins.php 中准备好的语句中的参数数不匹配

这个也不行

$sql = 'SELECT * FROM `users` WHERE username LIKE %?% ';

致命错误:错误的 SQL:SELECT * FROM users WHERE username LIKE %?% Error: 0 in /home/rgero/public_html/php/searchadmins.php on line 1

我该怎么办?我正在尝试搜索玩家功能,该功能会在您输入表单时更新结果,就像谷歌在您输入时已经显示答案一样。如果您键入 dm,我需要用户名 Admin 以在包含“dm”的其他用户名中显示它。它也应该不区分大小写

【问题讨论】:

您必须在要绑定到? 参数的变量上预先添加% 是的,只需在查询中使用bindParam(1, "%$var%") 等和文字LIKE ? 所以我必须取变量并将 % 添加到开头并添加 % 到末尾? @mario 我只是不想让未来的读者产生错误的印象,有些人甚至可能认为他们可以混合不同的 API lol - 我见过多少次了. 我只是在回复,因为我收到了有关这些 cmets 的通知。我认为您应该权衡这些“重复”主题获得的观看次数。考虑到谷歌应该惩罚重复内容的事实,并且不知何故仍有几千人在这里结束,这意味着我使用了不同的关键字,这个问题首先出现。如果这在没有答案的情况下关闭,那将意味着 SO 有 3k 次反弹命中。我知道当问题很新鲜但有迹象表明这个问题时,不可能检测到这一点。 【参考方案1】:

试试这个

$likeVar = "%" . $yourParam . "%";
$stmt = $mysqli->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->bind_param("s", $likeVar);
$stmt->execute();

您只需使用? 准备查询,然后使用bind_param 绑定参数。

【讨论】:

以上是关于在准备好的语句中使用 LIKE '%$var%' 的正确方法? [mysqli]的主要内容,如果未能解决你的问题,请参考以下文章

Mysql准备好的语句LIKE问题

准备好的 SQL LIKE 语句不返回所有结果

Golang 中的跨数据库准备好的语句绑定(like 和 where in)

在 MySQL 中使用准备好的语句可以防止 SQL 注入攻击吗?

从准备好的语句中获取数据

SQL like 语句问题