PHP MySQLi循环遍历SQL查询结果出现无限重复输出问题求助
问题修复:PHP MySQL查询无限循环输出
问题原因
你的代码陷入无限循环的核心原因是:将mysqli_query($conn, $sql)直接放在了while循环的条件中。每次循环都会重新执行SQL查询,生成一个全新的结果集,mysqli_fetch_assoc每次都会从新结果集的第一条数据开始读取,永远不会走到结果集末尾,因此会无限输出第一条记录的name值。
另外,直接将$_SESSION['username']拼接进SQL语句的写法存在SQL注入风险,这是需要同步修复的安全问题。
修复方案
方案1:先执行查询,再遍历结果集
将查询操作移到循环外部,先获取完整的结果集,再循环遍历该结果集:
<?php require_once "connect.php"; session_start(); $username = $_SESSION['username']; $sql = "SELECT `name`, `time-start`, `time-end` FROM `reminders` WHERE username = '$username';"; // 先执行查询,保存结果集 $result = mysqli_query($conn, $sql); // 遍历已获取的结果集 while ($row = mysqli_fetch_assoc($result)) { echo $row["name"] . "<br>"; } ?>
方案2:使用预处理语句(推荐,解决安全问题)
直接拼接变量到SQL语句存在安全隐患,改用mysqli预处理语句是更规范、安全的写法:
<?php require_once "connect.php"; session_start(); $username = $_SESSION['username']; // 准备带占位符的预处理语句 $sql = "SELECT `name`, `time-start`, `time-end` FROM `reminders` WHERE username = ?;"; $stmt = mysqli_prepare($conn, $sql); // 绑定参数("s"表示参数为字符串类型) mysqli_stmt_bind_param($stmt, "s", $username); // 执行预处理语句 mysqli_stmt_execute($stmt); // 获取查询结果集 $result = mysqli_stmt_get_result($stmt); // 遍历输出结果 while ($row = mysqli_fetch_assoc($result)) { echo $row["name"] . "<br>"; } // 关闭语句与连接 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
修改后即可正确输出预期结果:
test test1
内容的提问来源于stack exchange,提问作者Hardwaregore
相关产品推荐
相关产品推荐

