做了一个小系统 ,其实也就是几个小功能,是关于学生,考试的。主要用户人群是老师,所以一切功能的目的都是为了方便老师操作。接下来讲一下表关系和表结构。做这个功能大致需要两个表,分别是学生表与分数表,并且这两个表是一对多的关系,为了让这两个表联系起来,需要在分数表里加一个s_id(关联字段)的字段,学生表最重要的字段有:学生姓名(存varchar类型,长度给10就可以),学生家长的邮箱;分数表大概需要三个字段,分数(point,存int),考试时间(存date类型,不用精确到时分秒),关联id(这里的关联id是学生表里的自增id),展示一下我自己的表机构,如下图:
学生表
分数表
由于考虑到主要用户是老师,而不是学生,所以学生分数录入功能必须要做一个同时添加多条学生考试信息的功能。大概是下图
这里表格里的学生id与姓名是从数据库里查出来并循环展示在表格里,还要注意一个点:id和姓名不可更改,可以加一个readonly 的样式 实现代码如下:
<?php
header("content-type:text/html;charset=utf8");
$con=mysqli_connect('127.0.0.1','root','root','student') or die(mysql_error('1233211234567'));
$sql="select s_id,s_name from student";
$res=mysqli_query($con,$sql);
while($arr=mysqli_fetch_assoc($res)){
$data[]=$arr;
}
$num=mysqli_num_rows($res);
?>
<form action="pointAdd_do.php" method="post">
<table>
<tr>
<td>学生id</td>
<td>姓名</td>
<td>分数</td>
<td>考试时间</td>
</tr>
<?php foreach($data as $k=>$v){?>
<tr>
<td><input type="text" name='s_id[]' value="<?php echo $v['s_id']?>" style='width: 70px;' readonly></td>
<td><input type="text" value="<?php echo $v['s_name']?>" style='width: 70px;' disabled></td>
<td><input type="text" name='point[]' style='width: 80px;'></td>
<td><input type="date" name="exam_time[]"></td>
</tr>
<?php }?>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
有一个重点,在你需要提交到下个页面添加的文本框中的name属性后必须加一个中括号,否则你接到的数据会被最后一行数据覆盖,这和数组有点像,其实也就是数组,将name属性值相同的值放到下标位name属相值同的一维数组中,接到的数据是这个样子:
接下来要进行数据处理,将这个二维数组处理成我们想要的数组格式,实现代码如下:
$data=$_POST;
$arr=[];
foreach ($data['s_id'] as $k => $v) {
foreach ($data['point'] as $key => $val) {
foreach ($data['exam_time'] as $key1 => $value) {
$arr[$k]['s_id']=$v;
$arr[$k]['point']=$val;
$arr[$k]['exam_time']=$value;
}
}
}
处理后的数据如下图:
:z
既然想要到的数据理好了,进行添加,代码如下图:
在这里我引了自己封装的Db类,钓了一个添加的方法,方法内部构造如下:
function add($table,$arr){
global $con;
$str1="";
$str2="";
foreach($arr as $k=>$v){
$str1.=$k.',';
$str2.="'$v'".',';
}
$k_str=rtrim($str1,',');
$v_str=rtrim($str2,',');
//echo $k_str.'<br>'.$v_str;
$sql="insert into $table($k_str) values($v_str)";
//echo $sql;exit;
$res=mysqli_query($con,$sql);
if($res){
return true;
}else{
return false;
}
}
这个函数是将一个一维数组循环,数组下标作为数据库字段,数组中的值作为数据库中的值,由于这个函数只能一次只能添加一条数据,所以要循环添加。
展示的时候做了一个查询的功能,根据姓名精确搜,和根据分数查询:html页面效果如下:
在这里要用到JavaScript中的一些技术,在点击搜索的时候,我们必须将文本框中的关键字或者分数获取到,并且传到php页面根据这两个条件查询数据库,查到数据后响应回来,js根据此数据进行替换页面,用这个技术可以减轻服务器压力,这个页面的数据库操作较少,所以体现不出来什么也可以实现页面局部刷新,具体代码如下:
<script type="text/javascript" src="jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function _username(){
var name = $("[name='s_name']").val();
var type = $("[name='type']").val();
var fraction = $("[name='fraction']").val();
$.ajax({
type:'post',
data:{name:name,type:type,fraction:fraction},
// dataType:'json',
url:"pointList_do.php",
success:function(json_info){
$('#data').html(json_info);
}
})
}
</script>
在这里用的其实是JQuery ,它是js的封装,比JavaScript简便了许多,使用的时候需要引入。
看看php页面是如何相应的:
<?php
header("content-type:text/html;charset=utf8");
// $con = mysqli_connect('127.0.0.1','root','root','student') or die('链接数据库出错');
// $con->set_charset("utf8");
include('./database/db.php');
connect();
$where = 1;
$name = $_POST['name'];
$fraction = $_POST['fraction'];
$type = $_POST['type'];
if(!empty($name)){
$where .= " and s_name like '%$name%'";
}
if(!empty($fraction) && !empty($type)){
$where .= " and point $type $fraction";
}
$sql = "select * from student join point on point.s_id = student.s_id where $where";
// echo $sql;exit;
$arr = mysqli_query($con,$sql);
// var_dump($arr);exit;
if($arr){
while ($array = mysqli_fetch_assoc($arr)) {
$data[] = $array;
}
}
?>
<table border="1">
<thead>
<tr>
<td>学号</td>
<td>学生姓名</td>
<td>分数</td>
<td>考试时间</td>
</tr>
</thead>
<tbody>
<?php
if (!empty($data)) {
foreach ($data as $k => $v) {
?>
<tr>
<td><?php echo $v['p_id']; ?></td>
<td><?php echo $v['s_name']; ?></td>
<td><?php echo $v['point']; ?></td>
<td><?php echo $v['exam_time']; ?></td>
</tr>
<?php } }else{ ?>
<?php } ?>
</tbody>
</table>
其实在js请求的php页面中,输出即响应。
emm,还有一个功能,是用户点击发送邮件,会将本学生最近一次考试的成绩发送到其家长的邮箱中。在这里拼sql语句很重要,必须是最近的考试信息,并且每个学生查一条。我们可以两表联查 条件是根据时间做倒叙,并且截取第一条,如下:
<?php
header("content-type:text/html;charset=utf8");
include_once("./database/db.php");
$con=mysqli_connect('127.0.0.1','root','root','student') or die(mysql_error(1231231));
$sql="select distinct s_id from point";
$res=mysqli_query($con,$sql);
while ($arr=mysqli_fetch_assoc($res)){
$data[]=$arr;
}
foreach ($data as $k => $v) {
$id=$v['s_id'];
$sql1="select * from `point` join `student` on `point`.s_id=`student`.s_id where `point`.s_id=$id order by exam_time desc limit 1";
$result=mysqli_query($con,$sql1);
while ($arr1=mysqli_fetch_assoc($result)){
$data1[]=$arr1;
}
}
?>
<table border="1">
<tr>
<td>姓名</td>
<td>性别</td>
<td>分数</td>
<td>入学时间</td>
<td>毕业时间</td>
<td>邮箱</td>
<td>考试时间</td>
<td>发送邮件</td>
</tr>·
<?php foreach($data1 as $k=>$v){?>
<tr>
<td><?php echo $v['s_name'];?></td>
<td><?php echo $v['s_sex'];?></td>
<td><?php echo $v['point'];?></td>
<td><?php echo $v['into_time'];?></td>
<td><?php echo $v['gradtime'];?></td>
<td><?php echo $v['email'];?></td>
<td><?php echo $v['exam_time'];?></td>
<td><a href="dome.php?email=<?php echo $v['email']?>&point=<?dome.php echo $v['point'];?>">发送邮件</a></td>
</tr>
<?php }?>
</table>
这里要用到一项邮箱发送的技术,大家如果要用可以去csdn 找找看 。套模板就可以了,点击发送,将分数及邮箱传到 模板中,改一下邮箱发送人,接收人,以及接受内容就可以了,不过这里需要一个授权码,大家可以在注册新浪邮箱的时候设置。
就这麽多。