如何使用 mysqli 使用 LIKE 进行查询并获得所有结果?

Posted

技术标签:

【中文标题】如何使用 mysqli 使用 LIKE 进行查询并获得所有结果?【英文标题】:How can I with mysqli make a query with LIKE and get all results? 【发布时间】:2013-09-02 20:57:49 【问题描述】:

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

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

【问题讨论】:

请定义“不起作用” - php 错误? mysql错误?没有错误但有 0 个结果? 我想遍历所有结果。我怎样才能做到这一点?当我说不起作用时。它什么也不返回... 此代码中没有返回运算符。 它应该如何返回任何东西? 【参考方案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_assoc()) 
    echo "Id: $row['id'], Username: $row['username']";

我希望你意识到我直接从手册 @​​987654321@ 和 here 中得到了答案,这是你应该先去的地方。

【讨论】:

为 OP 辩护,手册页均未提及 LIKE 比较“功能”【参考方案2】:

更新

从 cmets 发现 LIKE 通配符(_%)在参数化查询中默认不会转义,因此可能会导致意外结果。

因此,当使用“LIKE”语句时,请使用此 'negative lookahead' 正则表达式来确保这些字符被转义:

$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 值,但会产生稍长的查询。

【讨论】:

嗨 concat 对 sql 注入安全吗?我问是因为它有引号。谢谢 @mikevorisis 是的,这是安全的,因为查询仍然是参数化的(使用?)。引号是因为 MySQL 正在连接三个字符串。 我对此表示赞同,因为我很确定您不能使用已接受的答案做“开始于”或“结束于”(如,您需要使用 CONCAT)。跨度> @MikeVorisis, CONCAT 在准备好的语句中安全不会被注入,但是在准备好的语句中使用 LIKE 子句时应该小心。考虑一下:$stmt=$db-&gt;prepare("SELECT customer` 作为suggestion WHERE customername LIKE CONCAT('cust_', ?, '%');");` 然后$key='J%';(甚至$key='';),$stmt-&gt;bind_param('s', $key); . 现在$stmt-&gt;execute(); 将返回ALL 记录。因此,在处理带有'LIKE' 子句的Prepared 语句时,您仍然需要正确处理_%。即使使用prepared语句,需要像 $key='J\%'; 这样转义。 @mikevorisis 虽然我认为您可能已经意识到这一点并且已经采取措施正确处理此类查询,但我认为分享这一点很重要,因为它也可以帮助其他人阅读本文。跨度> 【参考方案3】:

答案显然已经过时了,你甚至不需要使用 bind_param。

$querySql    = "SELECT * FROM table WHERE columnName LIKE :likeKeyWord";
$likeKeyWord = "%". $keyWord ."%";
$pdoStm      = $this -> db -> prepare($querySql);
$pdoStm -> execute([':likeKeyWord' => $likeKeyWord]);
return $pdoStm -> fetchAll();

【讨论】:

你误读了这个问题。它询问如何使用 MySQLi 而不是 PDO。

以上是关于如何使用 mysqli 使用 LIKE 进行查询并获得所有结果?的主要内容,如果未能解决你的问题,请参考以下文章

mySqli 使用通配符绑定参数 LIKE

在准备好的语句中使用 LIKE '%$var%' 的正确方法? [mysqli]

如何在 Laravel 中使用 LIKE 语句使用查询结果并再次查询

如何在 FMDB 查询 iOS Swift 4 中使用 Like with Text?

如何根据 WHERE 条件使用 mysqli 进行 SELECT 和 DELETE 和 RETURN 单行

MYSQL如何进行sql like (sql查询结果)的查询