Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用mysqli使用LIKE进行查询并获得所有结果?_Php_Sql_Mysqli_Sql Like - Fatal编程技术网

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

Php 如何使用mysqli使用LIKE进行查询并获得所有结果?,php,sql,mysqli,sql-like,Php,Sql,Mysqli,Sql 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); $

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

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

以下是正确获取结果的方法

$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']}";
}
我希望你意识到我直接从手册中得到了答案,而这正是你应该先去的地方。


更新 从注释中可以发现,在参数化查询中,LIKE通配符(
%
)在默认情况下不会转义,因此可能会导致意外结果

因此,在使用“LIKE”语句时,请使用此正则表达式确保转义这些字符:

$param = preg_replace('/(?<!\\\)([%_])/', '\\\$1',$param);

这意味着您不需要编辑
$param
值,但可以进行稍长的查询。

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

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

请定义“不工作”-PHP错误?MySQL错误?没有错误,只有0个结果?我想循环查看所有结果。我该怎么做?当我说不起作用的时候。它不返回任何内容…此代码中没有返回运算符。它应该如何返回任何内容?嗨,concat在sql注入中安全吗?我这样问是因为它有引用。Thanks@mikevorisis是的,它是安全的,因为查询仍然是参数化的(使用
)。这些引号是因为MySQL连接了三个字符串。我对此进行了升级,因为我非常确定您不能使用接受的答案“以开头”或“以结尾”(如中所示,您需要使用
CONCAT
)。@MikeVorisis,
CONCAT
在准备好的语句中是安全的,但是,在准备好的语句中使用
LIKE
子句时,应该谨慎。考虑这一点:<代码> $STMT= $dB->准备(“选择< /代码>客户”为<代码>建议>代码>代码>客户名称< /代码>,如CONTAT('CuSTY',,'%');然后
$key='J%'
(甚至
$key='';
),
$stmt->bind_param('s',$key)。现在
$stmt->execute()将返回所有记录。因此,在处理包含“LIKE”子句的准备语句时,您仍然需要以适当的方式处理
\uuu
%
。即使使用准备好的语句,也要像
$key='J\%那样进行转义是必需的。@mikevorisis虽然我认为您可能已经意识到了这一点,并且已经采取了适当的步骤来处理此类查询,但我认为分享是很重要的,因为这可能也有助于其他人阅读此文。为保护OP,手册中没有提到类似的比较“功能”,因为您误读了问题。它是在问如何使用MySQLi而不是PDO来实现它。
$querySql    = "SELECT * FROM table WHERE columnName LIKE :likeKeyWord";
$likeKeyWord = "%". $keyWord ."%";
$pdoStm      = $this -> db -> prepare($querySql);
$pdoStm -> execute([':likeKeyWord' => $likeKeyWord]);
return $pdoStm -> fetchAll();