搜索功能可显示结果但报mysqli_fetch_array参数错误求助
问题分析与修复方案
嘿,我一眼就揪出导致这个警告的问题了!你遇到的mysqli_fetch_array() expects parameter 1 to be mysqli_result, string given错误,根源是在while循环内部重复引入数据库连接文件,同时代码里还有几个小坑需要修正。
错误原因拆解
- 重复引入
connect.php:你在else分支里已经建立了一次数据库连接,却又在while循环的每一次迭代里重新require ("functions/connect.php")。如果connect.php里有任何对$query变量的赋值(哪怕是无心的调试代码),都会直接覆盖掉原本存储查询结果的mysqli_result对象,把它变成字符串,自然就触发了参数类型错误。就算没有覆盖变量,重复建立数据库连接也是完全没必要的性能浪费。 - 正则表达式语法错误:你写的
preg_replace("#[^0-9a-z]i#","", $search);里,i(忽略大小写)修饰符放错位置了——它应该在分隔符#的外面,不然这个修饰符根本不起作用,正则会把i当成要过滤的字符之一。 - 重复加载文件:
FileName.php被多次在不同分支和循环里引入,重复加载文件可能导致变量冲突或不必要的资源消耗。
修复后的完整代码
<?php // 把需要引入的文件统一放在脚本顶部,只加载一次 require ("functions/connect.php"); require ("functions/FileName.php"); // Search Members if(isset($_POST["SearchMembersSubmit"])) { $search = mysqli_real_escape_string($connect,$_POST['SearchMembers']); // 修正正则表达式的修饰符位置 $search = preg_replace("#[^0-9a-z]#i","", $search); // Check Form is not blank if (empty($search)){ $msg = "<div class=\"alert alert-danger\">Please enter a search criteria</div>"; } else { // 优化错误提示,方便调试查询失败的原因 $query = mysqli_query($connect,"SELECT RegUsername, RegFirstName, RegLastName, RegEmail FROM registered WHERE RegUsername LIKE '%".$search."%' OR RegFirstName LIKE '%".$search."%' OR RegLastName LIKE '%".$search."%' OR RegEmail LIKE '%".$search."%'") or die ("Query failed: " . mysqli_error($connect)); $count = mysqli_num_rows($query); if($count == 0){ $msg = "<div class=\"alert alert-danger\">There was no search results</div>"; }else{ $msg = ""; // 初始化msg,避免未定义的情况 while ($row = mysqli_fetch_array($query)) { $RegUsername = $row ['RegUsername']; $RegFirstName = $row ['RegFirstName']; $RegLastName = $row ['RegLastName']; $RegEmail = $row ['RegEmail']; //The layout and what will be shown on page $msg .='<p><b>User:</b> '.$RegUsername. '<br><b>First Name:</b> '.$RegFirstName. '<br><b>Last Name:</b> '.$RegLastName. '<br><b>Email:</b> '.$RegEmail. '</p> <hr>'; } } } } ?>
额外优化建议
- 改用预处理语句:虽然你用了
mysqli_real_escape_string来转义输入,但使用预处理语句是更安全的防SQL注入方式,示例代码如下:
// 替换原来的查询代码 $stmt = mysqli_prepare($connect, "SELECT RegUsername, RegFirstName, RegLastName, RegEmail FROM registered WHERE RegUsername LIKE ? OR RegFirstName LIKE ? OR RegLastName LIKE ? OR RegEmail LIKE ?"); $searchPattern = "%{$search}%"; mysqli_stmt_bind_param($stmt, "ssss", $searchPattern, $searchPattern, $searchPattern, $searchPattern); mysqli_stmt_execute($stmt); $query = mysqli_stmt_get_result($stmt);
内容的提问来源于stack exchange,提问作者CwStrange
相关产品推荐
相关产品推荐

