如何使用mysqli使用LIKE进行查询并获得所有结果?
这是我的代码,但它不起作用:
$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行,我如何得到所有结果呢?
答案 0 :(得分:59)
以下是您正确获取结果的方法
$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_array(MYSQLI_NUM)) {
foreach ($row as $r) {
print "$r ";
}
print "\n";
}
答案 1 :(得分:29)
从评论中发现LIKE通配符(_
和%
)默认情况下不会在Paramaterised查询中进行转义,因此可能会导致意外结果。
因此,在使用“LIKE”语句时,请使用此'negative lookahead' 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();
这意味着您无需编辑$param
值,但会查询稍长的查询。
答案 2 :(得分:0)
答案显然已经过时了,你甚至不需要使用bind_param。
$querySql = "SELECT * FROM table WHERE columnName LIKE :likeKeyWord";
$likeKeyWord = "%". $keyWord ."%";
$pdoStm = $this -> db -> prepare($querySql);
$pdoStm -> execute([':likeKeyWord' => $likeKeyWord]);
return $pdoStm -> fetchAll();