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

mysqli_fetch_assoc迭代仅返回数组第二个元素问题求助

问题分析与解决方法

嗨,刚学PHP遇到这种情况很正常,我来帮你拆解下问题~

核心问题:输出的JSON格式不合法

你现在的代码是在循环里每次单独echo json_encode($line),这样最终输出的内容是两个独立的JSON对象直接拼接在一起,比如:

{"id":1,"name":"张三"}{"id":2,"name":"李四"}

这种格式不符合JSON规范,解析工具(比如前端JS)无法识别为一个完整的数据集,通常只会处理最后一个有效的JSON对象,所以你看起来只拿到了第二个结果。

修复方法:先收集所有结果再统一输出

正确的做法是先把查询到的所有行数据存入一个数组,最后一次性对整个数组进行JSON编码输出,这样得到的是一个合法的JSON数组。修改后的代码如下:

// 注意:你提到数据库表是dbTableofTeaches,要确保SQL里的表名和实际一致哦
$query2 = "select * from dbTableofTeaches where teacherid_fk LIKE '$teacherid_fk'"; 
$userinfo2 = mysqli_query($conn, $query2);

// 初始化一个空数组,用来存放所有查询结果
$allResults = [];

// 循环读取每一行数据,存入数组
while ($line = mysqli_fetch_assoc($userinfo2)) {
    $allResults[] = $line;
}

// 最后一次性输出整个数组的JSON格式
echo json_encode($allResults);

这样输出的会是标准的JSON数组:

[{"id":1,"name":"张三"},{"id":2,"name":"李四"}]

前端或者任何JSON解析工具都能正确识别并处理所有结果。

额外重要提醒:防范SQL注入

你现在直接把变量$teacherid_fk拼接到SQL语句里,存在严重的SQL注入风险,这是PHP开发里的常见坑,建议使用mysqli预处理语句来改进:

// 使用预处理语句,避免SQL注入
$query2 = "select * from dbTableofTeaches where teacherid_fk LIKE ?";
$stmt = mysqli_prepare($conn, $query2);

// 绑定参数,"s"表示参数是字符串类型
mysqli_stmt_bind_param($stmt, "s", $teacherid_fk);
mysqli_stmt_execute($stmt);

// 获取查询结果
$userinfo2 = mysqli_stmt_get_result($stmt);

$allResults = [];
while ($line = mysqli_fetch_assoc($userinfo2)) {
    $allResults[] = $line;
}

echo json_encode($allResults);

预处理语句会自动处理变量的转义,大幅提高代码的安全性,这也是新手应该尽早养成的好习惯~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:53:58