准备好的 SQL LIKE 语句不返回所有结果
Posted
技术标签:
【中文标题】准备好的 SQL LIKE 语句不返回所有结果【英文标题】:Prepared SQL LIKE statement not returning all results 【发布时间】:2015-08-19 18:35:17 【问题描述】:我有一个搜索我的成分数据库的功能(为了清楚起见,删除了错误报告):
$servername = "localhost";
$username = "root";
$password = "*****";
$dbname = "addb_db";
$query = "%" . $_POST["query"] ."%";
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "SELECT id, name FROM addb_ingredients WHERE name LIKE ? or id like ?";
$stmt = $conn -> prepare($sql)
$stmt->bind_param('ss', $query,$query)
$stmt->execute()
$stmt->bind_result($id,$name)
while ($stmt->fetch())
$ing_array[] = array($id,$name);
$response_array["status"] = "success";
$response_array["data"] = $ing_array;
echo json_encode($response_array);
$stmt->close();
$conn->close();
这仅返回特定查询的部分结果,例如对于“bi”,这些是返回的结果:
野牛草味伏特加 苦涩 苦柠檬 苦味 芹菜苦味 冰镇芙蓉茶 巧克力苦酒 橙苦味 桃子苦酒 Peychaud 的苦味 芥末酱Running this query on phpMyAdmin returns the same, as it should.
但是,当输入“bit”时,上面php的结果是:
苦柠檬 苦味 芹菜苦味 巧克力苦酒 橙苦味 桃子苦酒 Peychaud 的苦味而结果应该是:
“苦涩”结果被排除在外,我不知道为什么。
【问题讨论】:
简单/愚蠢的测试:如果您执行not like '%bit%'
,是否会出现“苦涩”?也许其中一个字符并不是真正的 b/i/t,或者其中有其他不可打印的字符。一个简单的select length(name) where id='bitter'
会告诉你。
好主意,遗憾的是not like '%bit%'
的结果不包括苦味。
很奇怪。看不到“喜欢”和“不喜欢”如何同时排除该值...
我刚刚发现了另一个事件。 'bo' 返回 'Bourbon' 和 'Bourbon, Peach Flavored'(以及其他不以 'bou' 开头的项目),而 'bou' 仅返回 'Bourbon, Peach Flavored'。当存在扩展条目时,它似乎省略了更简单的条目..
查询应该运行正常,试试 print_r $ing_array[],看看你是否得到所有结果。
【参考方案1】:
我不是特别擅长 PHP,但我注意到如果使用 '%bit%'
作为参数,'Bitter'
将是第一个结果。同样,'Absolut Hibiskus'
应该是使用'%bi%'
作为参数时的第一个结果。
我的猜测是,第一个结果是在这段代码中使用的,而实际上并未在$ing_array
中的任何位置分配:
$stmt->bind_result($id,$name)
while ($stmt->fetch())
$ing_array[] = array($id,$name);
【讨论】:
好地方。我没有包含的验证代码包含另一个$stmt->fetch()
。谢谢。【参考方案2】:
相当指示性,没有提供实际输出的屏幕截图。意味着 OP 正在通过遥远的间接后果来判断他们准备好的语句输出。就像客户端的一些处理一样。
在准备好的语句和 LIKE 语句中都没有导致这种行为的错误。 100% 报告的同类错误是由用户空间代码引起的。
【讨论】:
以上是关于准备好的 SQL LIKE 语句不返回所有结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在mysqli准备好的语句中使用SQL LIKE子句[重复]