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

PHP实现从逗号分隔用户ID中循环获取对应用户名问题求助

问题分析与解决方案

原代码的核心问题

  • 数据库连接重复加载:在foreach循环内每次引入数据库连接文件,会导致重复定义、连接资源浪费甚至报错,应将连接放在函数开头。
  • 函数过早终止:循环内的return语句会在第一次循环时就结束函数,后续用户ID的遍历和输出完全无法执行,且echo语句在return之后永远不会触发。
  • SQL注入风险:直接将用户ID拼接到SQL语句中,未使用预处理语句,存在安全隐患。
  • 结果集读取错误:fetch_row()返回索引数组,无法通过$result['user_username']这种关联键名取值,应使用fetch_assoc()获取关联数组。
  • 字段索引依赖不稳定:get_post()[8]依赖数组索引,一旦posts表字段顺序变化就会出错,建议直接用字段名get_post()['contributors']。

修正后的代码

function post_contributors()
{
    // 仅初始化一次数据库连接
    $conn = include '../includes/dbh.inc.php';
    if (!$conn) {
        return; // 连接失败直接退出
    }

    // 用字段名获取贡献者ID,避免索引依赖
    $contributor_ids = get_post()['contributors'] ?? '';
    if (empty($contributor_ids)) {
        return; // 无有效ID直接退出
    }

    $contributor_array = explode(",", $contributor_ids);
    
    foreach ($contributor_array as $contributor) {
        $contributor = trim($contributor); // 清除ID前后可能存在的空格
        if (empty($contributor)) {
            continue; // 跳过空ID
        }

        // 用预处理语句防范SQL注入
        $sql = "SELECT user_username FROM users WHERE user_id = ?";
        $stmt = mysqli_prepare($conn, $sql);
        // 若user_id是整数类型,将参数类型改为"i";字符串类型用"s"
        mysqli_stmt_bind_param($stmt, "s", $contributor);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);

        if ($row = mysqli_fetch_assoc($result)) {
            // 转义输出内容防范XSS攻击
            echo '<h3 class="post-contributor-username">' . htmlspecialchars($row['user_username']) . '</h3>';
        }

        mysqli_stmt_close($stmt);
    }
}

额外说明

  • 加入空值判断,避免处理无效的用户ID。
  • 使用htmlspecialchars()转义输出内容,防止XSS攻击。
  • 预处理语句的参数类型需根据user_id的实际字段类型调整,整数用"i",字符串用"s"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:55:20