PHP使用Session变量实现收藏夹功能跨页面无法展示收藏内容问题
问题原因
- 提交逻辑错位:菜单页的表单
action直接设置为favourites.php,点击添加按钮后请求直接发送到收藏页,但添加收藏的业务逻辑写在菜单页代码里,全程没有执行,$_SESSION['favourites']自然不会被写入数据。 - 判断条件错误:菜单页里添加逻辑的判断条件
isset($_POST["favourites"])无效,表单中不存在name="favourites"的元素,这个条件永远不成立,就算提交到菜单页也不会触发写入逻辑。 - 收藏页HTML语法错误:你把
</table>标签写在了foreach循环内部,遍历第一条数据就会闭合表格,就算有收藏数据也只会显示第一条,后续内容排版完全错乱。 - 额外语法问题:菜单页的重复收藏提示
alert缺少左引号,执行时会报JS语法错误。
修复方案
1. 修改菜单页表单提交目标
把表单的action改成提交给菜单页自身,写入session完成后再跳转去收藏页:
<!-- 替换原来的form标签 --> <form method="post" action="menudetails.php?action=add&id=<?php echo $row["id"]; ?>">
在菜单页两处写入session的逻辑后新增跳转代码:
// 第一个写入位置 $_SESSION["favourites"][$count] = $item_array; // 新增跳转 header("Location: favourites.php"); exit(); // 第二个写入位置 $_SESSION["favourites"][0] = $food_array; // 新增跳转 header("Location: favourites.php"); exit();
2. 修复菜单页的判断条件
把if(isset($_POST["favourites"]))改成判断session里的收藏数组是否存在:
if(isset($_SESSION["favourites"]))
3. 修复重复收藏提示的语法错误
// 替换原来的alert代码 echo '<script>alert("You have already added this item to Favourites")</script>';
4. 修复收藏页的HTML语法
把</table>移到foreach循环外面,同时修正td的width属性写法:
<?php if(!empty($_SESSION["favourites"])) { foreach($_SESSION["favourites"] as $key => $value) { ?> <tr> <!-- 把错误的width: 20%改成正确的width="20%" --> <td width="20%"><?php echo $value["item_name"] ?></td> <td style="text-align: left"><?php echo $value["item_desc"]?></td> <td><?php echo '€'.$value["item_price"]?></td> <td><a href="favourites.php?action=delete&id=<?php echo $value["item_id"]; ?>"><span class="fav-btn">Remove</span></a></td> </tr> <?php } } ?> <!-- 闭合表格标签移到循环外 --> </table>
5. 确认session引入规则
两个页面的最开头第一行都要先引入session.php,不能有任何输出(包括空格、UTF-8 BOM头)在session_start()之前,否则session会失效。
内容的提问来源于stack exchange,提问作者something101
相关产品推荐
相关产品推荐

