指法成绩表的索引没做好

新手涉及到的教学或入门贴,推荐新手必看,版主维护
回复
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

指法成绩表的索引没做好

#1

帖子 TeliuTe » 2014-03-27 19:08

开学初升级指法练习的增加了中英文,排行榜和各个年级的列表,今天下午连不上数据库,
提示非法字符,修复了一下表,pma里查看状态,提示索引没做好

指法练习有三个表:流水账表,每节课的成绩表,最高分成绩表,查询多的是最高分表
如果做索引,应该怎么做?

三个数据表
[php]
$sql = <<<EOF

CREATE TABLE IF NOT EXISTS `pre_app_rzlx` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`username` varchar(20) NOT NULL,
`score_now` int(8) NOT NULL,
`title_now` varchar(11) NOT NULL,
`time_now` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

EOF;

runquery($sql);


$sql = <<<EOF

CREATE TABLE IF NOT EXISTS `pre_app_rzlx_rk` (
`uid` int(11) NOT NULL,
`username` varchar(20) NOT NULL,
`score_max` int(8) NOT NULL,
`title_max` varchar(11) NOT NULL,
`time_max` int(11) NOT NULL,
`score_now` int(8) NOT NULL,
`title_now` varchar(11) NOT NULL,
`time_now` int(11) NOT NULL,
`score_count` int(11) NOT NULL,
`score_avg` int(8) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

EOF;

runquery($sql);


$sql = <<<EOF

CREATE TABLE IF NOT EXISTS `pre_app_rzlx_score` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`username` varchar(20) NOT NULL,
`score_max` int(8) NOT NULL,
`score_now` int(8) NOT NULL,
`title_now` varchar(11) NOT NULL,
`time_now` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

EOF;

[/php]


主程序
[php]
<?php
/*_
***********************************
Copyright (C) 2012-2014 TeliuTe, http://teliute.org
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
***********************************
2014-3-1增加对lx的检测,练习篇章只录入到执法流水帐中,不记入rk表和score表里
12-17 rk 数据表还要加一个最高分篇章的字段title_max,要不总排行榜里,查不出最高分和本节最高分的排行
7-23 改为直接用formhash()来检测来路,细节调整,添加一个篇章名称的变量
7-22 添加来路检测,用submitcheck无法通过,flash POST里面formhash传不过来
7-21 开始上传应用,xml里面东西不能太多,先用最少的,name那使用英文
7-20 调试程序,合并语句,删除不用的功能,调整数据库结构类型
7-19 数据库的insert和update,整理代码,添加归类注释,经常刷新看看是否出错,经常备份,和撤消
7-18 数据库的query,调整数据表的结构
7-17 将save.php合并入inc.php,修改swf文件的数据传送语句url部分
7-16 设计 inc.php
7-15 解开加密插件的php文件,可当范例学习
7-14 下载各种dzx3的插件范例,安装查看效果
7-13 安装DZX3环境,准备新版rzlx、旧版的文件夹
7-12 构思日志练习插件的升级
7-11 完成校园网dzx3的升级和界面的总体部分,安装好农场游戏
2013.7- 升级dz4.1.0,升级uchome2,转移附件,转移静态web部分,备份网站
_*/

session_start(); //保存一个时间戳用session变量,以数组的形式定义和调用,刷新页面后还可用

if(!defined('IN_DISCUZ')) {//避免被 URL 直接请求调用
exit('Access Denied');
}

if(!$_G['uid']){//验证是否登录
showmessage('not_loggedin', NULL, array(), array('login' => 1));
}

/*******************************************************
****************初始化变量---开始***********************
*******************************************************/

$navtitle = lang('plugin/rzlx','title');//设置浏览器页面标题

$uid = $_G['uid'];//当前用户的uid
$username = $_G['username'] ;//当前用户的用户名
$myhash=formhash();//将当前页面的hash传递给模板rzlx.htm,再通过flashVar传给geturl()里的url

$score_count = 0;//练习次数初始为0
$tmptime = TIMESTAMP-2400;//当前时间减去40分钟一节课的时间,到目前为止的40分钟内;//存一下时间差
$time_now = TIMESTAMP;//时间戳

$gtitle = $title_now=NULL;//篇章名称为空,这个跟s_now在一块用
$score_max = $score_now = $score_avg = NULL;//初始模板中不显示成绩
$gtime = $glesson = NULL;//提交来的时间戳和课程号,时间戳不存入数据库,存的是$tmptime=TIMESTAMP
$lx=0;//篇章名称是否是lx?

$myrk = 0;//当前用户排名
$allrk = 0;//参与排名的用户
//初始化变量---结束

//var_dump($_POST);//显示post来的变量,是一个数组

/*******************************************************
******* 验证提交来路,验证提交数据的准确性 ***********
*******************************************************/

if(isset($_POST['formhash'])){//检测是否有数据提交,安全和准确性
if(!($_POST['formhash'])==$myhash){//用formhash验证提交来路是否当前页面$myhash=formhash();
exit('Submitcheck Denied formhash');
}else{
if((strlen($_POST['gtime'])!=13) && is_numeric($_POST['gtime'])){//验证提交来的时间戳,这个不存入数据库,存的是TIMESTAMP
exit('Error for gTimestamp');
} //Flash的时间戳是13位,去掉末尾3位就是php的时间戳
$gtime = $_POST['gtime'];//防止刷新页面重复提交,用时间戳来判断

if(($_POST['gscore'] >100) || ($_POST['gscore'] <0)){//验证提交来的成绩
exit('Error for gScore');
} //得分是0-100分
$gscore = intval($_POST['gscore']);

if((strlen($_POST['gtitle'])!= 7)){//验证提交来的篇章名称
exit('Error for gTitle');
} //E0?.txt或lx?.txt为7个字符
$gtitle = substr(strval($_POST['gtitle']),0,2);//检测篇章名称是否为lx练习,取前两个字符

if ($gtitle == "lx"){
$lx=1;//篇章名称为练习,练习篇章不记入每节课成绩中
}
$gtitle = substr(strval($_POST['gtitle']),0,3);//日志练习的篇章名称,取前三个字符
//echo "post". $_POST['glesson']. "<br>";
//print $_POST['strAll_array'];
if(($_POST['glesson'] <100) && ($_POST['glesson'] >0)){//验证提交来的课程号
$glesson = intval($_POST['glesson']);
}else{
$glesson = 0;//这个不是严重错误,保护一下即可,这一课错了,下一课对了又可以改过来
//exit('Error for glesson');
} //课程数是1-99之间

//echo $glesson;
}
}//验证$_POST['formhash']---结束

if ($lx){//打的是练习篇章
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." WHERE `uid`='$uid'");//从 rk 表里取出最高分等
$value = DB::fetch($query);//获取查询的结果
$score_count = $value['score_count'];//总共练习次数
$score_count = $score_count + 1;//增加一次练习次数
$score_now = $gscore;//
$title_now = $gtitle;
DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_count`='$score_count' WHERE `uid`='$uid' ");//更新数据库练习次数,最高分不用改

//加一条到rzlx流水账表里头,将本次日志的用户名、成绩、篇章、得分、时间新增一条记录
DB::query("INSERT INTO ".DB::table('app_rzlx')." (`id`,`uid`,`username`,`score_now`,`title_now`,`time_now`) VALUES (NULL,'$uid','$username','$gscore','$gtitle','$time_now')");

$_SESSION['timest'] = $gtime;//防止刷新页面重复提交,用时间戳来判断

}else{//不是lx是测试篇章




/*******************************************************
*有数据且通过验证,进入处理,否则从数据库查询保存的历史记录**
*******************************************************/
if(empty($_GET['mod'])){//默认网址,没有其他参数,第一个Tab标签

//取出当前用户的记录,要显示的历史最高分、总的练习次数、本节课最高分、篇章
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." WHERE `uid`='$uid'");//从 rk 表里取出最高分等
$value = DB::fetch($query);//获取查询的结果

if (is_array($value )){//这个用户在数据库中有记录

$score_max = $value[score_max];//历史最高分取出来
$score_count = $value['score_count'];//总共练习次数

//这个学生有记录,检查40分钟内是否有得分
if ($value['time_now'] > $tmptime){//本节课40分钟内有最高分取出来
$score_now = $value[score_now];//本节课最高分取出来
$title_now = $value['title_now'];//本节课最高分的篇章
}else{//40分钟内没有记录,是插入新记录到本节课的表app_rzlx_score
if(($gtime!=$_SESSION['timest'])&&(!empty($gscore))){//有提交来的成绩,且是新的时间戳,不是重复提交

//这里还没赋值,用传来的Flash变量来插入记录
DB::query("INSERT INTO ".DB::table('app_rzlx_score')." (`uid`,`username`,`score_now`,`title_now`,`time_now`) VALUES ('$uid','$username','$gscore','$gtitle','$time_now')");

//算出平均分,再更新到rk表里
if ($glesson > 0){
$score_avg = DB::result_first("SELECT SUM(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
$score_avg = intval($score_avg/$glesson);//用总分除以第几课
}else{
$score_avg = DB::result_first("SELECT AVG(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
}

if ($score_avg > 100){
exit('不是本节课的篇章');
}else{
DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_avg`='$score_avg' WHERE `uid`='$uid'");//更新数据库平均分总评成绩
}

}
//写一条新记录到本节课的表里app_rzlx_score,跟rzlx表一样,大家都存在一起,用来查询自己一个人的,和全班所有人的平均成绩
}//$value['time_now']>$tmptime 40分钟内
}//这个用户在数据库中有记录

