准备 SQL LIKE 语句未返回所有结果
Prepared SQL LIKE statement not returning all results
我有一个功能可以搜索我的成分数据库(为清楚起见删除了错误报告):
$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();
这只是 returns 特定查询的部分结果,例如对于 "bi",这些是返回的结果:
- 野牛草味伏特加
- 苦
- 苦柠檬
- 苦涩
- 芹菜苦味酒
- 冰镇芙蓉茶
- 巧克力苦味剂
- 橙子苦味酒
- 桃子苦味酒
- Peychaud 的苦涩
- 芥末酱
Running this query on phpMyAdmin returns the same, as it should.
然而,当输入"bit"时,上面php的结果是:
- 苦柠檬
- 苦涩
- 芹菜苦味酒
- 巧克力苦味剂
- 橙子苦味酒
- 桃子苦味酒
- Peychaud 的苦涩
而结果应该是:
'bitter' 结果被排除,我不知道为什么。
我对 PHP 不是特别擅长,但我注意到如果使用 '%bit%'
作为参数,'Bitter'
将是第一个结果。同样,当使用 '%bi%'
作为参数时,'Absolut Hibiskus'
应该是第一个结果。
我的猜测是,第一个结果在此代码块中被使用,而实际上并未在 $ing_array
中的任何地方分配:
$stmt->bind_result($id,$name)
while ($stmt->fetch()) {
$ing_array[] = array($id,$name);
}
很有代表性,没有提供实际输出的屏幕截图。意味着 OP 正在通过遥远的间接后果来判断他们准备好的陈述输出。比如客户端的一些处理。
在准备好的语句和 LIKE 语句中都没有错误导致这种行为。 100% 报告的同类错误是由用户空间代码引起的。
我有一个功能可以搜索我的成分数据库(为清楚起见删除了错误报告):
$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();
这只是 returns 特定查询的部分结果,例如对于 "bi",这些是返回的结果:
- 野牛草味伏特加
- 苦
- 苦柠檬
- 苦涩
- 芹菜苦味酒
- 冰镇芙蓉茶
- 巧克力苦味剂
- 橙子苦味酒
- 桃子苦味酒
- Peychaud 的苦涩
- 芥末酱
Running this query on phpMyAdmin returns the same, as it should.
然而,当输入"bit"时,上面php的结果是:
- 苦柠檬
- 苦涩
- 芹菜苦味酒
- 巧克力苦味剂
- 橙子苦味酒
- 桃子苦味酒
- Peychaud 的苦涩
而结果应该是:
'bitter' 结果被排除,我不知道为什么。
我对 PHP 不是特别擅长,但我注意到如果使用 '%bit%'
作为参数,'Bitter'
将是第一个结果。同样,当使用 '%bi%'
作为参数时,'Absolut Hibiskus'
应该是第一个结果。
我的猜测是,第一个结果在此代码块中被使用,而实际上并未在 $ing_array
中的任何地方分配:
$stmt->bind_result($id,$name)
while ($stmt->fetch()) {
$ing_array[] = array($id,$name);
}
很有代表性,没有提供实际输出的屏幕截图。意味着 OP 正在通过遥远的间接后果来判断他们准备好的陈述输出。比如客户端的一些处理。
在准备好的语句和 LIKE 语句中都没有错误导致这种行为。 100% 报告的同类错误是由用户空间代码引起的。