[英]How Can I Get Query Results for a Date Range with a MySQLi prepared statement
[英]How can I with mysqli make a query with LIKE and get all results?
这是我的代码,但它不起作用:
$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 行,我如何才能获得所有结果呢?
以下是正确获取结果的方法
$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);
作为上述给定答案的替代方案,您还可以使用 MySQL CONCAT函数,因此:
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();
这意味着您不需要编辑您的$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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.