if(($gtime!=$_SESSION['timest'])&&(!empty($gscore))){
//有提交来的成绩,且是新的时间戳,不是重复提交

$score_count = $score_count+1;//练习次数加一篇
$title_now = $gtitle;//存一下篇章名称

if (!is_array($value)){//表中没这个学生,是新记录,直接插入,#还要插入到本节课的表
$score_max = $gscore;//更新最高分
$score_now = $gscore;//更新本节课最高分
$title_max = $gtitle;//更新最高分的篇章名

//在score本节课的表中插一条记录
DB::query("INSERT INTO ".DB::table('app_rzlx_score')." (`uid`,`username`,`score_now`,`title_now`,`time_now`) VALUES ('$uid','$username','$score_now','$title_now','$time_now')");

//算出平均分,再更新到rk表里
if ($glesson > 0){
$score_avg = DB::result_first("SELECT SUM(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
$score_avg = intval($score_avg/$glesson);//用总分除以第几课
}else{
$score_avg = DB::result_first("SELECT AVG(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
}//算出平均分

//DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_avg`='$score_avg' WHERE `uid`='$uid'");//更新数据库平均分总评成绩

if ($score_avg > 100){
exit('不是本节课的篇章');
}else{
DB::query("INSERT INTO ".DB::table('app_rzlx_rk')." (`uid`,`username`,`score_max`,`title_max`,`time_max`,`score_now`,`title_now`,`time_now`,`score_count`,`score_avg`) VALUES ('$uid','$username','$score_max','$title_max','$time_now','$score_now','$title_now','$time_now','$score_count','$score_avg')");
}


}elseif ($gscore >= $score_max){//本次得分超过数据库里的历史最高分,肯定也超过当前最高分,#也要更新本节课的表
$score_max = $gscore;//更新最高分
$score_now = $gscore;//更新本节课最高分
$title_max = $gtitle;//更新最高分的篇章名

DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_max`='$score_max',`title_max`='$title_max',`time_max`= '$time_now',`score_now`='$score_now',`title_now`='$title_now',`time_now`= '$time_now',`score_count`='$score_count' WHERE `uid`='$uid'");//更新数据库最高分,本次成绩、篇章、练习次数和当前时间

if ($value['time_now'] > $tmptime){//表里存在40分钟内的当前成绩,需要更新一下本节课的表已有的成绩app_rzlx_score
DB::query("UPDATE ".DB::table('app_rzlx_score')." SET `score_now`='$score_now',`title_now`='$title_now',`time_now`= '$time_now' WHERE `uid`='$uid' ORDER BY `id` DESC LIMIT 1");//更新数据库最高分,本次成绩、篇章、练习次数和当前时间

//算出平均分,再更新到rk表里
if ($glesson > 0){
$score_avg = DB::result_first("SELECT SUM(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
$score_avg = intval($score_avg/$glesson);//用总分除以第几课
}else{
$score_avg = DB::result_first("SELECT AVG(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
}

if ($score_avg > 100){
exit('不是本节课的篇章');
}else{
DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_avg`='$score_avg' WHERE `uid`='$uid'");//更新数据库平均分总评成绩
}
}

}elseif ($gscore >= $score_now){//只超过了当前最高分****这里似乎不用更新当前时间time_now,思考后影响不大,还可以连续的更新成绩
$score_now = $gscore;//更新本节课最高分,每个学生只有一条记录在rk最高分表里,#这里也要更新一下本节课的表
DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_now`='$score_now',`title_now`='$title_now',`time_now`= '$time_now',`score_count`='$score_count' WHERE `uid`='$uid'");//更新数据库本节课最高分,本次成绩、篇章、练习次数和当前时间

if ($value['time_now'] > $tmptime){//本节课的表里存在40分钟内的当前成绩,需要更新一下已有的成绩app_rzlx_score
DB::query("UPDATE ".DB::table('app_rzlx_score')." SET `score_now`='$score_now',`title_now`='$title_now',`time_now`= '$time_now' WHERE `uid`='$uid' ORDER BY `id` DESC LIMIT 1");//更新数据库最高分,本次成绩、篇章、练习次数和当前时间

//算出平均分,再更新到rk表里
if ($glesson > 0){
$score_avg = DB::result_first("SELECT SUM(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
$score_avg = intval($score_avg/$glesson);//用总分除以第几课
}else{
$score_avg = DB::result_first("SELECT AVG(`score_now`) FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$uid'");
}

if ($score_avg > 100){
exit('不是本节课的篇章');
}else{
DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_avg`='$score_avg' WHERE `uid`='$uid'");//更新数据库平均分总评成绩
}
}
}else{//啥都没超过, 只更新练习次数
DB::query("UPDATE ".DB::table('app_rzlx_rk')." SET `score_count`='$score_count' WHERE `uid`='$uid' ");//更新数据库练习次数,最高分不用改

}//($gscore >= $score_max)


