基于PHP和MySQL实现的高校成绩管理系统
源码下载 http://www.byamd.xyz/hui-zong-1/
数据库规划
- 系统开发意义:高校成绩管理系统是为高校学生,老师,和工作人员提供高校成绩管理方案的一套完整系统。
1.3开发环境:
操作系统:Ubuntu 12.04 LTS
语言:PHP5.3.10
数据库: MySQL5.5.24
服务器: Apache 2.2.22
编辑器:VIM --Version7.3
版本控制工具 Git
这次的开发环境完全是在Linux的环境下进行编程,该系统采用B/S架构,未参考任何框架,采用文本编辑器vim,并且在多台电脑之间,使用了Git作为版本控制工具,模拟了多人协作开发。
需求分析
数据需求分析
数据字典
数据项卡片
数据项名 | 学号 |
---|---|
别名 | 学生编号 |
描述 | 唯一标示每个学生 |
定义 | 学号=12{字符}12 |
位置 | |
取值范围 | 000000000000-999999999999 |
取值含义 | 顺序编号 |
数据项名:学生姓名
数据项名 | 学生姓名 |
---|---|
别名 | 学生的名字 |
描述 | 每个学生都有自己的名字 |
定义 | 学生=20{字符} |
位置 | |
取值范围 | 0-20个字符 |
取值含义 | 每个学生的姓名字符个数 |
数据项名:性别:
数据项名 | 性别 |
---|---|
别名 | 男女区别 |
描述 | 每个学生的性别 |
定义 | 性别=男/女 |
位置 | 学生表 |
取值范围 | 男或者女 |
取值含义 | 一个学生不是男就是女 |
数据项名:年龄
数据项名 | 年龄 |
---|---|
别名 | 年龄 |
描述 | 人的岁数大小 |
定义 | 岁数,大于0的整数 |
位置 | 学生表,教师表 |
取值范围 | >0 |
取值含义 | 大于0的整数 |
数据项名:生源所在地
数据项名 | 生源所在地 |
---|---|
别名 | 学生高考所在的地方 |
描述 | 学生高考所在的地方 |
定义 | 学生高考所在的地方 |
位置 | 学生表 |
取值范围 | 全国各地的省份名 |
取值含义 | 能参加高考的省份 |
数据项名:地区
数据项名 | 地区 |
---|---|
别名 | 地区 |
描述 | 籍贯 |
定义 | 20个字符 |
位置 | 学生表 |
取值范围 | 全国各地的省份 |
取值含义 | 省份 |
数据项名:已修学分
数据项名 | 已修学分 |
---|---|
别名 | 已修学分 |
描述 | 学生得到的学分,得到成绩的才算学分 |
定义 | int |
位置 | 学生表 |
取值范围 | >0 |
取值含义 | 大于0的整数 |
数据项名:班级号
数据项名 | 班级号 |
---|---|
别名 | 班级编号 |
描述 | 班级编号 |
定义 | int |
位置 | 班级表,学生表 |
取值范围 | >0 |
取值含义 | 大于0的整数 |
数据项名:班级名称
数据项名 | 班级名称 |
---|---|
别名 | 班级名称 |
描述 | 班级名称,班级的称号 |
定义 | 20个字符 |
位置 | 班级表 |
取值范围 | 00000-99999 |
取值含义 | 班级名称 |
数据项名:专业号
数据项名 | 专业号 |
---|---|
别名 | 专业编号 |
描述 | 专业的编号,专业的唯一标示 |
定义 | int |
位置 | 专业表,班级表 |
取值范围 | 00000-99999 |
取值含义 | 按照学院要求编号 |
数据项名:专业名称
数据项名 | 专业名称 |
---|---|
别名 | 专业名称 |
描述 | 专业名称 |
定义 | 20{字符} |
位置 | 专业表 |
取值范围 | 数学,英语等 |
取值含义 | 学校里已有的专业 |
数据项名:教师编号
数据项名 | 教师编号 |
---|---|
别名 | 教师编号 |
描述 | 教师的唯一标示 |
定义 | Int unsigned |
位置 | 教师表 |
取值范围 | 00000-99999 |
取值含义 | 顺序编号 |
数据项名:教师姓名
数据项名 | 教师姓名 |
---|---|
别名 | 教师的名字 |
描述 | 教师姓名 |
定义 | 20{字符}20 |
位置 | 教师表 |
取值范围 | 所有的中文常用字符 |
取值含义 | 姓名 |
数据项名:职称
数据项名 | 职称 |
---|---|
别名 | 教师职称 |
描述 | 教师职称 |
定义 | 20字符 |
位置 | 教师表 |
取值范围 | 教授,副教授等 |
取值含义 | 国家规定的职称范围 |
数据项名:联系电话
数据项名 | 联系电话 |
---|---|
别名 | 联系电话 |
描述 | 联系电话 |
定义 | int |
位置 | 教师表 |
取值范围 | 00000000-99999999 |
取值含义 | 区号等 |
数据项名:课程编号
数据项名 | 课程编号 |
---|---|
别名 | 课程编号 |
描述 | 课程编号的唯一标示 |
定义 | int |
位置 | 课程表 |
取值范围 | 000000-999999 |
取值含义 | 课程 |
数据项名:课程名称
数据项名 | 课程名称 |
---|---|
别名 | 课程名称 |
描述 | 课程名称 |
定义 | 20{字符} |
位置 | 课程表 |
取值范围 | 高数,数据库等 |
取值含义 | 全校开的课程 |
数据项名:开课学期
数据项名 | 开学学期 |
---|---|
别名 | 学年 |
描述 | 该学校成立开始招生的年份 |
定义 | Int |
位置 | |
取值范围 | 1990–XXXX |
取值含义 | 该学校成立的招生 |
数据项名:学时
数据项名 | 学时 |
---|---|
别名 | 学时 |
描述 | 每门课程一个学期要上的课时 |
定义 | Int |
位置 | |
取值范围 | 000-100 |
取值含义 | 按照课程安排的学时 |
数据项名:考试性质
数据项名 | 考试性质 |
---|---|
别名 | 考试性质 |
描述 | 如何进行考查 |
定义 | 2个中文字符 |
位置 | 课程表 |
取值范围 | 考试/考查 |
取值含义 | 二选一 |
数据项名:学分
数据项名 | 学分 |
---|---|
别名 | 学分 |
描述 | 每门课合格后得到的学分 |
定义 | Int unsigned |
位置 | 课程表 |
取值范围 | 00-10 |
取值含义 | 数字 |
数据项名:成绩
数据项名 | 成绩 |
---|---|
别名 | 成绩分数 |
描述 | 上课程得到的成绩 |
定义 | int |
位置 | 成绩表 |
取值范围 | 000-100 |
取值含义 | 正整数 |
数据项名:UID
数据项名 | UID |
---|---|
别名 | 用户的唯一标示 |
描述 | |
定义 | 自动增长 |
位置 | |
取值范围 | 00000000-999999999 |
取值含义 | 自动增长,顺序编号 |
数据项名:用户名
数据项名 | 用户名 |
---|---|
别名 | 用户名称 |
描述 | 同用户的教师编号和学生编号 |
定义 | 20{字符}20 |
位置 | |
取值范围 | 已经在学生表或者数据表的 |
取值含义 |
数据项名:密码
数据项名 | 密码 |
---|---|
别名 | 密码 |
描述 | 密码,MD5 |
定义 | 32{字符}32 |
位置 | 权限表 |
取值范围 | MD5 |
取值含义 |
数据项名:权限
数据项名 | 权限 |
---|---|
别名 | 权限限制 |
描述 | |
定义 | Int(1) |
位置 | |
取值范围 | 1,2,3 |
取值含义 | 1学生 2老师 3管理员 |
数据项名:用户状态
数据项名 | 用户状态 |
---|---|
别名 | 用户状态 |
描述 | 用户的使用状态 |
定义 | Int(1) |
位置 | User表 |
取值范围 | 1或者0 |
取值含义 | 1 标示用户可用,0标示用户停用该账号 |
- 数据结构
数据结构名 | 学生 |
---|---|
别名 | 学生基本信息 |
描述 | 这是学生成绩管理系统的主要数据结构,定义了一个学生的基本信息。 |
组成 | 学号,姓名,性别,年龄,生源所在地,地区,专业,班级,已修学分 |
数据结构名 | 老师 |
---|---|
别名 | 教师基本信息 |
描述 | 这是学生成绩管理系统的主要数据结构,定义了一个教师的基本信息。 |
组成 | 教师编号,教师姓名,性别,年龄,职称,联系电话 |
数据结构名 | 学生成绩 |
---|---|
别名 | 学生成绩基本信息 |
描述 | 这是学生成绩管理系统的数据结构,定义了一个学生成绩的基本信息。 |
组成 | 学号,学期,课程名,成绩,任课教师 |
数据结构名 | 课程 |
---|---|
别名 | 课程基本信息 |
描述 | 这是学生成绩管理系统的主要数据结构,定义了一个课程的基本信息。 |
组成 | 课程编号,课程名,任课教师,开课学期,学时,考试形式(考试or考查),学分 |
数据结构名 | 课程教师 |
---|---|
别名 | 课程教师表 |
描述 | 这是学生成绩管理系统的主要数据结构,定义了一个课程和教师对应的关系。 |
组成 | 课程编号,教师编号 |
数据结构名 | 班级 |
---|---|
别名 | 班级基本信息 |
描述 | 这是学生成绩管理系统的主要数据结构,定义了一个班级的基本信息。 |
组成 | 班级编号,班级名称 |
- 数据流图
数据存储名 | 学生表 |
---|---|
别名 | 学生信息表 |
描述 | 描述学生的详细信息 |
定义 | 学生表=学号+姓名+性别+年龄+生源地+已修学分+地区+班级编号 |
流入数据流 | 学生的基本信息 |
流出数据流 | 学生的… |
数据存储名 | 教师表 |
---|---|
别名 | 教师信息表 |
描述 | 描述教师的详细信息 |
定义 | 教师表=教师编号+教师姓名+教师性别+教师年龄+职称+联系电话 |
流入数据流 | 教师的基本信息 |
流出数据流 | 教师… |
数据存储名 | 授课表 |
---|---|
别名 | 授课表 |
描述 | 描述教师和课程信息 |
定义 | 授课表=教师编号+课程信息 |
流入数据流 | 教师编号,课程信息 |
流出数据流 | 授课页面. |
数据存储名 | 班级课程表 |
---|---|
别名 | 班级课程表 |
描述 | 描述班级课程的信息 |
定义 | 班级课程表=班级编号+课程编号 |
流入数据流 | 班级编号,课程编号 |
流出数据流 | 班级课程页面… |
数据存储名 | 成绩表 |
---|---|
别名 | 成绩表 |
描述 | 描述成绩的信息 |
定义 | 成绩=学号+课程编号+教师编号+成绩 |
流入数据流 | 学生表,课程表,教师编号 |
流出数据流 | .成绩表 |
系统功能需求
系统功能框架介绍
系统需要实现以下业务处理和查询功能:
1、学生成绩按每学年成绩统计
2、学生成绩名次排定
3、每门课程平均成绩统计
4、学生所学课程及学分统计
5、对每个学生输入成绩的时候,自动生成学生的已修学分总数
6、学生成绩查询
7、教师任课查询
8、班级课程开设查询
其他
1、假设学籍管理制度是采用学年制,且暂不考虑选修课情况。
2、同一专业可能有多个班,所以同一门课可能需要多个教师上课,一个教师在
一学期可能上多门课程。3、考试和考查课均采用百分制记分。
其他性能需求
处理并发数和响应时间
关于并发数的处理,如果网页页面请求很大,前台用nginx作为反向代理给Apache或者php-apm老跑,然后MySQL搭配memcached可以较好的处理高并发数和响应时间。
存储需求分析
因为是大型实验,存储需求如果是全校性的,我可以多块硬盘组成用磁盘阵列RAID5或者RAID1.因为考虑到数据还是比较重要的,因为同时查询的时间段相对比较少,所以优先考虑上面两种,保证数据不丢失!
概念结构设计
根据需求分析阶段得到的用户需求,我们把用户需求抽象为概念模型,通过分析,经过(1)、确定E-R模式范围;(2)、定义实体型和属性;(3)、定义实体间的联系和联系的类型(1:1,1:n,m:n)(注意到课程是根据班级开设的,所以没有选修这一联系)这三步骤,再考虑实体集内部的联系,并消除冗余的联系。综合考虑后优化全局E-R模式,最终可以得到以下E-R模式图:
局部E-R图
可以参看后面的实体及其联系图
- 优化全局E-R图
逻辑结构设计
关系模式设计
- 学生实体及其属性图
教师实体及其属性图
- 课程实体及其属性图
学生成绩实体及其属性图
专业实体及其属性图
- 班级实体及其属性图
实体型的转换
根据上面的E-R图和实体及其属性图
学生(学号,姓名,性别,年龄,生源所在地,地区,已修学分总数)
教师(教师编号,姓名,性别,年龄,职称,联系电话)
课程(课程编号,课程名,开课学期,学时,考试形式,学分)
专业(专业编号,专业名称)
班级(班级编号,班级名称)
联系的转换
根据E-R模式到关系模式的转换规则:
(1)、对于1:1联系的转换是先将两个实体型分别转换为关系模式后,再将联系的属性和其中一个实体型对应关系模式的主键属性加入到另一个关系模式中即可;
(2)、对于1:n联系的转换是先将两个实体型分别转换为关系模式后,再将联系的属性和1端对应关系模式的主键属性加入到n端关系模式中即可;
(3)、对于m:n联系的转换是先将两个实体型分别转换为关系模式后,再将联系转换为一个关系型,其属性由联系的属性和前面两个关系模式的主键属性构成。
因此,将各联系转换,并根据命名的规则将实体和属性命名,最终得到的以下的关系模式如下:(其中有下划线的属性为主键):
班级与学生1:n联系的转换:
将班级的主键属性加入到学生的关系模式:
学生(学号,姓名,性别,年龄,生源地,地区,已修学分,班级编号)
班级(班级编号,班级名称)
专业和班级1:n联系的转换:
将专业的主键属性加入到班级的关系模式:
专业(专业号,专业名称)
班级(班级编号,班级名称,专业号)
班级和课程m:n联系的转换:
将联系转换为一个关系型班级课程,其属性由联系的属性和前面两个关系模式的主键属性构成:
班级(班级编号,班级名称)
课程(课程编号,课程名称,学年,开课学期,学时,考试形式,学分)
班级课程(班级编号,课程编号)
教师和课程m:n联系的转换:
教师(教师编号,教师姓名,教师性别,教师年龄,职称,联系电话)
课程(课程编号,课程名称,学年,开课学期,学时,考试形式,学分)
授课(课程编号,教师编号)
学生与课程m:n联系的转换:
事实上由于课程是根据班级开设的,所以学生与课程的联系是通过班级联系起来的,但为了查询的方便,这里仍旧增加这一联系,而且学号与课程编号确定了教师和这门课的成绩!
学生(学号,姓名,性别,年龄,生源地,已修学分,地区,班级编号)
课程(课程编号,课程名称,开课学期,学时,考试形式,学分)
报告(学号,课程编号,教师编号,成绩)
综上,可以得到以下关系模式
学生(学号,姓名,性别,年龄,生源地,已修学分,地区,班级编号)
教师(教师编号,教师姓名,教师性别,教师年龄,职称,联系电话)
授课(课程编号,教师编号)
专业(专业号,专业名称)
班级(班级编号,班级名称,专业号)
课程(课程编号,课程名称,开课学期,学时,考试形式,学分)
班级课程(班级编号,课程编号)
成绩(学号,课程编号,教师编号,成绩)
数据类型定义
数据类型大部分采用varchar,这种数据类型不浪费空间。
学号使用bigint,因为学号是12位的。
关系模式的优化
- 规范化处理
考察上述关系模式的数据依赖集合,可以知道上述9个关系模式都已经达到3NF或BCNF,已经实现了规范化处理。减少乃至消除了关系模式中存在的各种异常,保证了其完整性和一致性,提高了存储效率。
- 模式的修正与评价
(1)、模式的评价:
根据需求分析的结果,规范化后的关系模式集合通过各种关系运算支持用户的所有应用要求。对于要涉及多个关系模式的应用需求,可以检验得到它们都具有无损连接性。
(2)、模式修正:
为了减少存储空间,可以通过减少重复而占用过多的存储空间来实现,规范化要求的关系模式,仍然可能由于某些属性值的重复而占用过多的存储空间。在本实验中,关系模式⑤教师(教师编号,教师姓名,教师性别,教师年龄,职称,联系电话)中的职称属性值在大多数元组中都相同,可对这个属性值实行代码化,构造一个代码转换的关系模式,以减少存储空间的占用。即将关系模式修正为:
教师(教师编号,教师姓名,教师性别,教师年龄,职称编号,联系电话)
职称(职称编号,职称名称)
但是这样会增加连接运算,而连接运算一般开销较大,参与连接运算的关系越多开销越大。因此为了提高查询效率,实现性能的优化,只能牺牲一定的存储空间了。
所以综上,经过E-R模式到关系模式的转换和关系模式的优化,全局逻辑结构的设计工作已经结束,得到的最终的关系模式为下述8个关系模式。
学生(学号,姓名,性别,年龄,生源地,已修学分,地区,班级编号)
教师(教师编号,教师姓名,教师性别,教师年龄,职称,联系电话)
授课(课程编号,教师编号)
课程(课程编号,课程名称,开课学期,学时,考试性质,学分)
专业(专业号,专业名称)
班级(班级编号,班级名称,专业号)
班级课程(班级编号,课程编号)
成绩(学号,课程编号,教师编号,成绩)
物理结构设计
- 聚簇设计
一般可以在最经常查询的属性列上建立聚簇索引以提高查询效率,所以可以考虑在学生表的姓名和学号列上建立一个聚簇索引,也可以在教师表的教师姓名和教师编号列上建立一个聚簇索引,但由于维护聚簇的开销很大每次修改聚簇属性列值或增加、删除元组都将导致关系中的元组移动其物理存储位置,并且重建该关系的聚簇,因此在本实验中不建立聚簇索引。
- 索引设计(详细的见实施的部分)
索引设计是数据库物理设计的基本问题,对关系选择有效的索引对提高数据库访问效率有很大的帮助。
在本实验中,可以建立以下索引:学生按学号升序建唯一索引;教师按教师编号升序建唯一索引;课程按课程号升序建唯一索引;成绩按学号升序和课程编号降序建唯一索引;班级课程按班级编号和课程编号升序建唯一索引;授课按教师编号和课程编号升序建唯一索引。
分区设计
关于分区策略,我觉得如果学生表和成绩表数据量够大,可以采用分表,这样压力较小。
数据库实施
创建数据库,首先我先为该系统创建一个用户DBzyf,这是为了数据库安全策略进行的考虑,
Create database D01zhengyangfei;
Grant all on D01zhengyangfei.* to DBzyf@‘localhost’ identified by
‘123456’;Show tables(该命令可以看到视图和基本表)
基本表的建立
- 学生表
学号zyf | bigint | 主键 |
---|---|---|
姓名zyf | varchar(20) | |
性别zyf | varchar(2) | |
年龄zyf | int | |
生源所在地zyf | varchar(20) | |
地区zyf | varchar(20) | |
已修学分zyf | int | |
班级编号zyf | int | 外键 |
SQL语句如下所示:采用的数据库引擎是InnoDB,因为MySQL的只有InnoDB这个数据引擎支持外键。
向学生表插入数据,下图可看到表结构,学号是bigint的。
Select如下图所示:
- 教师信息表
教师编号 | int | 主键 |
---|---|---|
教师姓名 | varchar(20) | |
教师性别 | Varchar(2) | |
教师年龄 | int | |
职称 | Varchar(20) | |
联系电话 | int |
- 授课表
课程编号 | int | 主键 | |
---|---|---|---|
教师编号 | int | 主键 |
- 课程表
课程编号 | int | 主键 |
---|---|---|
课程名称 | varchar(2) | |
开课学期 | int | |
学时 | int | |
考试性质 | varchar(4) | |
学分 | int |
- 专业表
专业号 | int | 主键 |
---|---|---|
专业名称 | Varchar(2) |
向专业表插入数据
- 班级表
班级编号 | int | 主键 |
---|---|---|
班级名称 | varchar (2) | |
专业号 | int | 外键 |
如下图,建立外键后,插入不存在的专业号会报错,达到了外键的作用
- 班级课程表
班级编号 | int | 主键 |
---|---|---|
课程编号 | int | 主键 |
向班级课程插入数据
向课程教师表插入数据
- 成绩表
学号 | int | 主键 |
---|---|---|
课程编号 | int | 主键 |
教师编号 | int | 主键 |
成绩 | int |
视图的建立
- 视图教师课程的视图包含的字段有教师编号,教师姓名,课程编号,课程名称。
视图学生的成绩表的视图
建立了一张查询GPA的视图
索引的建立
建立以下索引:
学生zyf按学号zyf升序建唯一索引;
课程zyf按课程号zyf升序建唯一索引;(上面这两个在建外键的时候,其实由于MySQL的机制,已经建立了索引)
成绩zyf按学号zyf升序和课程编号zyf降序建唯一索引;
班级课程zyf按班级编号zyf和课程编号zyf升序建唯一索引;
授课zyf按教师编号zyf和课程编号zyf升序建唯一索引。
SQL 语句:
create unique index xuehao_zyf on 学生zyf(学号zyf);
create unique index class_zyf号on 课程zyf(课程号zyf);
create unique index sc_zyf on 成绩zyf(学号zyf ASC,课程编号zyf DESC);
create unique index cc_zyf on 班级课程zyf(班级编号zyf,课程编号zyf);
create unique index tc_zyf on 授课zyf(教师编号zyf,课程编号zyf);
触发器的建立
当向成绩表插入数据,并且该成绩是合格成绩,则自动为该学生的已修学分增加上该门课程的学分。
create trigger deletegrade after delete on 成绩zyf for each row update
学生zyf set 已修学分zyf=(select sum(学分zyf) from 课程zyf where
课程编号zyf in (select 课程编号zyf from 成绩zyf where 成绩zyf>=60 and
成绩zyf.学 号zyf=new.学号zyf)) where 学生zyf.学号zyf=new.学号zyf;
6.5.2 当向成绩表删除数据,则自动为该学生的已修学分减去上该门课程的学分。
create trigger deletegrade after delete on 成绩zyf for each row update
学生zyf set 已修学分zyf=(select sum(学分zyf) from 课程zyf where 课程编号zyf
in (select 课程编号zyf from 成绩zyf where 成绩zyf>=60 and 成绩zyf.学
号zyf=old.学号zyf)) where 学生zyf.学号zyf=old.学号zyf;
关于我们可以查我们已经建立的触发器,触发器在数据库中是是需要专门的配置导出的。通过show
triggers我们可以很清楚的知道该系统建立了哪些触发器。
建立存储过程
关于存储过程的话,我的MySQL版本是5.5,MySQL是在5.0的版本以后开始支持存储过程的,所以我可以使用这种技术。
应用系统的开发与试运行
开发平台与开发环境介绍。
操作系统:Ubuntu 12.04 LTS
语言:PHP5.3.10
数据库: MySQL5.5.24
服务器: Apache 2.2.22
编辑器:VIM --Version7.3
版本控制工具 Git
前台界面与后台数据库连接说明,代码实现。
为了减少代码复用,将数据库的统一配置文件作为公共的配置文件dbconfig.php,由于表的结构式charset=utf8和表结构内容读取涉及中文,所以添加两句“set
names utf8”,保证中文的正常显示!系统各功能设计和运行界面截图
- 系统功能图:
权限的设计,权限设计
为了能更好的实现数据库的管理,保持数据库的安全性,在系统开发中设置了用户登陆界面,只有被授权许可使用该应用系统和该数据库的用户才能凭借用户名和密码登陆系统,进入系统主界面。在用户的设置中,重新建立了一个数据库基本表——用户权限,用以登记用户信息。并且对用户进行分等级设置,每个等级在本系统中具有的权限不同,用以控制用户在系统中的使用权限。用户分为三个等级:管理员、教师、学生:
管理员:具有所有权限;
教师:具有大部分的权限,其中用户管理、学生信息管理、教师信息管理、课程信息管理功能受限;
学生:具有信息查询和数据统计功能,其中用户管理和所有信息管理功能都受限;
通过用户的等级的进行权限的限定,可以更好的实现数据库的管理和安全性保障,便于数据库的管理、使用和维护。
管理员 | 全部权限 |
---|---|
老师 | 部分权限, |
学生 | 部分权限。 |
设计了权限表user_zyf
User_ID | Int(10) | 主键 |
---|---|---|
User_name | Varchar(20) | |
User_password | Varchar(32) | 密码(MD5) |
User_level_zyf | int | |
User_status | int |
具体的表结构如图:
首页截图如下:登录可选学生,老师,管理员
虽然把管理员放在这里放不太安全,可以做到管理员登录隐藏的比较好…
管理员首页
更改学生信息
- 学生名次排定
课程平均成绩
所学课程及已修学分统计
学生成绩查询
教师任课查询
班级课程查询
查询个人信息
更改用户权限
更改密码
实验总结
遇到的问题和解决方法
- 数据库设计方面
逻辑结构设计的时候,联系转换的时候。
有一些概念不是很明白的时候,是通过翻书和询问同学解决的。
对于有一些字段的设置不是很了解。
不是很了解的时候,我是询问了部门里的学长,关于字段该如何设计。另外关于触发器与外键的设计,我看了下Dizcuz!的数据库里面有一些都是非InnoDB数据引擎的,由于对于数据引擎不是很了解,所以这次用的数据引擎都是InnoDB类型的。
关于数据库的备份策略,我完全按照论坛的备份策略,我开发的环境是基于Linux的平台的,所以我的备份策略是用脚本进行每天凌晨数据库的增量备份,一周做一次完全的备份,放到cron每天让其自动轮询。
8.1.2 开发中间遇到的问题及其解决方法和思路
0.VIM 的一个小技巧!
如果我们直接vim一个只读文件,最后发现无法保存,但是我们有sudo 的权限。
我们就可以在不退出的情况下执行
:w !sudo tee %
这个命令真的很有用,特别在修改啥配置文件,忘了sudo 的时候。
///MySQL创建新的用户并且授权
grant all on D01zhengyangfei.* to DBzyf@‘localhost’ identified by ‘123456’;
然后就可以MySQL -u DBzyf -p
///之后就是导出数据库了
1.导出一个数据库D01zhengyangfei
mysqldump -u 用户名 -p 要导出的数据库 > XXX.sql
mysqldump -u DBZyf -p D01zhengyangfei > D01zhengyangfei.sql
2.导入一个数据库
当然先use D01zhengyangfei;
然后source /home/suzie/D01zhengyangfei.sql 即可!已经存在则直接覆盖更新!
1.MySQL的字符编码问题
PHP中的mysql_query($sql)这里的SQL语句如果包含中文,就会导致SQL执行不成功!
这里是因为两个问题,php和MySQL两个问题!
1.首先是MySQL的问题,默认MySQL的字符编码是latin1 ,不支持中文!
所以我们在创建表的时候就必须加上charset=utf8 (这里没有-哦!)
当然我们直接修改My.ini,之后创建的数据库都是utf8的。
2.然后PHP中我们在读数据库和数据库的时候同样也得设定字符编码!
//字符转换,读库
mysql_query(“set character set ‘utf8’”);
//写库
mysql_query(“set names ‘utf8’”);
2.MySQL的外键问题
首先show create table
XXX,这个命令可以让我们了解到这个表结构到底到底是怎么样子的!比如我好几次在创建表时候带上外键创建了,而且创建外键时没有报错,但是show的时候没有显示,
这就表示没有创建成功!1.MySQL有很多的数据引擎,支持外键的只有InnoDB的数据库引擎!其他的引擎的外键定义可以在create上写上,但是相当一个备注,我们在show
create table XX时候可以清楚看到没有外键的定义!2.外键定义必须服从一下情况:
1.所有tables必须是InnoDB型,而且不能是临时表
2.引用表里的那一列必须要建索引,这是因为InnoDB需要对外键和被引用键的索引以便外键检查可以快速进行且不需要一个表扫描。对外键的索引会自动创建,但是一些老版本必须明确创建,否则外键约束会创建失败!
注意事项:
create or alter table时报告错误号为ERROR 1005并且错误字符串指向error
150,这意味着一个外键约束没有被正确形成解决方法:1.检查外键和被引用列的内部数据类型必须一致,反正类型一样就行!
2.index,索引的问题(一般来说, 索引是自动创建的!)
!PS.手册上还说:可以通过show innodb
status来显示服务器对innodb外键错误的详细解释,我没使用过这个命令。3.Git
1.git 上新建了一个repo “PHP” 一个人做开发
2.首先我遇到的问题就是多的远程仓库,可以通过取别名区别。
3.然后如果多线开发,先把远程仓库的代码pull,然后在commit,再进行push到远程仓库
4.git remote add php git@github.com:suziewong/php.git
5.git pull php master
6.git push php master
7.通过这样我就可以在多台机器上进行开发!
4.MySQL的触发器,语法与MSSQL有区别
MySQL的帮助手册,主要建议参考21.3/使用触发程序/,不过还是折腾出来了。
1.查看所有触发器的命令是: show triggers
2.MySQL中有一个infomation_schema.TRIGGERS的表,储存了所有库的触发器!
3.drop triggeer XXX;即可,同外键别名不能重名!
关键语法(具体参考手册)
1.new与old insert只能使用new delete只能使用old,update都行。
2.before和after
3.for each row
3.begin end(可以同时执行多条语句)
我的两个触发器是:
create trigger deletegrade after delete on 成绩zyf for each row update
学生zyf set 已修学分zyf=(select sum(学分zyf) from 课程zyf where 课程编号zyf
in (select 课程编号zyf from 成绩zyf where 成绩zyf>=60 and 成绩zyf.学
号zyf=new.学号zyf)) where 学生zyf.学号zyf=new.学号zyf;和
create trigger deletegrade after delete on 成绩zyf for each row update
学生zyf set 已修学分zyf=(select sum(学分zyf) from 课程zyf where 课程编号zyf
in (select 课程编号zyf from 成绩zyf where 成绩zyf>=60 and 成绩zyf.学
号zyf=old.学号zyf)) where 学生zyf.学号zyf=old.学号zyf;5.PHP 在Ubuntu12.04
的chromium下程序如果哪里出错,都不提示错误,后面的程序直接不显示!这个debug额。。。6.MySQL的视图机制
1.show create view XX 可以查看视图的定义!
2.drop view XXX
7.PHP中 mysql_query
我无法判断返回的字串来判断是否有值,只有看mysql_fatch_array返回的值是不是false或者true来判断了!8.虽然是面向过程编程,由于刚开始没有处理好权限的关系和SESSION的不熟练,导致出现管理员菜单adminmenu和普通菜单menu,代码复用度降低!后期想改,有点麻烦了,额……
9.关于函数的效率问题以及区别
1.require和include
2.mysql_query,也就是脚本里的 执行多条sql语句的效率问题!
10.在stu_cj.php采用搜索封装技术!
学号,姓名,学年三大和在一起!
11.MySQL的存储过程的学习!
查看存储过程:show procedure status;
查看存储过程或函数的代码:
show create procedure XX;
show create function XX;
删除存储过程
drop procedure XX;
mysql> delimiter //
mysql> CREATE DEFINER=`DBzyf`@`localhost` PROCEDURE `reset_zyf`(in
para int)-> begin
-> declare variable int;
-> if para=1 then
-> set variable=1;
-> else
-> set variable=0;
-> end if;
-> update user_zyf set user_status=variable;
-> end;//
12.MySQL
发现有不安全的一点,我在把密码字段改为varhcar(32)时,咨询了下DBA,他说Oracle是如果增加字段的长度比如20–》30
是可以的,但是30–》20,不行,它会要求你先自己处理那些字段的记录,免得误截断数据,但是MySQL我在modify的时候,有提示waring,但是命令执行成功了。我的原先数据全部被截断了!相当危险啊!系统设计的不足
代码复用度高,面向过程编程,整个系统我将其分为两部分业务和外观。
业务的话,我将其放到一个文件夹下(function目录下),其他的主配置文件放在外面。
对于存储过程的理解不够,觉得系统没有充分利用存储过程。
字段设计不够合理,没有充分利用空间。
数据库的安全策略考虑不周,漏洞颇多,对于备份策略和一些MySQL的命令的很多参数不是很了解,对于文档的理解能力不够。
对于css布局,不了解,所以基本没有啥美感可言,而且对于一些js能够控制的东西(比如说字段限制等)都可以由js实现,我都没有使用。
实现了老师要求的功能,但是在其他方面还很有不足,不懂,都没有仔细去思考解决。
实验总结:
这次实验是对我比较大的考验,我采用了大量我不熟悉的技术,但是为了锻炼自己,也借这个机会来上上手,我用git作为自己的版本控制,在两台电脑模拟两个人共同开发一个项目。没有使用集成开发环境,而只是使用文本编辑器Vim,整个项目由PHP编写,大概的代码+注释行数可以见附件的统计,1100行左右。然后就是MySQL的学习了,平常我对于MySQL的了解不是很深,平常在维护服务器的时候,也只会用普通的简单的趴数据,根本不会想到触发器或者存储过程。所以这次的数据库实验让我了解到了更多关于数据库方面的知识,我在数据库这边收获最大的就是关于数据引擎和字符编码,前者文档里描述的多,我也大概了解了关于不同数据引擎的区别,后者,MySQL默认的字符集是latin1字符集,没法再数据库里显示中文,需要修改字符集,关于字符集的修改和转换,是相当头大的问题,因为修改一张table的字符集一条命令就够了,但是修改整个数据库的字符集,却相当麻烦,虽然这次没有遇到这种问题,因为我在建表的时候直接设定了表的字符集,但是以后我迟早也会遇到这种问题的,所以,这样的收获还是蛮大的,具体的收获都在上面的“遇到问题及解决方法”了。如果以后有时间的话,我希望能够做的更好,数据库系统的设计对于编程来说还是很重要的。
附件编程截图:
基于PHP和MySQL实现的高校成绩管理系统相关推荐
- 基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,或者没有积分想获取项目,欢迎指教: 企鹅:869192208 文章目录 一.开发背景 二. 需求分析 三.开发环境 四.运行效果 ...
- 按照学号查找学生_[源码和文档分享]基于JAVA和MYSQL数据库的学生成绩管理系统...
一.需求分析 本系统是学生成绩管理系统,所以应该做到可以录入学生成绩,修改学生成绩,删除学生成绩,查询学生成绩,以及最后的所有学生按照GPA排名. 本系统的数据来源期末考试成绩,用来实现录入,查询,修 ...
- 基于PHP和mysql的简单学生成绩管理系统
本系统主要架构图如上图所示.PS:register_check.php的自动注册代码写在check.php里了. 使用数据库的两张表,user_info用户信息表和stu_info学生成绩信息表. 提 ...
- php与MYSQL制作学生成绩系统,基于PHP和mysql的简单学生成绩管理系统
本系统主要架构图如上图所示.PS:register_check.php的自动注册代码写在check.php里了. 使用数据库的两张表,user_info用户信息表和stu_info学生成绩信息表. 提 ...
- mysql 学生成绩等级_JSP+SSM+Mysql实现的学生成绩管理系统
项目简介 本系统是基于JSP+SSM+Mysql实现的学生成绩管理系统.主要实现的功能有教师管理.学生管理.课程管理.学生成绩管理. 难度等级:中等 技术栈 编辑器 Eclipse Version: ...
- mysql建立学生成绩_JSP+SSM+Mysql实现的学生成绩管理系统
项目简介 本系统是基于JSP+SSM+Mysql实现的学生成绩管理系统.主要实现的功能有教师管理.学生管理.课程管理.学生成绩管理. 难度等级:中等 技术栈 编辑器 Eclipse Version: ...
- 基于SSM+SpringBoot+MySQL+LayUI的高校学生评教系统
大家好,很高兴和大家分享源码.不管是什么样的需求.都希望各位计算机专业的同学们有一个提高. 大家可以通过常用的搜索引擎,以百度为例,搜索 源码乐园 code51 ,然后再次搜索 自己想要的即可.更多的 ...
- 基于java+swing+mysql+JFeeChart的企业人力资源管理系统(1)
文章目录 一,前言 二,项目运行图 (1)主界面(管理员界面) (2)员工资料运行图 (3)全部员工查看运行图 (4)部门管理运行图 (5)岗位管理运行图 (6)工资发放系统运行图 (7)薪酬记录运行 ...
- 基于springboot+mybatis+mysql+html实现宠物医院管理系统(包含实训报告)
基于springboot+mybatis+mysql+html实现宠物医院管理系统(包含实训报告) 一.系统简介 二.系统主要功能界面 2.1登陆 2.2系统设置 2.3宠物管理 2.4预约管理 2. ...
最新文章
- 服务器连接超时不响应怎么回事,勇者斗恶龙x服务器没有响应连接超时解决方法...
- 永远退出机器学习界!从业八年,Reddit网友放弃高薪转投数学:风气太浮夸
- 使用Kali官网提供的虚拟机系统
- CSS3定位和浮动详解
- error: gnu/stubs-32.h: No such file or directory
- 线程的start()方法
- 6-23 分离链接法的删除操作函数 (20 分)
- 警惕 | 警惕,mybatis的size()方法竟然有坑!
- lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...
- webpack 的使用1
- 两种方案的demo示例
- 2021-2025年中国云计算数据中心IT资产处置(ITAD)行业市场供需与战略研究报告
- 解决:WebDriverException: 'chromedriver' executable needs to be in PATH
- 初学Java必写的小程序。
- [论文评析] ArXiv,2021, Focal Self Attention技术分析
- 《深入浅出数据分析》读书心得与笔记
- 小执着的伤感空间日志:童话般虚幻、却没有童话般的结局
- 下一个冷链独角兽:C轮融资后,九曳供应链如何撬动生鲜市场?
- 简单实现 Android 闹钟
- 叉烧fan的arduino自学笔记(一) 人体红外报警器
热门文章
- 从零开始搭二维激光SLAM --- 激光雷达数据效果对比
- AEE-12A-02-D2-R-51 AEE-12A-02-D2-5-51数字放大器
- Words for Games
- android横竖屏切换总结
- 信息系统项目管理师考试大纲(组织整理)
- 关于CSDN导入Markdown文件时图片转存失败的问题
- Python关于None的报错:'NoneType' object is not iterable和cannot unpack non-iterable NoneType object
- Auto-GPT来啦,手把手教你安装更稳定的stable的Auto-GPT,实现两个AutoGPT合作执行任务,AutoGPT代理同时执行任务
- 看看“鲸鱼APP”模式是如何成功的
- 网页看板娘 js版(论坛娘、博客娘。总之就是梦娘 V (-1) 代码