You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax加载餐饮菜单失效求助:代码排查请求

餐饮菜单Ajax加载功能排查与修复

以下是针对你代码中存在的问题逐一排查和修复方案:

1. 数据库字段与SQL查询不匹配

你的CateringService表结构中没有Description字段,且价格字段是PricePerUnit,但在CateringMenuPage.php的SQL查询中却使用了Description和Price,这会直接导致查询失败。

修复方案:

修改CateringMenuPage.php中的SQL语句,匹配实际表字段:

// 原错误查询
$query = "SELECT ServiceName, Description, Price FROM CateringService WHERE ServiceName=?";

// 修改后
$query = "SELECT ServiceName, PricePerUnit FROM CateringService WHERE ServiceName=?";

同时调整输出部分,去掉不存在的Description字段:

echo "<div>";
echo "<h2>". htmlspecialchars($row['ServiceName']). "</h2>";
// 移除Description输出,因为表中没有该字段
echo "<p>Price: $". htmlspecialchars($row['PricePerUnit']). "</p>";
echo "</div>";

如果需要展示菜品描述,需要先给CateringService表添加Description字段:

ALTER TABLE CateringService ADD COLUMN Description TEXT;

2. ServiceName大小写/名称不匹配

前端点击时传递的参数是小写(比如'breakfast'),但数据库中存储的ServiceName可能是首字母大写(比如'Breakfast'),导致WHERE条件匹配不到数据。

修复方案:

  • 方案一:统一前后端的名称格式,比如前端传递首字母大写的参数:
<label for="catering_breakfast" onclick="loadMenu('Breakfast')">Breakfast</label>
<label for="catering_lunch" onclick="loadMenu('Lunch')">Lunch</label>
<!-- 其余标签同理修改 -->
  • 方案二:修改SQL查询,忽略大小写匹配(适用于MySQL):
$query = "SELECT ServiceName, PricePerUnit FROM CateringService WHERE LOWER(ServiceName)=LOWER(?)";

3. 缺失错误处理逻辑

CateringMenuPage.php中没有处理以下情况:

  • $_GET['service']参数不存在时会报错
  • 查询结果为空时直接访问$row的字段会触发PHP警告

修复方案:

添加参数校验和空结果处理:

<?php
include 'Database.php';

// 校验service参数是否存在
if (!isset($_GET['service']) || empty($_GET['service'])) {
    echo "<p>无效的请求参数</p>";
    exit;
}

$service = $_GET['service'];

$dbc = new Database();
if (!$dbc) {
    die('Could not connect: '. mysqli_connect_error());
}

$query = "SELECT ServiceName, PricePerUnit FROM CateringService WHERE LOWER(ServiceName)=LOWER(?)";
$stmt = $dbc->prepare($query);
$stmt->bind_param("s", $service);
$stmt->execute();
$result = $stmt->get_result();

// 检查是否查询到数据
if ($result->num_rows === 0) {
    echo "<p>未找到对应菜单</p>";
} else {
    $row = $result->fetch_assoc();
    echo "<div>";
    echo "<h2>". htmlspecialchars($row['ServiceName']). "</h2>";
    echo "<p>Price: $". htmlspecialchars($row['PricePerUnit']). "</p>";
    echo "</div>";
}

// 关闭数据库连接和语句
$stmt->close();
$dbc->close();
?>

4. 数据库连接类方法兼容性问题

你的Database类如果是自定义封装,需要确保prepare()方法返回的是MySQLi语句对象,否则bind_param()、execute()等方法会失效。可以先测试直接使用原生MySQLi连接来验证:

// 临时替换CateringMenuPage.php中的数据库初始化代码,测试是否能正常查询
$dbc = mysqli_connect("localhost", "用户名", "密码", "数据库名");
if (!$dbc) {
    die('Could not connect: '. mysqli_connect_error());
}

如果原生连接能正常工作,说明你的Database类封装存在问题,需要检查其prepare()方法的实现。

5. 前端调试建议

打开浏览器开发者工具(F12),切换到**网络(Network)**标签,点击标签后查看请求的状态:

  • 如果请求返回404:检查CateringMenuPage.php的路径是否正确,确保和View_catering.php在同一目录下
  • 如果请求返回500:查看响应内容中的PHP错误信息,这是定位后端问题的关键
  • 如果请求返回200但内容为空:说明SQL查询没有返回数据,回到前面的字段/名称匹配问题排查

内容的提问来源于stack exchange,提问作者Stu123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:17:04