PHP+MySQL电子病历系统:生命体征录入外键表单报错求助
问题描述
我是PHP编程新手,正在开发电子病历网站,由管理员注册患者和医生,用户凭给定凭证登录。目前已完成管理员仪表盘、导航栏及新增患者/医生功能,但生命体征页面存在问题:
场景需求:医生可录入患者生命体征信息存入数据库,患者后续可查看记录。
我创建了如下数据库表:
CREATE TABLE `vitalsigns`( `vital_id`int(11) NOT NULL, `patient_id`int(11) NOT NULL, `doctor_id`int(11) NOT NULL, `temp`float NOT NULL, `heartRate`int(11) NOT NULL, `pulse`int(11) NOT NULL, `bloodPressure`int(11) NOT NULL, `respiratoryRate`int(11) NOT NULL, `bloodOxygen`int(11) NOT NULL, `date`date NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `doctor` ( `doctor_id` int(11) NOT NULL, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `fname` varchar(50) NOT NULL, `lname` varchar(50) NOT NULL, `address` varchar(255) NOT NULL, `date_of_birth` date DEFAULT NULL, `phone_number` int(11) NOT NULL, `specialty` varchar(50) NOT NULL, `gender` varchar(7) NOT NULL, `email_address` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `patient` ( `patient_id` int(11) NOT NULL, `username` varchar(50) NOT NULL, `password` varchar(255) NOT NULL, `fname` varchar(50) NOT NULL, `lname` text NOT NULL, `email_address` varchar(170) NOT NULL, `phone_number` int(20) NOT NULL, `date_of_birth` date NOT NULL DEFAULT current_timestamp(), `gender` varchar(7) NOT NULL, `country` varchar(50) NOT NULL, `address` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
通过phpMyAdmin为vitalsigns表设置外键:
ALTER TABLE `vitalsigns` ADD CONSTRAINT `vital_fk` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`patient_id`), ADD CONSTRAINT `vital_fk2` FOREIGN KEY (`doctor_id`) REFERENCES `doctor` (`doctor_id`); COMMIT;
但尝试录入生命体征记录时,始终收到错误提示:**Patient Id is required!**请帮忙修复。
附相关代码:
admin文件夹下vital_sign_add.php代码
<?php session_start(); if (isset($_SESSION['admin_id']) && isset($_SESSION['role'])) { if ($_SESSION['role'] == 'Admin') { include "../DB_connection.php"; $pi = ''; $di = ''; $temp = ''; $hr = ''; $pulse = ''; $bp = ''; $rr = ''; $bo = ''; $date = ''; if (isset($_GET['pi'])) $pi = $_GET['pi']; if (isset($_GET['di'])) $di = $_GET['di']; if (isset($_GET['temp'])) $temp = $_GET['temp']; if (isset($_GET['hr'])) $hr = $_GET['hr']; //if (isset($_GET['en'])) $en = $_GET['en']; if (isset($_GET['pulse'])) $pulse = $_GET['pulse']; if (isset($_GET['bp'])) $bp = $_GET['bp']; if (isset($_GET['rr'])) $rr = $_GET['rr']; if (isset($_GET['bo'])) $bo = $_GET['bo']; if (isset($_GET['date'])) $date = $_GET['date']; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Admin - Add Vital Record</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="../css/style.css"> <link rel="icon" href="../logo.png"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> </head> <body> <?php include "inc/navbar.php"; ?> <div class="container mt-5"> <a href="vital_sign.php" class="btn btn-dark">Go Back</a> <form method="post" class="shadow p-3 mt-5 form-w" action="req/vital_sign_add.php"> <h3>Add New Vital Sign Record</h3><hr> <?php if (isset($_GET['error'])) { ?> <div class="alert alert-danger" role="alert"> <?=$_GET['error']?> </div> <?php } ?> <?php if (isset($_GET['success'])) { ?> <div class="alert alert-success" role="alert"> <?=$_GET['success']?> </div> <?php } ?> <div class="mb-3"> <label class="form-label">Patient Id</label> <input type="text" class="form-control" value="<?=$pi?>" name="patient_id"> </div> <div class="mb-3"> <label class="form-label">Doctor Id</label> <input type="text" class="form-control" value="<?=$di?>" name="doctor_id"> </div> <div class="mb-3"> <label class="form-label">Temperature</label> <input type="text" class="form-control" value="<?=$temp?>" name="temp"> </div> <div class="mb-3"> <label class="form-label">Heart Rate</label> <input type="text" class="form-control" value="<?=$hr?>" name="heartRate"> </div> <div class="mb-3"> <label class="form-label">Pulse</label> <input type="text" class="form-control" value="<?=$pulse?>" name="pulse"> <div class="mb-3"> <label class="form-label">Blood Pressure</label> <input type="text" class="form-control" value="<?=$bp?>" name="bloodPressure"> </div> <div class="mb-3"> <label class="form-label">Respiratory Rate</label> <input type="text" class="form-control" value="<?=$rr?>" name="respiratoryRate"> </div> <div class="mb-3"> <label class="form-label">Blood Oxygen</label> <input type="text" class="form-control" value="<?=$bo?>" name="bloodOxygen"> </div> <div class="mb-3"> <label class="form-label">Conducted Date</label> <input type="date" class="form-control" value="" name="date"> <br> <button type="submit" class="btn btn-primary">Add</button> </form> </div> </body> </html> <?php }else { header("Location: ../login.php"); exit; } }else { header("Location: ../login.php"); exit; } ?>
requirements文件夹下vital_sign_add.php代码
include "../../DB_connection.php"; include "../data/vital_sign.php"; $pi = $_POST['patient_id']; $di = $_POST['doctor_id']; $temp = $_POST['temp']; $hr = $_POST['heartRate']; $pulse = $_POST['pulse']; //$employee_number = $_POST['employee_number']; $bp = $_POST['bloodPressure']; $rr = $_POST['respiratoryRate']; $bo = $_POST['bloodOxygen']; $date = $_POST['date']; $data = 'pi='.$patient_id.'&di='.$doctor_id.'&temp='.$temp.'&hr='.$heartRate.'&pulse='.$pulse.'&bp='.$bloodPressure.'&rr='.$respiratoryRate.'&bo='.$bloodOxygen.'&date='.$date; if (empty($patient_id)) { $em = "Patient ID is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($doctor_id)) { $em = "Doctor ID is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($temp)) { $em = "Temperature result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($heartRate)) { $em = "Heart Rate result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($pulse)) { $em = "Pulse result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($bloodPressure)) { $em = "Blood Pressure result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($respiratoryRate)) { $em = "Respiratory Rate result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($bloodOxygen)) { $em = "Blood Oxygen is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($date)) { $em = "Conducted Date is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else { $sql = "INSERT INTO vitalsigns(patient_id, doctor_id, temp, hearRate, pulse, bloodPressure, respiratoryRate, bloodOxygen, date) VALUES(?,?,?,?,?,?,?,?,?)"; $stmt = $conn->prepare($sql); $stmt->execute([$pi, $di, $temp, $hr, $pulse, $bp, $rr, $bo, $date]); $sm = "New vital sign record has been registered successfully"; header("Location: ../vital_sign_add.php?success=$sm"); exit; }
解决方案
你的问题根源是变量名不匹配,还有几处其他潜在错误,逐一修正如下:
1. 变量名错误(核心问题)
在requirements/vital_sign_add.php中,你把POST过来的patient_id赋值给了变量$pi,doctor_id赋值给了$di,但后续校验和拼接$data时,错误使用了未定义的$patient_id、$doctor_id等变量:
- 比如
if (empty($patient_id))中的$patient_id根本没定义,始终为空,所以触发错误提示 - 同理
$data字符串里的$doctor_id、$heartRate、$bloodPressure等也都是未定义的变量
修正后的代码片段:
// 修正$data拼接 $data = 'pi='.$pi.'&di='.$di.'&temp='.$temp.'&hr='.$hr.'&pulse='.$pulse.'&bp='.$bp.'&rr='.$rr.'&bo='.$bo.'&date='.$date; // 修正校验逻辑 if (empty($pi)) { $em = "Patient ID is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($di)) { $em = "Doctor ID is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($temp)) { $em = "Temperature result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($hr)) { $em = "Heart Rate result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($pulse)) { $em = "Pulse result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($bp)) { $em = "Blood Pressure result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($rr)) { $em = "Respiratory Rate result is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($bo)) { $em = "Blood Oxygen is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }else if (empty($date)) { $em = "Conducted Date is required"; header("Location: ../vital_sign_add.php?error=$em&$data"); exit; }
2. SQL字段拼写错误
INSERT语句中,你把heartRate拼写成了hearRate(少了一个t),这会导致数据库插入失败,修正如下:
$sql = "INSERT INTO vitalsigns(patient_id, doctor_id, temp, heartRate, pulse, bloodPressure, respiratoryRate, bloodOxygen, date) VALUES(?,?,?,?,?,?,?,?,?)";
3. 表单标签闭合错误
在admin/vital_sign_add.php的表单中,Pulse字段的<div class="mb-3">没有闭合,会导致HTML结构异常,补上闭合标签:
<div class="mb-3"> <label class="form-label">Pulse</label> <input type="text" class="form-control" value="<?=$pulse?>" name="pulse"> </div> <!-- 补上该闭合标签 --> <div class="mb-3"> <label class="form-label">Blood Pressure</label> <input type="text" class="form-control" value="<?=$bp?>" name="bloodPressure"> </div>
4. 数据库主键缺失
你的vitalsigns、doctor、patient表都定义了ID字段,但没设置为主键且自增,会导致插入数据时必须手动指定ID,同时外键关联也可能出问题,执行以下SQL修正表结构:
-- 修正vitalsigns表 ALTER TABLE `vitalsigns` MODIFY `vital_id` int(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`vital_id`); -- 修正doctor表 ALTER TABLE `doctor` MODIFY `doctor_id` int(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`doctor_id`); -- 修正patient表 ALTER TABLE `patient` MODIFY `patient_id` int(11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`patient_id`);
5. 安全建议
- 对用户输入的数据做类型校验,比如
patient_id、doctor_id应该是整数,用(int)强制转换或者在SQL中绑定类型 - 添加
isset()判断防止未定义索引错误,比如$pi = isset($_POST['patient_id']) ? $_POST['patient_id'] : ''; - 密码存储应该使用
password_hash()加密,当前代码中密码是明文存储,存在安全风险
内容的提问来源于stack exchange,提问作者msm torch6
相关产品推荐
相关产品推荐

