PHP的mysqli预处理语句LIKEPHP的mysqli预处理语句LIKE(php mysqli

2019-05-08 18:53发布

我的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行?

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

我希望你明白我直接从手动得到的答案在这里和这里 ,这是你应该已经第一了。



Answer 2:


更新

从评论中发现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值,但确实会使稍长查询。



文章来源: php mysqli prepared statement LIKE