做一个考试系统 添加完成绩后展示所有学生的所有成绩 并能查询学生最近的一次考试成绩并发送邮件给家长
考试系统的数据库设计
需要学生表 和 考试表 。
学生表的设计的设计要注意的有
1、学生的年龄
不能只存年龄,要存出生日期在和当前时间计算一下算出年龄
2、入学的 时间 的字段设置
时间用date()或time()都可以
3、性别字段的设置
里需要用到在数据库里只能存男或女 或 1或2 这里需要用到一个字段是enum,并在默认值那里写上‘男’,‘女’
4、所有字段都要注意存储的长度
5、学生分为在校生和毕业生,所以这里要给数据库一给状态来区别是在校生和离校生,以防止学生离校时还能出学生的成绩难
功能的难度
1、分数和时间的传值 和数据处理
列表展示用的是foreach循环遍历这里就不能单独的写name=“name”,这要写只能接到一个值,要写成数组的形式name=“name[]”,这样$_POST接值会变成一个三维数组。
//获取数据库的字段名 foreach($datas as $k =>$v ){ $arr[$k] = $k; }
$id= $arr['s_id'];
$grade= $arr['grade']; $examtime= $arr['examtime']; //循环遍历添加入数据库 $link=mysqli_connect('127.0.0.1','root','root','grade')or die(mysqli_error()); foreach($new_data as $k =>$v ){ if(!$v[$grade] == '' && !$v[$examtime] == ''){ $sql = "insert into `grade` (".$id.",".$grade.",".$examtime.",stutas) values ('".$v[$id]."','".$v[$grade]."','".$v[$examtime]."',1)"; $res=mysqli_query($link,$sql); } }
2展示列表
查询状态为1的所有数据 ,并添加查询数据的input框
查询条件默认为$where = 1;
姓名模糊查询
分数查询为大于 大于等于 小于 小于等于 等于
3 展示学生最近最近一 次考试并发送邮件提醒家长
查询数据哟查询在校学生的最近一次考试成绩
//处理学生的id 去重
$link=mysqli_connect('127.0.0.1','root','root','grade')or die(mysqli_error()); $sqls = "select distinct s_id from `grade` "; $result=mysqli_query($link,$sqls); while($arr=mysqli_fetch_assoc($result)) { $data[]=$arr; } //循环查询每个学生的最近一次成绩 foreach( $data as $k=>$v){ $ids=$v['s_id']; $sql = "select * from `grade` join `student` on `grade`.s_id=`student`.s_id where `grade`.s_id = $ids and `student`.stutas =1 order by examtime desc limit 1 "; $results=mysqli_query($link,$sql); while($arr=mysqli_fetch_assoc($results)) { $data1[]=$arr; } }
4、发送邮件
1、注册一个邮箱(开通授权:设置->设置POP3、SMTP/IMAP勾选),如果不勾选,授权失败
2、去这个网址下载phpmailer类库,http://github.com/PHPMailer/PHPMailer
3、
<?php header("content-type:text/html;charset=utf-8"); //接值 $s_id=$_GET['s_id']; $link=mysqli_connect('127.0.0.1','root','root','grade')or die(mysqli_error()); //查询一条学生信息 $sql = "select * from `grade` join `student` on `grade`.s_id=`student`.s_id where grade.s_id='$s_id'"; $result=mysqli_query($link,$sql); $arr=mysqli_fetch_assoc($result); $name = $arr['s_name']; //发送邮件的文本 $messgae='尊敬的'.$name.'的家长,您的孩子最近一次成绩是'.$arr['grade'].',希望您注重孩子的学习。'; //让[email protected]给[email protected]发送邮件 include("class.phpmailer.php"); include("class.smtp.php"); $mail = new PHPMailer(); $mail->IsSMTP(); // send via SMTP $mail->Host = "smtp.163.com"; // SMTP servers $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = "[email protected]"; // SMTP username 注意:普通邮件认证不需要加 @域名 $mail->Password = "wj1995320"; // SMTP password $mail->From = "[email protected]"; // 发件人邮箱 $mail->FromName = "静静"; // 发件人 $mail->CharSet = "utf-8"; // 这里指定字符集! $mail->Encoding = "base64"; $mail->AddAddress("[email protected]",$name); // 收件人邮箱和姓名 $mail->AddReplyTo("[email protected]",$name); //$mail->WordWrap = 50; // set word wrap 换行字数 //$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment 附件 //$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); $mail->IsHTML(true); // send as HTML // 邮件主题 $subject="测试"; $mail->Subject = $subject; // 邮件内容 $mail->Body = $messgae; $mail->AltBody ="text/html"; if(!$mail->Send()) { echo "邮件发送有误 <p>"; echo "邮件错误信息: " . $mail->ErrorInfo; exit; } { echo "邮件发送成功!<br />"; }
此博客最后展现的内容是可以通过页面来发送邮件告知成绩。
此博客现在就只是涉及了一个班级的所有成绩,不能体现出多班的成绩,这个博客还没有加必要的验证和年龄的处理,年龄还是出生日期。
在windows下运行 ,要注意的邮件的类库,发送邮件的模板。
在Linux下运行,如果过在Windows运行正常,在linux里报错首先要看的是防火墙是否关闭,centOS6.4 iptables、centOS7 firewall。还不成功报这个错
关闭SELINUX(linux 内核模块的防火墙)
vi /etc/selinux/config #SELINUX=enforcing #注释掉 SELINUX=disabled #增加 :wq! #保存退出 setenforce 0 #使配置立即生效
结束...