准备 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",这些是返回的结果:

Running this query on phpMyAdmin returns the same, as it should.

然而,当输入"bit"时,上面php的结果是:

而结果应该是:

'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% 报告的同类错误是由用户空间代码引起的。