医院网站挂号系统guahao.php代码开发指南
在医院信息化建设中,线上挂号系统是连接患者与医院服务的重要桥梁。guahao.php
作为挂号系统的核心处理页面,需要实现医生排班查询、号源选择、患者信息提交、订单生成等关键功能,本文将结合实际开发场景,详细讲解guahao.php
的代码实现逻辑,涵盖功能设计、数据库交互、安全防护等关键环节。
功能需求与设计思路
在编写guahao.php
前,需明确挂号系统的核心功能模块:
- 排班查询:患者按科室、日期、医生筛选可预约的号源;
- 号源管理:展示剩余号数、挂号时段(如上午/下午)、挂号费用等信息;
- 信息提交:患者填写真实信息(姓名、身份证号、手机号等);
- 订单生成:提交后生成唯一订单号,并同步更新号源库存;
- 结果反馈:向患者返回预约成功/失败提示,并引导后续操作(如查看订单、支付等)。
设计思路上需遵循“用户体验优先、数据安全可靠”原则,前端表单需做基础校验,后端需严格验证数据合法性,同时避免超卖(号源库存不足时仍可预约)。
数据库表结构设计
guahao.php
的运行依赖多个数据表,核心表结构如下(以MySQL为例):
科室表(department)
字段名 | 类型 | 说明 |
---|---|---|
id | int(11) | 科室ID(主键) |
name | varchar(50) | 科室名称(如内科) |
status | tinyint(1) | 是否可挂号(0-禁用,1-启用) |
医生表(doctor)
字段名 | 类型 | 说明 |
---|---|---|
id | int(11) | 医生ID(主键) |
name | varchar(20) | 医生姓名 |
department_id | int(11) | 所属科室ID(外键) |
intro | text | 医生简介 |
排班表(schedule)
字段名 | 类型 | 说明 |
---|---|---|
id | int(11) | 排班ID(主键) |
doctor_id | int(11) | 医生ID(外键) |
schedule_date | date | 排班日期(如2024-05-20) |
period | varchar(10) | 时段('am'-上午,'pm'-下午) |
total_slots | int(11) | 总号源数 |
booked_slots | int(11) | 已预约号数 |
fee | decimal(10,2) | 挂号费用 |
status | tinyint(1) | 排班状态(0-停诊,1-可预约) |
患者表(patient)
字段名 | 类型 | 说明 |
---|---|---|
id | int(11) | 患者ID(主键) |
name | varchar(20) | 患者姓名 |
id_card | varchar(18) | 身份证号 |
phone | varchar(11) | 手机号 |
预约订单表(appointment)
字段名 | 类型 | 说明 |
---|---|---|
id | int(11) | 订单ID(主键) |
patient_id | int(11) | 患者ID(外键) |
schedule_id | int(11) | 排班ID(外键) |
order_no | varchar(20) | 订单号(唯一) |
status | tinyint(1) | 订单状态(0-待支付,1-已支付,2-已取消) |
create_time | datetime | 创建时间 |
guahao.php代码实现
文件结构与请求方式
guahao.php
需处理两种请求:
- GET请求:用于展示挂号表单和排班查询结果;
- POST请求:用于提交患者信息并生成订单。
完整代码实现
<?php // 引入数据库配置文件 require_once 'config.php'; // 设置响应头为UTF-8 header('Content-Type: text/html; charset=utf-8'); // 初始化变量 $departments = []; $schedules = []; $error = ''; $success = ''; // 处理GET请求:查询排班或展示表单 if ($_SERVER['REQUEST_METHOD'] == 'GET') { // 获取科室列表(用于下拉框) $sql = "SELECT id, name FROM department WHERE status = 1 ORDER BY id ASC"; $result = $conn->query($sql); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $departments[] = $row; } } // 如果提交了查询条件(科室、日期、医生) if (isset($_GET['department_id']) && isset($_GET['schedule_date'])) { $department_id = intval($_GET['department_id']); $schedule_date = $_GET['schedule_date']; $doctor_id = isset($_GET['doctor_id']) ? intval($_GET['doctor_id']) : 0; // 构建查询SQL $sql = "SELECT s.id, d.name as doctor_name, s.schedule_date, s.period, s.total_slots, s.booked_slots, s.fee, s.status FROM schedule s LEFT JOIN doctor d ON s.doctor_id = d.id WHERE s.schedule_date = ? AND s.status = 1"; $params = [$schedule_date]; if ($department_id > 0) { $sql .= " AND d.department_id = ?"; $params[] = $department_id; } if ($doctor_id > 0) { $sql .= " AND s.doctor_id = ?"; $params[] = $doctor_id; } $sql .= " ORDER BY d.name, s.period"; // 使用预处理语句防止SQL注入 $stmt = $conn->prepare($sql); if ($stmt) { $stmt->bind_param(str_repeat('s', count($params)), ...$params); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $schedules[] = $row; } } $stmt->close(); } } } // 处理POST请求:提交预约信息 if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 获取并过滤表单数据 $department_id = isset($_POST['department_id']) ? intval($_POST['department_id']) : 0; $doctor_id = isset($_POST['doctor_id']) ? intval($_POST['doctor_id']) : 0; $schedule_id = isset($_POST['schedule_id']) ? intval($_POST['schedule_id']) : 0; $patient_name = trim($_POST['patient_name']); $id_card = trim($_POST['id_card']); $phone = trim($_POST['phone']); // 表单数据校验 if (empty($patient_name) || empty($id_card) || empty($phone) || $schedule_id <= 0) { $error = '请填写完整信息并选择号源!'; } elseif (!preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $patient_name)) { $error = '姓名只能包含中文!'; } elseif (!preg_match('/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/', $id_card)) { $error = '身份证号格式不正确!'; } elseif (!preg_match('/^1[3-9]\d{9}$/', $phone)) { $error = '手机号格式不正确!'; } else { // 开启事务(确保数据一致性) $conn->begin_transaction(); try { // 1. 检查号源是否充足(乐观锁,避免超卖) $sql = "SELECT total_slots, booked_slots FROM schedule WHERE id = ?
还没有评论,来说两句吧...