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

时间:2015-08-19 18:35:18

标签: php mysql sql mysqli prepared-statement

我有一个搜索我的成分数据库的功能(为清楚起见,错误报告被删除):

    $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”,这些是返回的结果:

  • 野牛草味伏特加
  • 苦柠檬
  • 苦味
  • 芹菜苦味酒
  • 冰鲜芙蓉茶
  • 巧克力苦味酒
  • 橙色苦味酒
  • Peach Bitters
  • Peychaud的苦涩
  • 芥末酱

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

但是,当输入“bit”时,上面php的结果是:

  • 苦柠檬
  • 苦味
  • 芹菜苦味酒
  • 巧克力苦味酒
  • 橙色苦味酒
  • Peach Bitters
  • Peychaud的苦涩

结果应该是:

enter image description here

“苦涩”的结果被排除在外,我无法理解为什么。

2 个答案:

答案 0 :(得分:0)

我对PHP并不是特别强,但我注意到'Bitter'如果使用'%bit%'作为参数,那将是第一个结果。同样,'Absolut Hibiskus'应该是使用'%bi%'作为参数时的第一个结果。

我的猜测是第一个结果是在这段代码中消耗的,而实际上没有在$ing_array内的任何地方分配:

$stmt->bind_result($id,$name)
while ($stmt->fetch()) {
    $ing_array[] = array($id,$name);
}

答案 1 :(得分:0)

相当具有指示性,没有提供实际输出的屏幕截图。意味着OP通过遥远的间接后果来判断他们准备好的陈述输出。就像客户端的一些处理一样。

在准备好的语句和负责此类行为的LIKE语句中都没有错误。 100%报告的同类错误是由用户区代码引起的。