php mysqli预备语句LIKE

时间:2013-08-30 07:49:06

标签: php sql mysqli sql-like

如何使用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行,我如何得到所有结果呢?

3 个答案:

答案 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";
}

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

答案 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();