PHP执行while循环后重置查询行报错及表格实现优化咨询
嘿,我来帮你理清楚问题所在,然后给你几个靠谱的解决方案~
首先,你遇到的reset() expects parameter 1 to be array错误,以及第二个列没数据的问题,根源有两个:
- 第一个
while($row = mysqli_fetch_assoc($user))已经把整个查询结果集遍历完了,结果集的内部指针移到了末尾,所以第二个while循环根本拿不到任何数据。 reset($row)用错地方了:reset()是用来重置数组的内部指针,但这里的$row是每次循环取出的单条记录数组,而且当第一个循环结束时,$row的值是false(因为没有更多行可取了),这时候调用reset($row)自然就会报错。
另外,你的表格写法有点特殊——把所有用户名塞在一个<td>里、所有邮箱塞在另一个<td>里,这不是常规的表格结构(常规是一行对应一条用户数据),我给你两种方案,看你需要哪种:
方案一:保持你原来的列布局(所有用户名/邮箱各占一列)
先把所有查询结果存到一个数组里,之后再分别遍历渲染列内容:
<?php include ('config.php'); // 先把所有用户数据存入数组 $users = []; $result = mysqli_query($userDB, "SELECT username, email FROM user") or die(mysqli_error()); while($row = mysqli_fetch_assoc($result)) { $users[] = $row; } ?> <table width="200" border="1"> <tbody> <tr> <th scope="col">Username</th> <th scope="col">Email</th> </tr> <tr> <td align="center"> <?php foreach($users as $user) echo $user["username"] . "<br>"; ?> </td> <td align="center"> <?php foreach($users as $user) echo $user["email"] . "<br>"; ?> </td> </tr> </tbody> </table>
方案二:标准表格结构(每行对应一条用户数据,更推荐)
这是更符合用户预期、易维护的写法:
<?php include ('config.php'); $result = mysqli_query($userDB, "SELECT username, email FROM user") or die(mysqli_error()); ?> <table width="200" border="1"> <tbody> <tr> <th scope="col">Username</th> <th scope="col">Email</th> </tr> <?php while($row = mysqli_fetch_assoc($result)): ?> <tr> <td align="center"><?php echo $row["username"]; ?></td> <td align="center"><?php echo $row["email"]; ?></td> </tr> <?php endwhile; ?> </tbody> </table>
额外小建议
- 尽量别用
die(mysqli_error()),可以换成更友好的错误处理(比如记录错误日志),避免把错误信息直接暴露给用户。 - 如果之后你的查询需要用到用户输入的参数,一定要用预处理语句防止SQL注入,养成好习惯~
内容的提问来源于stack exchange,提问作者Chemdawg
相关产品推荐
相关产品推荐

