如何使用mysqli使用LIKE进行查询并获得所有结果


How can I with mysqli make a query with LIKE and get all results?

这是我的代码,但它不起作用:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
$stmt->fetch();

这个代码似乎不起作用。我搜索了很多。此外,它可能返回一行以上。那么,即使它返回的行数超过1行,我如何才能得到所有结果呢?

以下是如何正确获取结果

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id, username FROM users WHERE username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo "Id: {$row['id']}, Username: {$row['username']}";
}

或者,如果您喜欢旧的fetchbind_result语法,也可以执行以下操作:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,username FROM users WHERE username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
while ($stmt->fetch()) {
  echo "Id: {$id}, Username: {$username}";
}

我直接从这里和这里的手册中得到了答案。

从注释中可以发现,在参数化查询中,LIKE通配符(_%)默认情况下不会转义,因此可能会导致意外结果。

因此,当使用";"喜欢";语句,使用这个"负前瞻"Regex来确保这些字符被转义:

$param = preg_replace('/(?<!''')([%_])/', ''''$1',$param);

作为上面给出的答案的替代方案,您也可以使用MySQL CONCAT函数,因此:

$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();

PDO命名占位符版本:

$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',:var,'%') ");
$stmt->bind_param("s", ['var'=>$param]);
$stmt->execute();

这意味着您不需要编辑$param值,但确实可以进行稍长的查询。