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

PHP报错求助:数组转字符串转换与mysqli_fetch_assoc参数异常

排查并修复你的PHP数据库函数错误

让我们一步步拆解你遇到的两个错误:

错误原因分析

1. Array to string conversion(行82)

这个错误说明你在某个地方把数组当成字符串来使用了。在你的代码里,问题出在第二个SQL语句的拼接上:

$sqli = "SELECT ... AND alr_historiques.UTLR_UID=$userID";

当第一个查询没有找到匹配的用户(比如用户名/密码错误),或者第一个查询执行失败时,$getID = mysqli_fetch_assoc($result)会返回false或null,此时$userID = $getID['UTLR_UID']会导致$userID不是一个合法的字符串/数值,甚至可能变成异常值,当你把它拼进SQL语句时,就触发了数组转字符串的错误。

2. mysqli_fetch_assoc() 参数错误(行88)

这个错误是第一个错误的连锁反应:因为$userID的值异常,导致第二个SQL语句语法无效,mysqli_query执行失败返回false(布尔值),而mysqli_fetch_assoc需要的是mysqli_result对象,自然就报错了。

修复后的代码

我给你调整后的函数,加上必要的错误检查,并且改用预处理语句(彻底避免SQL注入和拼接错误):

function getHistoriqueNotification($user, $mdp) {
    $com = new DbConnect();
    $db = $com->getDb();
    $message = array();

    // 第一个查询:获取用户ID,使用预处理语句避免注入和拼接错误
    $sql = "SELECT UTLR_UID FROM adm_utilisateurs WHERE UTLR_LOGIN = ? AND UTLR_MDP = ?";
    $stmt = mysqli_prepare($db, $sql);
    mysqli_stmt_bind_param($stmt, "ss", $user, $mdp);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    
    // 检查是否成功获取到用户数据
    if ($getID = mysqli_fetch_assoc($result)) {
        $userID = $getID['UTLR_UID'];
        
        // 第二个查询:获取通知历史,用JOIN替代旧的多表写法,同时用预处理语句
        $sqli = "SELECT 
                    alr_alertes.ALRT_DES_LN1,
                    alr_alertes.ALRT_PHOTO,
                    alr_historiques.AHIS_DES_LN1,
                    alr_historiques.AHIS_DATEHEURE 
                FROM alr_alertes
                JOIN alr_historiques ON alr_alertes.ALRT_UID = alr_historiques.ALRT_UID 
                WHERE alr_historiques.UTLR_UID = ?";
        
        $stmt2 = mysqli_prepare($db, $sqli);
        // 假设UTLR_UID是整数类型,如果是字符串请把"i"改成"s"
        mysqli_stmt_bind_param($stmt2, "i", $userID); 
        mysqli_stmt_execute($stmt2);
        $resulti = mysqli_stmt_get_result($stmt2);
        
        // 修复结果收集逻辑:原来的代码每次循环会覆盖$message,现在改为追加所有记录
        while ($row = mysqli_fetch_assoc($resulti)) {
            $message[] = array(
                'photo' => $row['ALRT_PHOTO'],
                'titre' => $row['ALRT_DES_LN1'],
                'dateHeure' => $row['AHIS_DATEHEURE'],
                'detail' => $row['AHIS_DES_LN1']
            );
        }
        
        mysqli_stmt_close($stmt2);
    } else {
        // 处理用户名/密码不匹配的情况
        $message['error'] = "用户名或密码错误";
    }
    
    mysqli_stmt_close($stmt);
    mysqli_close($db);
    
    return $message;
}

关键修复点说明

  1. 添加错误检查:每次查询后都验证结果有效性,避免用无效值继续后续操作。
  2. 使用预处理语句:
    • 彻底消除SQL注入风险(原代码直接拼接用户输入,存在严重安全漏洞)。
    • 自动处理变量类型,不会出现数组转字符串这类拼接错误。
  3. 优化结果收集:原代码循环中每次覆盖$message,最后只会返回最后一条记录,现在改为数组追加,保留所有历史通知。
  4. 规范表关联写法:用JOIN替代旧的多表逗号分隔写法,SQL可读性更强。

额外安全建议

  • 永远不要明文存储密码!应该用password_hash()加密存储,验证时用password_verify(),原代码直接比较明文密码的做法非常危险。
  • 可以开启mysqli严格错误报告,方便调试:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,它会抛出异常而非警告,更容易定位问题。

内容的提问来源于stack exchange,提问作者denzo kx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:42