//加一条到rzlx流水账表里头,将本次日志的用户名、成绩、篇章、得分、时间新增一条记录
DB::query("INSERT INTO ".DB::table('app_rzlx')." (`id`,`uid`,`username`,`score_now`,`title_now`,`time_now`) VALUES (NULL,'$uid','$username','$gscore','$title_now','$time_now')");

$_SESSION['timest'] = $gtime;//防止刷新页面重复提交,用时间戳来判断

}//if(!empty($gscore),从Flash接收来的数据处理---结束

/**************************************
********* 我的日志流水账 *******
*************************************/
}elseif($_GET['mod'] == 'my_rzlx'){//提交的网址中有参数,第二个标签我的成绩单
//总共的记录数,下面计算页数函数用$multi()
$num = DB::result_first("SELECT COUNT(*) FROM ".DB::table('app_rzlx')." WHERE uid='$_G[uid]'");
$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 10;//一页显示10条记录
$multipage = multi($num, 10, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx')." WHERE `uid`='$_G[uid]' ORDER BY `id` DESC LIMIT $start_limit, 10");

while($value = DB::fetch($query)){//取出查询记录
//把日期换算一下先

$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);

$my_score[] = $value;//将记录存到数组中
}


/**************************************
********* 本节课排行榜 *******
*************************************/
}elseif($_GET['mod'] == 'lesson_rk'){//提交的网址中有参数,第四个标签总的排行榜

//where 要在group by的前面,顺序也在前
//实在不行就得两张表算了,一张存各个学生的日志练习,另一张表存uid、最高分、时间、本节课成绩、时间、次数
$query = DB::query("SELECT `username`, `score_now`, `title_now`,`time_now` FROM ".DB::table('app_rzlx_rk')." WHERE `time_now`>" .$tmptime. " ORDER by `score_now` DESC, `time_now` DESC");

$i=1;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
while ($value = DB::fetch($query)) {
$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);
$my_score[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;
}//while ,我的成绩单的赋值算法跟这个不一样,到时候看看哪个要好点


/**************************************
********* 总的最高分排行榜 *******
*************************************/
}elseif($_GET['mod'] == 'all_rk'){//提交的网址中有参数,第四个标签总的排行榜
//总共的记录数,下面计算页数函数用$multi()
//****后面把数据表名改一下
$num = DB::result_first("SELECT count(distinct uid) FROM ".DB::table('app_rzlx_rk'));//distinct uid 的uid不加单引号吗,费了我那么多时间
$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 20;//一页显示20条记录,查询数据库的时候,用这个做起点
$multipage = multi($num, 20, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." GROUP BY `uid` ORDER by `score_max` DESC, `time_max` DESC LIMIT $start_limit, 20");

$i=1+$start_limit;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
//查询第2页时,乘以10
while ($value = DB::fetch($query)) {
$value ['time_max'] = dgmdate($value['time_max'], 'dt', $_G['setting']['timeoffset']);
$my_score[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;
}//while ,我的成绩单的赋值算法跟这个不一样,到时候看看哪个要好点




/**************************************
********* 我的每节课成绩单 *******
*************************************/
}elseif($_GET['mod'] == 'my_score'){//提交的网址中有参数,第六个标签我的每节课成绩汇总
//总共的记录数,下面计算页数函数用$multi()
$num = DB::result_first("SELECT COUNT(*) FROM ".DB::table('app_rzlx_score')." WHERE uid='$_G[uid]'");
$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 10;//一页显示10条记录
$multipage = multi($num, 10, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_score')." WHERE `uid`='$_G[uid]' ORDER BY `id` DESC LIMIT $start_limit, 10");

while($value = DB::fetch($query)){//取出查询记录
//把日期换算一下先
$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);

$my_score[] = $value;//将记录存到数组中
}


/**************************************
********* 七年级的平均成绩排行榜*******
*************************************/
//我的日志,本节排名,总的排名,我的成绩,总的成绩$num = DB::result_first("SELECT COUNT(*) FROM ".DB::table('app_rzlx_score')." WHERE uid='$_G[uid]'");
}elseif($_GET['mod'] == 'a7_score'){//提交的网址中有参数,第七个标签七年级的期末日志成绩排行榜
$tmptime = TIMESTAMP-2592000;//当前时间减去30天的秒数时间,30天内的成绩;//存一下时间差//." AND (`title_now` LIKE '7__')"//" WHERE `time_now`>" .$tmptime

// $num = DB::result_first("SELECT count(distinct uid) FROM ".DB::table('app_rzlx_rk')." WHERE `title_now` LIKE '7__' AND `time_now`>" .$tmptime);//distinct uid 的uid不加单引号吗,费了我那么多时间
$num = DB::result_first("SELECT count(distinct uid) FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime ." AND `title_now` LIKE '7__'");//distinct uid 的uid不加单引号吗,费了我那么多时间

$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 20;//一页显示20条记录,查询数据库的时候,用这个做起点
$multipage = multi($num, 20, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录,rk表是唯一的,所以直接查询就可以了,不用group by来过滤
//$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." WHERE `title_now` LIKE '7__' AND `time_now`>" .$tmptime." ORDER by `score_avg` DESC, `time_now` DESC LIMIT $start_limit, 20");//这里用time_now来排序相同成绩
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime." AND `title_now` LIKE '7__' ORDER by `score_avg` DESC, `time_now` DESC LIMIT $start_limit, 20");//这里用time_now来排序相同成绩

$i=1+$start_limit;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
//查询第2页时,乘以10
while ($value = DB::fetch($query)) {
$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);
$my_score[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;
}//while ,我的成绩单的赋值算法跟这个不一样,到时候看看哪个要好点


/**************************************
********* 八年级的平均成绩排行榜*******
*************************************/
//我的日志,本节排名,总的排名,我的成绩,总的成绩$num = DB::result_first("SELECT COUNT(*) FROM ".DB::table('app_rzlx_score')." WHERE uid='$_G[uid]'");
}elseif($_GET['mod'] == 'a8_score'){//提交的网址中有参数,第七个标签七年级的期末日志成绩排行榜
$tmptime = TIMESTAMP-2592000;//当前时间减去30天的秒数时间,30天内的成绩;//存一下时间差//." AND (`title_now` LIKE '7__')"//" WHERE `time_now`>" .$tmptime

$num = DB::result_first("SELECT count(distinct uid) FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime ." AND `title_now` LIKE '8__'");//distinct uid 的uid不加单引号吗,费了我那么多时间
echo $num;
$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 20;//一页显示20条记录,查询数据库的时候,用这个做起点
$multipage = multi($num, 20, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录,rk表是唯一的,所以直接查询就可以了,不用group by来过滤
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime." AND `title_now` LIKE '8__' ORDER by `score_avg` DESC, `time_now` DESC LIMIT $start_limit, 20");//这里用time_now来排序相同成绩

$i=1+$start_limit;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
//查询第2页时,乘以10
while ($value = DB::fetch($query)) {
$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);
$my_score[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;
}//while ,我的成绩单的赋值算法跟这个不一样,到时候看看哪个要好点


/**************************************
********* 九年级的平均成绩排行榜*******
*************************************/
//我的日志,本节排名,总的排名,我的成绩,总的成绩$num = DB::result_first("SELECT COUNT(*) FROM ".DB::table('app_rzlx_score')." WHERE uid='$_G[uid]'");
}elseif($_GET['mod'] == 'a9_score'){//提交的网址中有参数,第七个标签七年级的期末日志成绩排行榜
$tmptime = TIMESTAMP-2592000;//当前时间减去30天的秒数时间,30天内的成绩;//存一下时间差//." AND (`title_now` LIKE '7__')"//" WHERE `time_now`>" .$tmptime

$num = DB::result_first("SELECT count(distinct uid) FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime ." AND `title_now` LIKE '9__'");//distinct uid 的uid不加单引号吗,费了我那么多时间
echo $num;
$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 20;//一页显示20条记录,查询数据库的时候,用这个做起点
$multipage = multi($num, 20, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录,rk表是唯一的,所以直接查询就可以了,不用group by来过滤
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime." AND `title_now` LIKE '9__' ORDER by `score_avg` DESC, `time_now` DESC LIMIT $start_limit, 20");//这里用time_now来排序相同成绩

$i=1+$start_limit;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
//查询第2页时,乘以10
while ($value = DB::fetch($query)) {
$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);
$my_score[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;
}//while ,我的成绩单的赋值算法跟这个不一样,到时候看看哪个要好点



/**************************************
********* 总的平均成绩排行榜*******
*************************************/
//我的日志,本节排名,总的排名,我的成绩,总的成绩
}elseif($_GET['mod'] == 'all_score'){//提交的网址中有参数,第七个标签全年级的期末日志成绩排行榜
$num = DB::result_first("SELECT count(distinct uid) FROM ".DB::table('app_rzlx_rk'));//distinct uid 的uid不加单引号吗,费了我那么多时间
$page = $_G['page'] < 1 ? 1 : $_G['page'];//防止页数为0
$start_limit = ($page - 1) * 20;//一页显示20条记录,查询数据库的时候,用这个做起点
$multipage = multi($num, 20, $page, "plugin.php?id=rzlx&mod={$_GET[mod]}");//分页函数

//点击页码查询这一页的10条记录
$query = DB::query("SELECT * FROM ".DB::table('app_rzlx_rk')." ORDER by `score_avg` DESC, `time_now` DESC LIMIT $start_limit, 20");//这里用time_now来排序相同成绩

$i=1+$start_limit;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
//查询第2页时,乘以10
while ($value = DB::fetch($query)) {
$value ['time_now'] = dgmdate($value['time_now'], 'dt', $_G['setting']['timeoffset']);
$my_score[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;
}//while ,我的成绩单的赋值算法跟这个不一样,到时候看看哪个要好点




}else{//mod 都不符合的情况
showmessage('undefined_action', NULL, 'HALTED');
}
}//if($lx)
/**************************************
************显示右侧栏我的信息************
**************************************/

$tmptime = TIMESTAMP-2400;//恢复原来的值
$query = DB::query("select * from ".DB::table('app_rzlx_rk')." ORDER BY `score_max` DESC,`time_max` DESC");//ORDER 前面要加个空格,要不没有分隔开
//按最高分降序,再按时间降序
//$value = DB::fetch($query);
//print_r($value);
//从数据库中取出用于显示的各个字段,最高分,总评成绩,本次成绩,本次篇章,练习次数
while ($value = DB::fetch($query)) {//循环赋值给$value,每次一个用户记录
$myrk++;//不需要找出全部用户,只要有自己的就行了,上面的 DB::query查询也可以这样

if($uid==$value['uid']) {//取出当前用户的最高成绩,存放在 $score_max 里
$score_max = $value['score_max'];//最高分
$score_avg = $value['score_avg'];//总评成绩

if ($value['time_now'] > $tmptime){//本节课(40分钟内)的最高分、篇章、次数取出来
$score_now = $value['score_now'];
$title_now = $value['title_now'];
$score_count = $value['score_count'];
}
//print_r($value);
break;//不用查询全部用户,找到自己的就退出循环
//用户第一次进入也会查询全部用户
}
}//while



/**************************************
********* 显示右侧栏本节课排行榜 ******
*************************************/

//取出40分钟内,所有用户当前最高分2014-3-18 加上判断学号
$query = DB::query("SELECT `uid`, `username`, `score_now`, `title_now` FROM ".DB::table('app_rzlx_rk')." WHERE `No` AND `time_now`>" .$tmptime. " ORDER by `score_now` DESC, `time_now` DESC");

$i=1;//显示的时候,排名是从1开始,htm里有个$key 显示这个数组的序号
while ($value = DB::fetch($query)) {

$lessontopArr[$i] = $value;//转存到一个二维数组变量lessontopArr
$i++;

}//while


include template('rzlx:rzlx');//加载模板文件夹template/rzlx.htm

?>

[/php]
附件
索引没做好.png
索引没做好.png (6.01 KiB) 查看 2213 次
增加了排行榜和各个年级的成绩.png
回复