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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:25:21