我的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行?
下面是你正确地获取结果
$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";
}
我希望你明白我直接从手动得到的答案在这里和这里 ,这是你应该已经第一了。
更新
从评论中发现LIKE通配符( _
和%
),默认情况下不上Paramaterised查询逃脱,所以可能会导致意想不到的结果。
因此,使用“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
值,但确实会使稍长查询。