从数据库检索行数据并存储到Session数组的技术问题
解决从数据库检索数据并存入数组/Session数组的问题
看起来你在把数据库数据存入数组和Session的时候遇到了几个小问题,我帮你梳理下代码里的问题,再给出修正后的版本:
首先,咱们先排查你代码里的关键问题:
- SQL语句语法错误:你写的
where '$user_year' = year不仅逻辑搞反了(应该是字段等于变量,而非变量等于字段),直接把变量拼进SQL还有注入风险,另外语句还没闭合双引号 - 未执行查询:你只是定义了SQL字符串,但没有调用数据库连接执行查询,所以
$query并不是结果集,根本没法用fetch_assoc() - 控制台输出错误:直接把PHP数组放进
console.log里只会输出Array,得转成JSON格式才能让浏览器识别出数组结构 - 缺失Session存储逻辑:你提到要存到Session数组,但代码里完全没做这一步
下面是修正后的完整代码,我加了详细注释:
<?php session_start(); // 先检查Session变量是否存在,避免未定义报错 if (!isset($_SESSION['year'], $_SESSION['year_floor'])) { // 可根据需求处理,比如跳转到登录页或提示错误 die("Session变量未设置,请先完成前置操作"); } $user_year = $_SESSION['year']; $floor = $_SESSION['year_floor']; include "config.php"; // 假设$conn是config.php里创建的mysqli连接对象 // 使用预处理语句,避免SQL注入,同时修正where子句逻辑 $query = "SELECT * FROM timetable WHERE year = ?"; $stmt = $conn->prepare($query); // 绑定参数,s表示字符串类型,如果year是数字可以换成i $stmt->bind_param("s", $user_year); // 执行查询 $stmt->execute(); // 获取结果集 $result = $stmt->get_result(); $array = array(); // 循环获取每行数据并存入数组 while ($row = $result->fetch_assoc()) { $array[] = $row; } // 将数组存入Session(如果需要跨页面持久化数据的话) $_SESSION['timetable_data'] = $array; // 正确输出数组到浏览器控制台,用json_encode转成JSON格式 echo '<script>console.log(' . json_encode($array) . ')</script>'; // 关闭语句和数据库连接 $stmt->close(); $conn->close(); ?>
关键改动说明:
- 预处理语句:用
prepare()和bind_param()处理SQL,既避免了语法错误,又杜绝了SQL注入风险,这是数据库操作的标准安全做法 - 执行查询并获取结果:必须执行查询后才能拿到结果集,之前的代码直接用字符串变量调用
fetch_assoc()肯定会报错 - Session存储:新增了
$_SESSION['timetable_data'] = $array;,把获取到的数组存入Session,之后在其他页面只要开启session就能直接访问 - 控制台输出:用
json_encode($array)把PHP数组转成JSON字符串,这样浏览器控制台能显示完整的数组结构,而不是毫无意义的Array字符串
如果你的config.php用的是PDO连接,我也可以给你对应的PDO版本代码,先默认你用的是mysqli啦~
内容的提问来源于stack exchange,提问作者JimmyPop13
相关产品推荐
相关产品推荐

