准备好的 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 语句不返回所有结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL like 语句问题

带有位域的 PDO 准备好的语句

如何在mysqli准备好的语句中使用SQL LIKE子句[重复]

Java/SQL Server 中的预处理语句不返回任何结果

Mysql准备好的语句LIKE问题

PHP mysqli - 从准备好的语句返回关联数组