【发布时间】:2022-01-05 18:57:27
【问题描述】:
在得到How to perform a LIKE query using multiple keywords from search field using mysqli prepared statement 的帮助后,我做了这个功能,但做了一些更改,因为我只有一个搜索参数。
function searchResult($con, $search) {
$keywords = explode(" ", $search);
$total_keywords = count($keywords);
$myquery = "SELECT * FROM products WHERE name LIKE CONCAT('%',?,'%')";
for ($i=1 ; $i < $total_keywords; $i++) {
$myquery .= " OR name LIKE CONCAT('%',?,'%')";
}
$stmt = mysqli_stmt_init($con);
//check if the statement is not prepared
if (!mysqli_stmt_prepare($stmt, $myquery)) {
header("location: search.php?errorid=stmt_failed");
exit();
}
$typeparam = '';
foreach ($keywords as $key => $value) {
$typeparam .= 's';
}
$bind_param = array();
$bind_param[] =& $typeparam;
foreach ($keywords as $key => $value) {
$bind_param[]=&$keywords[$key];
}
call_user_func_array(array($stmt,'bind_param'), $bind_param);
mysqli_stmt_execute($stmt);
$matches = mysqli_stmt_get_result($stmt);
if ($searches = mysqli_fetch_assoc($matches)) {
return $searches;
} else {
$result = false;
return $result;
}
mysqli_stmt_close($stmt);
}
现在,我有一个名为 products 的表,在该表中我有:
尼康油漆桶
砖块
亚洲油漆 2 升蓝色饰面
PVC管
当我只搜索砖块时,它返回 砖块,同样返回所有其他产品。但是,通过搜索 bricks paint,它只返回 Nikon Paint bucket,但它应该返回 Bricks 以及表中的 Paint 结果。所以,有两个问题,一个是它没有考虑多个关键字。另一个问题是,它不会返回具有相同关键字的两个结果。
此外,Prepared statements 是防止 SQL 注入的最佳方法,但在搜索栏中使用它是否明智,因为 mysqli_real_escape_string() 似乎效率低下。有没有其他方法可以制作安全的搜索栏?
【问题讨论】:
-
你为什么不使用 PDO?
-
如果我是你,我会完全忘记
mysqli_real_escape_string的存在。不要走那条路。只需要一直使用准备好的语句。 -
我明白你关于逃跑的观点。另外,我对 PDO 不太熟悉,但看起来 PDO 相当可靠,而且付出更多。所以,PDO 是前进的方向。