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

2022-08-30 09:39:33

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

$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 行。那么,即使它返回超过1行,我怎么能得到所有的结果呢?


答案 1

下面介绍了如何正确获取结果

$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}";
}

或者您也可以执行以下操作:

$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']}";
}

我希望你意识到我直接从这里这里的手册中得到了答案,这是你应该首先去的地方。


答案 2

更新

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

因此,当使用“LIKE”语句时,请使用此“负前瞻”正则表达式来确保这些字符被转义:

$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();

这意味着您不需要编辑您的值,但确实会使查询时间稍长。$param


推荐