PHP模糊搜索结果正确却触发bind_param参数不匹配警告
问题:模糊搜索修改SQL后触发参数不匹配警告的原因?
我在PHP中写了一个处理双字段搜索表单的函数,最初的SQL只支持精确匹配,运行正常:
$query = "SELECT itemnumber, manufacturer, name, price FROM books WHERE $searchtype = ?"; $stmt = $db->prepare($query); $stmt->bind_param('s', $searchterm); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($itemnumber, $manufacturer, $name, $price);
比如搜“Tree”没结果,必须搜完整值“Tree Company”才会返回。为了做模糊搜索,我改了SQL:
$query = "SELECT itemnumber, manufacturer, name, price FROM books WHERE $searchtype LIKE '%$searchterm%'"; $stmt = $db->prepare($query); $stmt->bind_param('s', $searchterm); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($itemnumber, $manufacturer, $name, $price);
测试时选manufacturer、搜tree能出正确结果,但触发警告:
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in...
请问这个错误的原因是什么?
原因分析与解决方法
问题出在这儿:你改后的SQL里直接把$searchterm拼进了字符串,没留占位符?,但后面还是调用bind_param绑定参数。预编译语句里根本没有需要填充的参数位,你却硬传了一个变量,这不就报数量不匹配了嘛。
而且直接把变量拼进SQL还有SQL注入的风险,正确的模糊搜索应该这么写:把通配符%和搜索词拼好之后,再绑定到占位符上:
$query = "SELECT itemnumber, manufacturer, name, price FROM books WHERE $searchtype LIKE ?"; // 先给搜索词加上前后通配符 $searchWithWildcards = "%{$searchterm}%"; $stmt = $db->prepare($query); $stmt->bind_param('s', $searchWithWildcards); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($itemnumber, $manufacturer, $name, $price);
这样既安全,又能实现模糊搜索,还不会触发那个警告。
内容的提问来源于stack exchange,提问作者avocado208
相关产品推荐
相关产品推荐

