Ajax弹窗模态框多表取数问题:无Assistant时仍显示主表数据
解决无助理时任务详情模态框无法展示数据的问题
问题说明
表格中点击单元格会弹出模态框展示任务详情,需从job_register表获取jobregister_id、customer_name、machine_type、job_description、reason、jobregisterlastmodify_at字段,从assistants表获取username(助理)。当前存在问题:当任务没有对应助理时,job_register表的其他数据也无法在模态框中展示。
错误原因分析
- SQL查询条件错误:弹窗取数的SQL语句中额外添加了
AND assistants.jobregister_id = '$jobregister_id',这会过滤掉assistants表无匹配记录的行(LEFT JOIN后这些行的assistants.jobregister_id为NULL,不满足该条件),导致无助理的任务数据被排除。 - PHP逻辑错误:在处理
username为NULL的情况时,错误地将整个$html替换为提示文本,导致后续的任务字段无法输出。
修正后的弹窗取数代码(AdminJobTableJobInfo.php)
<?php include 'dbconnect.php'; $jobregister_id = $_POST["jobregister_id"]; // 修正SQL:去掉多余的assistants.jobregister_id条件,保留LEFT JOIN确保获取所有job_register数据 $query = "SELECT * FROM job_register LEFT JOIN assistants ON job_register.jobregister_id=assistants.jobregister_id WHERE job_register.jobregister_id = '$jobregister_id'"; $result = mysqli_query($conn, $query); // 检查查询是否成功 if (!$result) { die("Query failed: " . mysqli_error($conn)); } $html = ''; $row = mysqli_fetch_assoc($result); if ($row) { // 构建任务详情HTML $html .= "<h4>Row ID: " . $row["jobregister_id"] . "</h4>"; $html .= "<p>Leader: " . $row["job_assign"] . "</p>"; // 处理助理字段:为空时显示提示,否则显示用户名 if ($row["username"] !== NULL) { $html .= "<p>Assistant: " . $row["username"] . "</p>"; } else { $html .= "<p>Assistant: 无</p>"; } $html .= "<p>Place: " . $row["customer_name"] . "</p>"; $html .= "<p>Machine: " . $row["machine_type"] . " - " . $row["job_description"] . "</p>"; $html .= "<p>Reason: " . $row["reason"] . "</p>"; $html .= "<p>Last Update Date: " . $row["jobregisterlastmodify_at"] . "</p>"; } else { // 无匹配任务时的提示 $html = "<p>No data available for this job register ID.</p>"; } echo $html; ?>
额外优化建议
- 防止SQL注入:当前直接将
$_POST参数拼入SQL存在注入风险,建议使用mysqli预处理语句,示例如下:
$stmt = $conn->prepare("SELECT * FROM job_register LEFT JOIN assistants ON job_register.jobregister_id=assistants.jobregister_id WHERE job_register.jobregister_id = ?"); $stmt->bind_param("i", $jobregister_id); // 假设jobregister_id是整数类型 $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc();
- 表格代码优化:原表格中
<tbody>标签放在while循环内,会导致每一行生成一个<tbody>,不符合HTML规范,建议将<tbody>移到循环外:
<tbody> <?php while($row = $results->fetch_assoc()) { $jobregisterlastmodify_at = $row['jobregisterlastmodify_at']; $datemodify = substr($jobregisterlastmodify_at,0,11); ?> <tr> <td style="border-color: black;"></td> <td style="border-color: black;" class="clickable-cell" data-row-id="<?php echo $row['jobregister_id']?>"><?php echo $row['job_assign']?></td> <td style="border-color: black;"><?php echo $row['username'] ?? '无'?></td> <!-- 用空合并运算符处理空值 --> <td style="border-color: black;"><?php echo $row['customer_name']?></td> <td style="border-color: black;"><?php echo $row['machine_type']?> - <?php echo $row['job_description']?></td> <td style="border-color: black;"><?php echo $row['reason']?></td> <td style="border-color: black;"><?php echo $datemodify ?></td> </tr> <?php } ?> </tbody>
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

