PHP中如何向日历传递多行JSON并分离SQL查询的目标列
实现方案
整套逻辑只需要调整两个开发中常见的错位问题:一是修正循环赋值位置错误导致只取到最后一行数据的bug,二是做好字段的读写分离,让priority字段只用来做内部的样式判断逻辑,不进入对外输出的JSON结构。
先修正循环逻辑错位的问题
之前只拿到最后一行结果,本质是把单条数据的赋值代码写到了遍历循环的外面:循环跑的时候临时变量每次被覆盖,循环结束后变量里只剩最后一次循环拿到的值,根本没法收集全所有行的数据。
正确的代码流程要严格顺过来:
- 遍历开始前,先初始化一个空数组,用来放最终要传给日历的事件
- 每一行数据库数据的读取、逻辑计算、字段组装,全部在循环内部完成
- 所有行处理完之后,再对整份数组做JSON序列化输出
做好字段分离的逻辑
完全没必要为了不泄露priority就特意在SQL查询里去掉这个字段——你本来就需要它的值来判断事件样式,直接从结果集里读出来当临时变量用就好。
每一行数据的处理拆成两步,全程别让原始的priority进到最终的输出数组里:
- 内部逻辑计算:取当前行的
priority值,通过映射规则算出对应的样式类名,比如高优先级对应event-high-priority、中优先级对应event-medium-priority - 按需组装输出:只把日历组件要求的字段(
title、description、start、end,以及前面算出来的样式类名)拼成单条事件数据,绝对不把原始的priority值塞到这个结构里
之前直接把整行查询结果塞到输出数组里导致
priority泄露,就是因为没有做字段筛选,把所有拿到的数据库字段无差别传给了前端。只要重新按需要组装单条数据的结构,只挑允许对外的字段填入,就不会有内部字段泄露的问题。
参考可运行代码
// 数据库连接初始化省略,直接执行查询拿到mysqli结果集 $result = $conn->query("SELECT priority, task_name AS title, task_description AS description, start_date AS start, end_date AS end FROM t_tasks"); // 循环开始前初始化空的输出数组,单条赋值代码绝对不能放在这里 $calendarEvents = []; // 逐行遍历结果集 while ($row = $result->fetch_assoc()) { // 内部逻辑:用priority值判断样式类名,原始值只存在临时变量里 switch ($row['priority']) { case 1: $eventClass = 'event-priority-high'; break; case 2: $eventClass = 'event-priority-medium'; break; default: $eventClass = 'event-priority-low'; } // 组装单条事件,只填入日历需要的字段,不包含原始priority值 $singleEvent = [ 'title' => $row['title'], 'description' => $row['description'], 'start' => $row['start'], 'end' => $row['end'], 'className' => $eventClass ]; // 把单条事件追加到最终数组,这行必须写在循环内部 $calendarEvents[] = $singleEvent; } // 循环跑完统一输出JSON,此时数组里已经包含了所有行的事件数据 header('Content-Type: application/json'); echo json_encode($calendarEvents);
如果你的日历组件不需要接收自定义类名字段,完全可以把switch判断出来的类名不写入$singleEvent数组,走完逻辑计算就把临时的priority值丢掉,最终输出的JSON会完全符合日历组件的格式要求,也不会暴露任何内部逻辑用到的字段。
内容的提问来源于stack exchange,提问作者Maina David
相关产品推荐
相关产品推荐

