零框架PHP学生成绩系统:学生查分+教师录分+完整SQL脚本+操作视频
本文还有配套的精品资源,点击获取
简介:纯原生PHP写的学生成绩管理程序,不依赖Laravel、ThinkPHP等任何框架,也不用Composer、路由或模板引擎,只靠基础PHP+MySQL+HTML+CSS+JS就能跑起来。系统分学生和教师两个入口:学生登录后能看自己各科成绩、改密码和基本信息;教师登录后可以增删改查学生档案、批量录成绩、单条修改分数、重置学生密码。所有PHP文件都是手写逻辑,比如add_student_submit.php处理新增学生,update_mark_submit.php更新分数,check_session_login.php做登录校验,代码带中文注释,结构一目了然。压缩包里有全部前端页面(index.html、style.css、swiper.min.css等)、后端PHP脚本(共20多个核心文件)、建库建表的SQL文件(直接phpMyAdmin导入就行)、Word版图文说明文档、项目结构图,还有一个实操演示视频(php学生管理系统.mov),从环境部署到功能操作全涵盖。适合PHP初学者练手、课程设计参考或快速搭建轻量教学管理后台。
1. 为什么“零框架”才是新手学PHP的黄金起点?
刚接触PHP的新手,常被Laravel的Artisan命令、ThinkPHP的路由定义、Composer的依赖管理绕得晕头转向。我带过十几届学生做课程设计,发现一个铁律:90%的人卡在“环境配不起来”和“不知道哪段代码管哪个功能”上,而不是逻辑本身。这套“零框架PHP学生成绩系统”,就是我用三年时间打磨出来的“去幻觉教学工具”——它不炫技,不堆砌概念,只用最原始的<?php ?>标签、$_POST接收、mysqli_query()执行SQL,把Web开发最底层的“请求-处理-响应”链条,像拆解自行车一样摊开给你看。
核心关键词“原生PHP”在这里不是怀旧,而是精准的教学策略。比如学生登录后查看成绩,整个流程只有三步:index.php表单提交 →check_session_login.php验证账号密码并启动session →stuinfo.php从数据库查出该学生所有科目成绩并渲染HTML表格。没有中间件拦截、没有路由映射、没有自动注入,你打开任何一个PHP文件,第一行就能看到<?php session_start();,最后一行就是</body>闭合标签。这种“所见即所得”的结构,让初学者第一次真正理解“为什么改了query.php里的SQL语句,页面上的数据就变了”。
更关键的是,“MySQL成绩录入”这个功能点,在框架里可能要写Model、Controller、View三层,而在这里,它浓缩成一个insert_mark.php文件:前端用HTML表格批量输入学号、科目、分数,后端用foreach($_POST['student_id'] as $key => $id)循环插入,连预处理语句都用最直白的"INSERT INTO scores (student_id, subject, score) VALUES ('$id', '$subject[$key]', '$score[$key]')"(当然,实际部署前我会教你怎么加mysqli_real_escape_string()防注入)。这不是鼓励写不安全代码,而是先建立“数据从键盘敲进去,最终存进数据库”的完整心智模型——就像学骑车先不装辅助轮,摔几次才记得重心在哪。
这套系统真正解决的是“学习断层”问题。很多教程讲完echo "Hello World"就跳到Laravel,中间缺了最关键的“如何把用户填的表单变成数据库里的一行记录”这一课。而这里的add_student_submit.php,就是这堂课的教案:它接收$_POST['name']、$_POST['class'],拼接SQL,执行mysqli_query(),再用header("Location: management.php?msg=success")跳转并传参提示。20多个PHP文件,每个都是一个独立的知识切片,你可以单独打开modpwd.php研究密码修改逻辑,不用先读懂整个框架的生命周期。
提示:别急着批评“没用预处理语句”。对新手而言,先理解
$sql = "UPDATE students SET password='$new_pwd' WHERE id=$uid"这行代码如何把变量塞进SQL,比背诵PDO参数绑定语法重要十倍。等他亲手改出三次SQL语法错误,自然会问:“有没有更安全的方法?”——那时,你再教mysqli_prepare(),他眼睛是亮的。
2. 系统架构与角色权限设计:两个入口,一套底层逻辑
很多人以为“学生查分”和“教师录分”是两套独立系统,其实它们共享同一套数据库和核心逻辑,区别仅在于会话校验规则和页面渲染分支。这种设计不是偷懒,而是刻意展示Web权限控制的本质:不是靠框架的@auth装饰器,而是靠$_SESSION['role']这个变量在每页开头做判断。
2.1 双入口的底层真相
系统有两个首页入口:index.html(学生登录页)和teacher.php(教师登录页),但它们最终都指向同一个认证脚本check_session_login.php。这个文件干了三件事:
1. 连接MySQL数据库($conn = mysqli_connect($host, $user, $pwd, $db))
2. 根据登录页传来的$_POST['role']参数,决定查哪张表:if($_POST['role']=='student') $table='students'; else $table='teachers';
3. 执行查询后,用$_SESSION['role'] = $_POST['role']; $_SESSION['id'] = $row['id'];存储身份信息
这意味着,你完全可以在index.html里把<input type="hidden" name="role" value="teacher">,然后用学生账号密码登录教师后台——当然,系统后续会在management.php里用if($_SESSION['role']!='teacher') die('无权访问');拦住。这种“明面上分离,底层统一”的设计,让新手一眼看懂权限控制的物理实现:它就是几个if判断和$_SESSION变量的组合。
2.2 数据库设计:一张表解决所有关系
整个系统只用4张表,却覆盖了学生档案、成绩、教师、密码重置需求:
-students表:id(主键),name,class,phone,password,created_at
-scores表:id,student_id(外键),subject,score,updated_at
-teachers表:id,username,password,real_name,created_at
-pwd_reset_tokens表:id,user_id,token,expires_at
重点说说scores表的设计巧思。它没有为每科设单独字段(如math_score,english_score),而是用“行”来存储科目。这样做的好处是:新增科目(比如加一门“人工智能导论”)无需ALTER TABLE,只要往scores表插新记录就行。学生查分时,stuinfo.php执行SELECT subject, score FROM scores WHERE student_id = ?,结果直接循环输出;教师录分时,insert_mark.php接收$_POST['subject']数组,循环插入多行。这种设计让新手第一次理解“范式化”的实际价值——不是为了考试,而是为了未来少改几行代码。
2.3 文件职责划分:每个PHP文件只做一件事
压缩包里20多个PHP文件,命名规则全是动词+名词(add_student_submit.php、update_mark_submit.php),这是刻意为之的“单一职责”训练。以update_mark.php为例,它只做一件事:根据URL参数?id=5查出ID为5的成绩记录,渲染一个带预填充值的HTML表单;而真正的更新操作,由update_mark_submit.php完成——它接收表单POST,执行UPDATE SQL,然后跳转回management.php。这种拆分强迫新手思考:“显示页面”和“处理数据”必须分离,否则容易写出把HTML和SQL混在一起的“意大利面代码”。
注意:
check_session_login.php是唯一被多个入口调用的“公共函数”,但它不渲染任何HTML,只负责认证和跳转。这种复用方式,比教新手写include 'config.php'更直观——你看得见它被谁调用、返回什么结果。
3. 核心功能实操详解:从建库到批量录分的完整链路
现在我们动手跑通整个流程。假设你有一台装了XAMPP的Windows电脑(Mac用户用MAMP,Linux用户用LAMP),以下是真实操作步骤,不是理论描述。
3.1 数据库一键导入:三分钟建好所有表
打开phpMyAdmin(通常是http://localhost/phpmyadmin),点击左上角“新建”,输入数据库名student_system,排序规则选utf8mb4_general_ci(支持中文和emoji)。接着点击“导入”,选择压缩包里的student_system.sql文件。这个SQL脚本包含三部分:
-- 1. 创建students表 CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `class` varchar(20) NOT NULL, `phone` varchar(15) DEFAULT NULL, `password` varchar(255) NOT NULL, `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 2. 插入测试数据(教师账号) INSERT INTO `teachers` (`username`, `password`, `real_name`) VALUES ('admin', '$2y$10$9Xz...hash...', '张老师'); -- 3. 添加外键约束(确保成绩表student_id存在) ALTER TABLE `scores` ADD CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `students`(`id`) ON DELETE CASCADE;执行后,你会看到4张表出现在左侧列表。特别注意teachers表里的密码是bcrypt加密的($2y$10$...开头),这是teachermodpwd.php里用password_hash()生成的。如果你忘了初始密码,可以直接执行UPDATE teachers SET password=password_hash('123456', PASSWORD_DEFAULT) WHERE username='admin';重置。
3.2 学生查分全流程:从登录到看到自己的数学92分
- 浏览器打开
http://localhost/student_system/index.html(注意:不是PHP文件,是纯静态HTML) - 输入学生账号
stu001,密码123456,点击登录 → 跳转到check_session_login.php - 该脚本验证通过后,执行
header("Location: stuinfo.php");,此时浏览器地址栏变成http://localhost/student_system/stuinfo.php stuinfo.php开始执行:先检查if(!isset($_SESSION['id']) || $_SESSION['role']!='student') die('请先登录');,再连接数据库,执行:php $sql = "SELECT s.name, s.class, sc.subject, sc.score FROM students s JOIN scores sc ON s.id = sc.student_id WHERE s.id = ".$_SESSION['id']; $result = mysqli_query($conn, $sql);- 循环
$result,用<tr><td><?php echo $row['subject']; ?></td><td><?php echo $row['score']; ?></td></tr>输出表格
你会发现,stuinfo.php里没有任何JavaScript,所有交互靠PHP完成。如果学生想改密码,点击页面上的“修改密码”链接,跳转到stu_update_info.php,这个页面会显示一个表单,提交后由stu_update_info_submit.php处理——整个过程像流水线,每个环节都清晰可见。
3.3 教师批量录分:三步搞定50个学生的期中成绩
这才是体现系统实用性的核心场景。传统做法是一个个点开学生编辑页,手动输分数;而这里用HTML表格实现批量操作:
- 教师登录后进入
management.php,点击“批量录分”按钮,跳转到insert_mark.php insert_mark.php生成一个动态表格:
```html
3. `insert_mark_submit.php`接收数据,循环插入:php
for($i=0; $i<count($_POST[‘student_id’]); $i++) {
$sid = $_POST[‘student_id’][$i];
// 分别插入三科成绩
mysqli_query($conn, “INSERT INTO scores (student_id, subject, score) VALUES ($sid, ‘数学’, {$_POST[‘math_score’][$i]})”);
mysqli_query($conn, “INSERT INTO scores (student_id, subject, score) VALUES ($sid, ‘英语’, {$_POST[‘english_score’][$i]})”);
mysqli_query($conn, “INSERT INTO scores (student_id, subject, score) VALUES ($sid, ‘物理’, {$_POST[‘physics_score’][$i]})”);
}
```
实测下来,录50个学生3科成绩,填表+提交不到2分钟。这个功能的价值在于:它用最基础的HTML表单和PHP循环,解决了教育场景中最频繁的操作痛点,而且代码一目了然——新手能立刻模仿着改成“语文、化学、生物”四科。
4. 安全加固与生产部署:从实验室到真实环境的必经之路
这套系统在教学环境中运行完美,但若要放到学校内网甚至公网,必须补上几块“安全垫”。这不是可选项,而是每个PHP开发者的职业本能。
4.1 密码存储:从明文到bcrypt的升级路径
原始代码里,add_student_submit.php用md5($_POST['password'])存密码,这在2024年是严重安全隐患。正确做法是替换为password_hash():
// 替换前(危险!) $password_hash = md5($_POST['password']); // 替换后(推荐) $password_hash = password_hash($_POST['password'], PASSWORD_DEFAULT);同时,登录验证也要改:
// 替换前 if($row['password'] == md5($_POST['pwd'])) { /* 登录成功 */ } // 替换后 if(password_verify($_POST['pwd'], $row['password'])) { /* 登录成功 */ }PASSWORD_DEFAULT目前是bcrypt,未来PHP升级会自动切换到更强算法,无需改代码。这个改动只需5分钟,却能让系统抵御彩虹表攻击。
4.2 SQL注入防护:三招构建防火墙
原始代码大量使用字符串拼接SQL,如"SELECT * FROM students WHERE id = ".$_GET['id']。修复方案分三级:
-初级(立即生效):用mysqli_real_escape_string()过滤所有用户输入php $safe_id = mysqli_real_escape_string($conn, $_GET['id']); $sql = "SELECT * FROM students WHERE id = $safe_id";
-中级(推荐):改用预处理语句(Prepared Statements)php $stmt = mysqli_prepare($conn, "SELECT * FROM students WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $_GET['id']); // "i"表示整数 mysqli_stmt_execute($stmt);
-高级(长期主义):在check_session_login.php开头添加全局过滤php function sanitize_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } $_POST = array_map('sanitize_input', $_POST); $_GET = array_map('sanitize_input', $_GET);
4.3 会话安全:防止Session Fixation和劫持
原始代码的session_start()没有配置安全参数。生产环境必须加上:
// 在所有PHP文件最开头(比session_start()还早) ini_set('session.cookie_httponly', 1); // 防止JS读取cookie ini_set('session.cookie_secure', 1); // 仅HTTPS传输(部署到https时启用) ini_set('session.use_strict_mode', 1); // 防止Session Fixation session_start(); // 登录成功后立即regenerate ID if($login_success) { session_regenerate_id(true); // 销毁旧session }4.4 部署 checklist:上线前必须核对的7件事
| 检查项 | 操作方法 | 为什么重要 |
|---|---|---|
| 1. 关闭错误报告 | 在php.ini中设display_errors = Off,或在PHP文件开头加error_reporting(0); | 防止数据库密码等敏感信息暴露在错误页面上 |
| 2. 限制目录浏览 | 在项目根目录放.htaccess文件,内容:Options -Indexes | 避免黑客直接看到/uploads/目录下的文件列表 |
| 3. 移除调试文件 | 删除压缩包里的.~介绍文档.docx、.gitignore、.inscode等临时文件 | 减少攻击面,避免泄露编辑器配置信息 |
| 4. 修改默认账号 | 执行SQL:UPDATE teachers SET username='your_admin', password=password_hash('your_strong_pwd', PASSWORD_DEFAULT) WHERE id=1; | 防止使用默认admin/123456被暴力破解 |
| 5. 设置文件权限 | Linux下执行:chmod 644 *.php *.html *.css和chmod 755 uploads/ | 防止PHP文件被意外写入恶意代码 |
| 6. 数据库连接隔离 | 将$host,$user,$pwd等信息移到config.php,并设chmod 600 config.php | 避免数据库凭据硬编码在每个PHP文件里 |
| 7. 启用HTTPS重定向 | .htaccess中添加:RewriteEngine OnRewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] | 强制加密传输,防止登录凭证被嗅探 |
实操心得:我在某中学部署时,曾因忘记第1项,导致
mysqli_connect()失败时直接打印出mysql_user:root, mysql_pwd:123456在页面上。后来每次上线前,都用这段代码快速检测:php <?php if(ini_get('display_errors')) { die('警告:display_errors未关闭,请修改php.ini'); } echo "安全检查通过"; ?>
5. 常见问题排查与二次开发指南:那些文档里不会写的坑
即使按文档一步步操作,新手仍会遇到一些“意料之外”的问题。这些不是Bug,而是PHP运行环境的特性。我把三年来收集的高频问题整理成速查表,并附上独家解决方案。
5.1 典型问题速查表
| 问题现象 | 可能原因 | 解决方案 | 经验备注 |
|---|---|---|---|
登录后空白页,URL停留在check_session_login.php | session_start()前有空格或BOM头 | 用Notepad++打开所有PHP文件 → 编码 → 转为UTF-8无BOM格式 | Windows记事本保存的PHP文件自带BOM,会导致headers already sent错误 |
stuinfo.php显示“未登录”,但明明刚输过账号密码 | session_start()未在每个PHP文件开头调用 | 检查stuinfo.php第一行是否为<?php session_start();,确认没有空行或空格 | PHP的session机制要求每个使用$_SESSION的文件都必须先session_start() |
| 批量录分时,只插入了第一个学生的成绩 | for循环中SQL语句缺少分号或引号不匹配 | 在insert_mark_submit.php中临时加echo $sql; die();,查看生成的SQL语句 | 新手常犯错误:VALUES ($sid, '数学', $_POST['math_score'][$i])漏了$符号 |
修改学生资料后,页面跳转到management.php?msg=success但没显示提示 | management.php里没有处理$_GET['msg']的代码 | 在management.php的HTML顶部添加:<?php if(isset($_GET['msg']) && $_GET['msg']=='success'): ?><div class="alert">操作成功!</div><?php endif; ?> | 原始代码的提示逻辑分散在各处,建议统一用CSS类.alert控制样式 |
| phpMyAdmin导入SQL时报错“#1046 - No database selected” | 没有先创建数据库或SQL文件里缺少USE student_system; | 在SQL文件最开头添加CREATE DATABASE IF NOT EXISTS student_system CHARACTER SET utf8mb4; USE student_system; | 大多数新手以为导入SQL会自动建库,其实需要手动创建或SQL里声明 |
5.2 二次开发实战:给系统加一个“成绩统计”功能
很多老师需要知道班级平均分、最高分。原始系统没这个功能,但扩展起来只要3个文件:
statistics.php(前端页面)
在management.php里加个链接<a href="statistics.php">成绩统计</a>,然后创建statistics.php:
```php
各科成绩统计
| 科目 | 平均分 | 最高分 | 最低分 | 及格率 |
|---|
| $sub | ".round($row['avg'],2)." | {$row['max']} | {$row['min']} | {$pass_rate}% |
```
export_csv.php(导出Excel)
在statistics.php里加个按钮,点击后执行:
```php
```
config.php(统一配置)
创建config.php,把数据库连接信息集中管理:
```php
`` 然后在所有PHP文件开头改为require_once ‘config.php’;`
这个扩展案例的价值在于:它展示了如何在不破坏原有结构的前提下,用最小成本增加新功能。所有新增代码都遵循原始系统的风格——没有框架、没有复杂依赖,就是纯粹的PHP+MySQL。
6. 教学价值再挖掘:如何用这套系统讲透PHP核心概念
作为一线讲师,我发现这套系统是绝佳的“概念锚点”。当学生抽象地学“面向对象”时,你让他看management.php里重复出现的mysqli_connect(),他立刻明白“为什么要封装成函数”;当他困惑“什么是MVC”时,你指着update_mark.php(View)、update_mark_submit.php(Controller)、scores表(Model),他豁然开朗。
6.1 用真实代码讲解PHP核心机制
- 超全局变量:让学生在
check_session_login.php里打断点,观察$_POST如何接收表单数据,$_SESSION如何跨页面传递用户ID; - 文件包含:把
mysqli_connect()提取到db_connect.php,演示require_once如何避免重复连接; - 表单处理:对比
stu_update_info.php(显示表单)和stu_update_info_submit.php(处理提交),讲解HTTP GET/POST区别; - 错误处理:故意把
mysqli_query()的SQL写错,在add_student_submit.php里加or die(mysqli_error($conn)),让学生亲眼看到错误信息。
6.2 课程设计进阶任务清单
给学生布置渐进式任务,从模仿到创新:
1.基础任务:修改style.css,把蓝色主题改成绿色(考察HTML/CSS基础)
2.逻辑任务:在scores表里加semester字段(如“2024春”),修改所有成绩相关PHP文件,支持按学期筛选(考察SQL和PHP逻辑)
3.安全任务:将所有md5()替换为password_hash(),并修改登录验证逻辑(考察安全意识)
4.扩展任务:增加“家长查看”角色,要求家长只能看自己孩子的成绩,且不能修改(考察权限控制深度)
5.综合任务:用原生JavaScript重写stuinfo.php的成绩排序功能(点击表头按分数升序/降序),不刷新页面(考察前后端协作)
最后分享一个小技巧:我在课堂上会让学生用手机扫描php学生管理系统.mov视频里的二维码,直接跳转到GitHub仓库(已脱敏处理)。仓库里不仅有源码,还有每个版本的commit记录——比如feat: add statistics page、fix: prevent sql injection in update_mark_submit.php。学生能看到真实的开发迭代过程,理解“写代码”不是一蹴而就,而是不断修复、优化、重构的旅程。这套系统真正的价值,不在于它多完美,而在于它足够真实,真实到能让新手第一次触摸到软件开发的温度。
本文还有配套的精品资源,点击获取
简介:纯原生PHP写的学生成绩管理程序,不依赖Laravel、ThinkPHP等任何框架,也不用Composer、路由或模板引擎,只靠基础PHP+MySQL+HTML+CSS+JS就能跑起来。系统分学生和教师两个入口:学生登录后能看自己各科成绩、改密码和基本信息;教师登录后可以增删改查学生档案、批量录成绩、单条修改分数、重置学生密码。所有PHP文件都是手写逻辑,比如add_student_submit.php处理新增学生,update_mark_submit.php更新分数,check_session_login.php做登录校验,代码带中文注释,结构一目了然。压缩包里有全部前端页面(index.html、style.css、swiper.min.css等)、后端PHP脚本(共20多个核心文件)、建库建表的SQL文件(直接phpMyAdmin导入就行)、Word版图文说明文档、项目结构图,还有一个实操演示视频(php学生管理系统.mov),从环境部署到功能操作全涵盖。适合PHP初学者练手、课程设计参考或快速搭建轻量教学管理后台。
本文还有配套的精品资源,点击获取
