56

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

$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 行,我怎样才能得到所有结果呢?

4

3 回答 3

82

这是正确获取结果的方法

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

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

于 2013-08-30T08:00:01.370 回答
45

更新

从评论中发现 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值,但会产生稍长的查询。

于 2016-04-13T08:42:45.103 回答
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();
于 2021-03-16T03:24:55.167 回答