You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

搜索功能可显示结果但报mysqli_fetch_array参数错误求助

问题分析与修复方案

嘿,我一眼就揪出导致这个警告的问题了!你遇到的mysqli_fetch_array() expects parameter 1 to be mysqli_result, string given错误,根源是在while循环内部重复引入数据库连接文件,同时代码里还有几个小坑需要修正。

错误原因拆解

  1. 重复引入connect.php:你在else分支里已经建立了一次数据库连接,却又在while循环的每一次迭代里重新require ("functions/connect.php")。如果connect.php里有任何对$query变量的赋值(哪怕是无心的调试代码),都会直接覆盖掉原本存储查询结果的mysqli_result对象,把它变成字符串,自然就触发了参数类型错误。就算没有覆盖变量,重复建立数据库连接也是完全没必要的性能浪费。
  2. 正则表达式语法错误:你写的preg_replace("#[^0-9a-z]i#","", $search);里,i(忽略大小写)修饰符放错位置了——它应该在分隔符#的外面,不然这个修饰符根本不起作用,正则会把i当成要过滤的字符之一。
  3. 重复加载文件: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:57:51