大作业:软件资源下载系统
软件资源下载系统是非常常见的网站应用程序,它可以帮助管理者整理软件资源、统计下载数量,可以帮助访问者快速方便地找到需要的软件。下面介绍一个软件资源下载系统的设计和实现过程。本实例采用PHP作为开发工具,MySQL作为后台数据库。
项目1 系统及数据库结构设计
要开发一个Web系统,首先需要进行需求分析和总体设计,分析系统的使用对象和用户需求,设计系统的体系结构和数据库结构,规划项目开发进度。在实际的项目开发过程中,这些工作是非常重要的。
1.系统总体设计
软件资源下载系统分为前台管理和后台管理。前台管理包括浏览软件信息、软件搜索、下载排行等功能。后台管理包括软件类别管理、软件资源管理、软件上传管理等模块。
本系统的功能模块如图A2所示。
图A2 软件资源下载系统功能模块示意图
2.数据库结构设计与实现
在设计数据库表结构之前,首先要创建一个数据库。本系统使用的数据库为 Down,创建数据库和表的脚本保存为下载源代码“大作业\Down.sql”,读者可以在phpMyAdmin中执行此脚本。
本系统定义的数据库中包含以下5个表:下载软件表DownLoad、类别表Category、上传记录表UpFile、评论表Votes和用户信息表Users。
下面分别介绍这些表的结构。
(1)下载软件表DownLoad
下载软件表DownLoad用来保存下载软件的基本信息,其结构如表A1所示。
表A1 表DownLoad的结构
(2)软件类别表Category
软件类别表Category用来保存软件的类别基本信息,其结构如表A2所示。
表A2 表Category的结构
(3)上传记录表UpFile
上传记录表UpFile用来保存上传软件记录,其结构如表A3所示。
表A3 表UpFile的结构
(4)评论表Votes
评论表Votes用来保存软件的评论信息,其结构如表A4所示。
表A4 表Votes的结构
(5)用户信息表Users
用户信息表Users用来保存用户的基本信息,其结构如表A5所示。
表A5 表Users的结构
在下载源代码“大作业\Down.sql”中,创建表Users后,将默认的用户Admin插入到表中,默认的密码为“111111”。
项目2 目录结构与通用模块
下面介绍实例的目录结构与通用模块。本实例的源代码存放在下载源代码的“大作业\down”目录下。
1.目录结构
在运行实例时,需要将 down 目录复制到 Apache 的根目录下。down 目录下包含下面的子目录。
• admin:用于存储系统管理员的后台操作脚本。
• class:保存数据库访问类。
• images:用于存储网页中的图片文件。
• soft:用于存储网站的软件资源。
其他PHP文件都保存在本实例的根目录下。
2.设计数据库访问类
为了使PHP程序条理更加清晰,本实例将对数据库表的访问操作封闭为一个类,每个类对应一个PHP文件,文件名与对应的数据库表名相同。所有数据库操作类都保存在class目录下,请参照源代码和注释理解。下面介绍这些类中定义的成员函数。
(1)DownLoad类
DownLoad类用来管理表DownLoad的数据库操作,类的成员函数如表A6所示。
表A6 DownLoad类的成员函数
(2)Category类
Category类用来管理表Category的数据库操作,类的成员函数如表A7所示。
表A7 Category类的成员函数
(3)UpFile类
UpFile类用来管理表UpFile的数据库操作,类的成员函数如表A8所示。
表A8 UpFile类的成员函数
(4)Software类
Software类用来管理表Software的数据库操作,类的成员函数如表A9所示。
表A9 oftware类的成员函数
(5)Votes类
Votes类用来管理表Votes的数据库操作,类的成员函数如表A10所示。
表A10 Votes类的成员函数
(6)Users类
Users类用来管理表Users的数据库操作,类的成员函数如表A11示。
表A11 Users类的成员函数
项目3 设计管理员主界面
本实例可以分为管理员用户管理界面和访客界面2个部分。本项目将介绍管理主界面的实现过程。
所有Admin用户管理部分的文件都保存在下载源代码的“大作业\Down\admin”目录下。
1.管理员登录页面
管理员用户需要首先登录到本系统,然后才能使用系统提供的管理功能。管理员登录页面的地址为:
http://localhost/down/admin/login.php
登录页面如图A3所示。
图A3 管理员登录页面
在登录页面中,使用表单接收用户输入的用户名和密码数据,表单的定义代码如下:
<form name="myform" action="putSession.php" method="Post">
表单提交时,根据action属性将执行putSession.php,主要代码如下:
<?PHP
session_start();
//获取输入的用户名和密码
$UID= $_POST["loginname"];
$PSWD= $_POST["password"];
//把用户名和密码放入Session
$_SESSION["UserName"] = $UID;
$_SESSION["UserPwd"] = $PSWD;
header("Location: index.php");
?>
程序将接收到的用户名 loginname 和密码 password 数据赋值到 Session 变量 UserName 和UserPwd中,然后将页面转向index.php。因为index.php中包含IsUser.php,可以进行身份验证。不能通过身份验证的用户将直接转向普通用户使用的系统主界面。
IsUser.php的功能是判断当前用户是否已登录(即保存在表Users中的用户),如果不是,则显示登录界面,要求用户登录;如果是,则不执行任何操作,直接进入包含它的网页。
IsUser.php的代码如下:
<?PHP
//获取SESSION变量
session_start();
$UName = $_SESSION["UserName"];
$UPwd = $_SESSION["UserPwd"];
include('..\Class\Users.php');
$objUser = new Users();
//用户名是否为空
if($UName <> "") {
$objUser->UserName = $UName;
$objUser->UserPwd = $UPwd;
if(!$objUser->HaveUser()) {
header("Location: login.php");
}
}
else
header("Location: login.php");
?>
程序从 Session 变量中读取注册用户信息,并连接到数据库身份验证。如果是注册用户,则程序不执行任何操作(即通过验证,跳过此文件执行其他文件);否则转向到登录页。
在需要用户登录后才能访问的文件中引用此文件作为头文件,代码如下:
include('isUser.php');
在本系统中,IsUser.php保存在admin目录下。
2.设计管理员主界面
本实例的管理主界面为admin\index.php,它的功能是显示系统的管理链接。index.php的界面如图A4所示。
图A4 index.php的运行界面
在index.php中,使用框架包含了文件left.php和NewsList.php,分别用来处理左侧和右侧的显示内容。框架定义代码如下:
<frameset framespacing="1" border="1" bordercolor= #333399 frameborder="yes">
<frameset cols="150,*">
<frame name="contents" target="main" src="left.php" scrolling="auto"frameborder=0>
<frame name="right" src="CategoryList.php" scrolling="auto" noresize frameborder=0>
</frameset>
<noframes>
<body>
<p>此网页使用了框架,但您的浏览器不支持框架。</p>
</body>
</noframes>
</frameset>
3.设计admin\left.php
left.php文件用于显示管理界面的左侧部分,它定义了一组管理链接,如表A12所示。
表A12 left.php中的管理链接
这些功能的具体实现方法将在稍后介绍。
4.退出登录
管理员用户登录后,在左侧的功能列表中单击“退出系统”超链接,可以退出到未登录的状态。“退出登录”超链接的定义代码如下:
<A href="LogOut.php" target=_top><font color="#444444">退出系统</font></A>
LogOut.php的主要代码如下:
<?PHP
session_start();
$_SESSION["UserName"] = "";
$_SESSION["UserPwd"] = "";
header("Location: Login.php");
?>
程序将Session变量设置为空,然后将页面转向登录页面。
项目4 后台管理模块设计
后台管理可以实现以下功能。
• 上传软件。
• 添加、修改和删除软件信息。
• 添加、修改和删除软件类别信息。
• 添加、修改和删除系统用户信息。
• 修改个人密码。
只有管理用户才有权限进入后台管理模块。
1.设计上传软件页面
在admin\index.php中,单击“软件上传”超链接,将访问admin\UpLoad.php,用来上传软件资源,如图A5所示。
图A5 上传软件页面
在上传软件页面UpLoad.php中,上传软件资源的表单定义如下:
<form name="form1" method="post" action="UpFile.php" enctype="multipart/form-data">
可以看到,上传软件的数据由upfile.php处理。Upfile.php将用户上传的软件存放到系统指定的software目录下,并将上传信息保存到数据库UpFile表中,代码如下:
<?PHP
date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题
//此函数用于根据当前系统时间自动生成上传文件名
function makefilename() {
//获取当前系统时间,生成文件名
$curtime = getdate();
$filename =$curtime['year'] . $curtime['mon'] . $curtime['mday'] . $curtime['hours'] . $curtime['minutes'] . $curtime['seconds'];
Return $filename;
}
//检查上传文件的目录
$upload_dir = getcwd();
$len = strlen($upload_dir)-6;//去掉当前目录admin
$upload_dir = substr($upload_dir, 0, $len) . "\\software\\";
//如果目录不存在,则创建
if(!is_dir($upload_dir))
mkdir($upload_dir);
$newfilename = makefilename();
$oldfilename = $_FILES['file1']['name']; //服务器端临时文件名
$pos = strrpos($oldfilename, '.'); // 获取文件名中最右侧的
$ext = substr($oldfilename, $pos, strlen($oldfilename)-$pos);
//获取文件的扩展名
$newfile = $upload_dir . $newfilename . $ext;
if(file_exists($_FILES['file1']['tmp_name'])) {
move_uploaded_file($_FILES['file1']['tmp_name'], $newfile);
}
else {
echo("error");
}
echo("客户端文件名:" . $_FILES['file1']['name'] . "<BR>");
echo("文件类型:" . $_FILES['file1']['type'] . "<BR>");
echo("文件大小:" . $_FILES['file1']['size'] . "<BR>");
echo("服务器端临时文件名:" . $_FILES['file1']['tmp_name'] . "<BR>");
echo("上传后新的文件名:" . $newfile . "<BR>");
include('..\Class\UpFile.php');
$objUpFile = new UpFile();
$objUpFile->UpName = $newfilename . $ext; //不带路径的文件名
$objUpFile->URL = $newfile; // 带路径的文件名
$objUpFile->InsertUpFile();
?>
文件上传成功 [ <a href=# onclick=history.go(-1)>继续上传</a> ]
makefilename()函数的功能是根据当前的系统时间生成文件名。关于上传文件的具体方法请参照5.4.1小节理解。上传文件的信息将保存在表UpFile中,程序调用$objUpFile->InsertUpFile()函数插入上传文件的数据。
上传成功后,将显示上传文件的基本信息,如图A6所示。
图A6 上传成功
2.设计上传管理页面
在admin\index.php中,单击“上传管理”超链接,将访问admin\UpList.php,用来管理上传的软件资源,如图A7所示。
图A7 上传软件管理页面
在上传管理页面UpList.php中,从数据库表UpFile中读取软件的上传信息,代码如下:
<?PHP
include('..\Class\UpFile.php');
$objUpfile = new UpFile();
$results = $objUpfile->GetUpFilelist();
$exist = false;
while($row = $results->fetch_row()) {
$exist = true;
?>
<tr>
<td align="center"><?PHP echo($row[0]); ?> </td>
<td><?PHP echo($row[1]); ?> </td>
<td align="left"><?PHP echo($row[2]); ?> </td>
<td align="center"><a href="UpDelt.php?id=<?PHP echo($row[0]); ?>">删除</a></td>
</tr>
<?PHP
}
if(!$exist) {
echo("<tr><td align=center colspan=4>没有上传的软件资源</td></tr></table>");
}
?>
用户可以通过单击“删除”超级链接,执行UpDelt.php,删除上传记录,同时删除上传的软件。UpDelt.php的主要代码如下:
<?PHP
//读取编号参数
$id = $_GET["id"];
//读取指定软件资源信息的数据
include('..\Class\UpFile.php');
$objUpfile = new UpFile();
$results = $objUpfile->GetUpFileInfo($id);
if($row = $results->fetch_row()) {
$URL = $row[2];
if(is_file($URL)) //如果存在,则删除文件
unlink($URL);
$objUpfile->DeleteUpFile($id);//删除数据库中的记录
}
?>
在PHP中,is_file()函数用于判断文件是否存在,unlink()函数用于删除指定的文件。
3.设计软件类别管理页面
在admin\index.php中,单击“软件类别管理”超级链接,执行admin\CategoryList.php,显示软件的类别列表,如图A8所示。
图A8 类别管理页面
类别管理页面为 CategoryList.php,软件类别的添加、修改和删除都在这里完成。下面介绍CategoryList.php中与界面显示相关的部分代码。
(1)显示类别信息
为了便于用户管理类别信息,CategoryList.php以表格的形式按层次显示类别名称,即一级类别和二级类别显示在不同的表格列中,并在后面显示修改和删除链接。代码如下:
<?PHP
include('..\Class\Category.php');
$ca = new Category();
......
//读取一级类目数据到记录集$results中
$results = $ca->GetCategorylist();
$exist = false;//标识$results中是否存在数据
//在表格中显示类目名称
while($row = $results->fetch_row()) {
$exist = true;
?>
<tr>
<td><?PHP echo($row[1]); ?></td>
<td> </td>
<td align="center"><a href="CategoryList.php?Oper=update&did=<?PHPecho($row[0]); ?>&name=<?PHP echo($row[1]); ?>">修改</a></td>
<td align="center"><a href="CategoryList.php?Oper=delete&did=<?PHPecho($row[0]); ?>&name=<?PHP echo($row[1]); ?>">删除</a></td>
</tr>
<?PHP
//读取此类目下所有类目信息
$ca1 = new Category();
$results1 = $ca1->GetSublist($row[0]);
while($row1 = $results1->fetch_row()) {
?>
<tr>
<td> </td>
<td><?PHP echo($row1[1]); ?></td>
<td align="center"><a href="CategoryList.php?Oper=update&did=<?echo($row1[0]); ?>&name=<?PHP echo($row1[1]); ?>">修改</a></td>
<td align="center"><a href="CategoryList.php?Oper=delete&did=<?PHPecho($row1[0]); ?>&name=<?PHP echo($row1[1]); ?>">删除</a></td>
</tr>
<?PHP
}
}
if(!$exist) {
//如果记录集为空,则显示“目前还没有记录”
echo("<tr><td colspan=4 align=center><font style='COLOR:Red'>目前还没有记录。</font></td></tr></table>");
}
?>
可以看到,修改和删除类别信息的操作也在页面 CategoryList.php 中完成(超级链接的 href属性值为CategoryList.php)。参数Oper表示当前页面的操作状态,当Oper=edit时,表示当前操作为修改类别信息;当Oper=delete时,表示当前操作为删除类别信息。参数did表示要修改或删除的类别编号;参数name表示要修改或删除的类别名称。
(2)显示添加类别的表单
表单AForm和BForm用来添加类别信息,当Oper= add时,将显示添加类别的表单。添加类别有两种情况。如果添加一级类别名称,则在表单AForm的文本框txttitle中输入类别名称;如果添加二级类别信息,则需要在表单BForm中选择一级类别名称,然后在文本框txttitle中输入二级类别名称。具体代码如下:
<form name="AForm" method="post" action="CategoryList.php?Oper=add">
<p align="center">
<font color="#FFFFFF"><b><font color="#000000">添加一级类目:</font></b></font>
类目名称: <input type="text" name="txttitle" size="20">
<input type="hidden" name="sUpperId" value="0">
<input type="submit" name="Submit" value=" 添 加 " onclick="returnform_onsubmit1(this.form)">
</p>
</form>
<form name="BForm" method="post" action="CategoryList.php?Oper=add">
<p align="center">
<select name="cid">
<?PHP //将类目装入下拉菜单中
$results = $ca->GetCategorylist();
while($row = $results->fetch_row()) {
$sname = $row[1];
$did = $row[0]; ?>
<option value="<?PHP echo($did); ?>"><?PHP echo($sname); ?></option>
<?PHP } ?>
</select>
<font color="#FFFFFF"><b><font color="#000000">添加二级类目:</font></b></font>
类目名称: <input type="text" name="txttitle" size="20">
<input type="hidden" name="sUpperId" value="1">
<input type="submit" name="Submit" value=" 添 加 " onclick="returnform_onsubmit(this.form)">
</p>
</form>
当用户添加一级类别名称时,单击“添加”按钮,函数form_onsubmit1用来验证文本框中txttitle是否输入了数据。代码如下:
function form_onsubmit1(obj)
{
ValidationPassed = true;
if(obj.txttitle.value == "") {
alert("请输入类目名称");
ValidationPassed = false;
return ValidationPassed;
}
}
当用户添加二级类别名称时,单击“添加”按钮,函数 form_onsubmit 用来验证是否选择了一级类别以及文本框txttitle中是否输入了数据。代码如下:
function form_onsubmit(obj)
{
ValidationPassed = true;
if(obj.cid.selectedIndex <0) {
alert("请选择一级类目");
ValidationPassed = false;
return ValidationPassed;
}
if(obj.txttitle.value == "") {
alert("请输入类目名称");
ValidationPassed = false;
return ValidationPassed;
}
}
(3)显示修改类别的表单
表单UForm用来修改类别信息。当Oper= update时,将显示修改类别的表单,具体代码如下:
<?PHP
//如果当前状态为修改,则显示修改的表单,否则显示添加的表单
if($Soperate == "update") {
$sTitle = $_GET["name"];
?>
<form name="UFrom" method="post" action="CategoryList.php?did=<?PHPecho($Operid); ?>&Oper=edit">
<div align="center">
<input type="hidden" name="sOrgTitle" value="<?PHP echo($sTitle); ?>">
<font color="#FFFFFF"><b><font color="#000000">类目名称</font></b></font>
<input type="text" name="txttitle" size="20" value="<?PHP echo($sTitle); ?>">
<input type="submit" name="Submit" value="修改">
</div>
</form>
<?PHP
}
else {
?>
隐藏文本框(type="hidden")sOrgTitle 用于显示和保存修改前的类别名。添加和修改类别的脚本都是CategoryList.php,只是参数不同。当参数Oper=edit时,程序将处理修改的类别数据;当参数Oper=add时,程序将处理添加的类别数据。
(4)添加类别信息
在打开CategoryList.php时,如果参数Oper不等于update,页面的下方将显示添加数据的表单Aform。在文本域txttitle中输入类别的名称,然后单击“添加”按钮,将调用CategoryList.php,参数Oper等于add,表示插入新记录。
在执行CategoryList.php时,可以在url中包含参数,程序将根据参数Oper的值决定进行的操作。与添加数据相关的代码如下:
<?PHP
//处理添加、修改和删除操作
//读取参数oper,决定当前要进行的操作
$Soperate = $_GET["Oper"];
$Operid = $_GET["did"];
include('..\Class\Category.php');
include('..\Class\DownLoad.php');
$ca = new Category();
$dw = new DownLoad();
//删除记录
if($Soperate=="delete") {
……
}
//添加
elseif($Soperate == "add") {
$CName = $_POST["txttitle"];
$UpId = $_POST["sUpperId"];
if($UpId=="0")
$UId = 0;
else
$UId = $_POST["cid"];
//判断是否已经存在此类目名称
if(!$ca->HaveCategory($CName)) {
//如果没有此类目名称,则创建新记录
$ca->CName = $CName;
$ca->UpperId = $UId;
$ca->InsertCategory();
echo("类别已经成功添加!");
}
else {
echo("已经存在此类别名称!");
}
}
elseif($Soperate == "edit") {
……
}
?>
变量$Soperate用于接收参数Oper的值,当$Soperate等于“add”时,表示当前状态为插入记录。在插入新类别之前,应该判断此类别名称是否已经存在,以避免出现重复的类别。
(5)修改类别信息
在 CategoryList.php 中,单击类别后面的“修改”超级链接,将打开 CategoryList.php,参数Oper等于update。此时,页面的下方将显示修改数据的表单Uform。在文本域txttitle中输入类别的名称,然后单击“修改”按钮,将再次打开CategoryList.php,参数Oper等于edit,表示修改记录。与修改数据相关的代码如下:
<%
……
//删除记录
if($Soperate=="delete") {
……
//添加
elseif($Soperate == "add") {
……
}
elseif($Soperate == "edit") {
$CName = $_POST["txttitle"];
//如果新类目名称与旧名称不同,则判断是否存在此类目名称
$ca->CId = $Operid;
$ca->CName = $CName;
//如果原类目编号和新类目名称不存在,则表示类目名称发生变化
if(!$ca->HaveSameCate()) {
//此时判断是否存在此类目名称
if(!$ca->HaveCategory($CName)) { //新类目不存在
$ca->CName = $CName;
$ca->UpdateCategory($Operid);
echo("类目已经成功修改!");
}
else {
echo("已经存在此类目名称");
}
}
}
?>
在修改类别之前,应该判断新的类别是否已经存在,以避免出现重复的类别。
(6)删除类别信息
在 CategoryList.php 中,单击类别后面的“删除”超链接,将再次打开 CategoryList.php,参数Oper等于delete。删除类别的代码如下:
//删除记录
if($Soperate=="delete") {
//判断此类目是否存在下级类目
if($ca->HaveSub($Operid)) {
exit("此类目存在下级类别,不能删除!");
}
//判断此类目下是否存在软件资源信息
if($dw->HaveCId($Operid)) {
exit("此类目包含软件资源信息,不能删除!");
}
$ca->DeleteCategory($Operid);
echo("类别已经成功删除!");
}
//添加
elseif($Soperate == "add") {
……
}
elseif($Soperate == "edit") {
……
}
?>
在修改类别之前,应该判断此类别是否满足允许被删除的条件,如果要删除类别满足下面的任一条件,则不能删除此类别:
• 是否存在下级类别;
• 是否被软件下载表DownLoad使用。
变量 Operid 用于接收参数 did 的值,表示当前要删除的类别编号。程序调用$ca->DeleteCategory()函数删除指定的类别记录。
4.设计添加软件页面
在admin\index.php中,单击“添加软件资源”超链接,将执行admin\DownAdd.php,添加新的软件下载资源信息,如图A9所示。
图A9 添加软件下载资源页面
在添加软件页面中,从表Category中读取软件类别信息,并存放到下拉列表CId中,读取类别信息的代码如下:
<TR>
<TD align="right" width="15%" nowrap>软件类别:</TD>
<TD><select size="1" name="cid">
<?PHP
//读取一级类别信息
include('..\Class\Category.php');
$objCate = new Category();
$objCate1 = new Category();
$results = $objCate->GetCategorylist();
while($row = $results->fetch_row()) {
?>
<option value="<?PHP echo($row[0]); ?>"><?PHP echo($row[1]); ?></option>
<?PHP
//读取下级类别
$results1 = $objCate1->GetSublist($row[0]);
while($row1 = $results1->fetch_row()) {
//下级类别的value值=类别编号大小+100000,用来区分一级类别
?>
<option value="<?PHP echo(10000+(int)$row1[0]); ?>">-- <?PHPecho($row1[1]); ?></option>
<?PHP
}
}
?>
</Select> </TD>
</TR>
在DownAdd.php页面中,“添加”按钮代码如下:
<input type="submit" value=" 添 加 " name="B1" onclick="if(CheckFlds()){return true;}return false;">
提交前需要调用CheckFlds()函数对表单进行域校验,代码如下:
<SCRIPT language = "JavaScript">
function CheckFlds(){
if (document.form1.cid.value==""){
alert("请选择软件类别!");
form1.cid.focus;
return false;
}
if (document.form1.txtfilename1.value==""){
alert("请输入下载地址1!");
form1.txtfilename1.focus;
return false;
}
if (document.form1.txtname1.value==""){
alert("请输入地址名称1!");
form1.txtname1.focus;
return false;
}
if (document.form1.txtsoftname.value==""){
alert("请输入软件名称!");
form1.txtsoftname.focus;
return false;
}
//判断是否存在下级类目
ndid = document.form1.cid.value;
if (ndid <= 10000){
alert("此类目存在下级类别,请重新选择类别");
form1.cid.focus;
return false;
}
return true;
}
</SCRIPT>
程序判断软件类别、软件名称、下载地址1等信息是否为空,如果为空,则返回false,不允许表单数据提交;判断用户是否选择了软件类别,而且选择的类别应为二级类别,否则不允许提交表单。
当用户单击“添加”按钮时,将提交表单,表单的定义代码如下:
<form method="POST" name="form1" action="DownSave.php?action=add"><br>
表单数据提交后,将执行DownSave.php保存数据,参数action表示当前的动作,action=add表示添加记录。DownSave.php也可以用来处理修改软件信息的数据。
DownSave.php的主要代码如下:
<?PHP include('isUser.php'); ?><html>
<?PHP
include('..\Class\DownLoad.php');
$dw = new DownLoad();
$dw->DownName = $_POST["txtname"]; //软件名称
$dw->CId = $_POST["cid"]-10000;
if($_POST["txtfilename1"]<>"") {
$dw->FileName1 = $_POST["txtfilename1"];
$dw->TxtName1 = $_POST["txtname1"];
}
if($_POST["txtfilename2"]<>"") {
$dw->FileName2 = $_POST["txtfilename2"];
$dw->TxtName2 = $_POST["txtname2"];
}
if($_POST["txtfilename3"]<>"") {
$dw->FileName3 = $_POST["txtfilename3"];
$dw->TxtName3 = $_POST["txtname3"];
}
$dw->ImageFile = $_POST["images"];
$dw->FromURL = $_POST["fromurl"];
$dw->Rights = $_POST["rights"];
$dw->DownSize = $_POST["size"];
$dw->DNote = $_POST["txtnote"];
$dw->HotStars = $_POST["hot"];
if($_POST["hide"]=="on")
$dw->IsHide = 1;
else
$dw->IsHide = 0;
if($_POST["hots"]=="on")
$dw->IsHot = 1;
else
$dw->IsHot = 0;
//添加软件信息
if($_GET["action"]=="add")
$dw->InsertDownLoad();
else //修改软件信息
$dw->UpdateDownLoad($_GET["did"]);
?>
<html>
<head>
<title>保存软件信息</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body bgcolor="#eeeeee">
<br><br>
<table width="50%" align="center" border="1" cellpadding="0" cellspacing="0"bordercolorlight="#666666" bordercolordark="#FFFFFF">
<tr>
<td width="100%" height="20" bgcolor="#eeeeee">
<p align="center"><font color="#FFFFFF">
<?PHP
if($_POST["action"]=="add")
echo("添加");
else
echo("修改");
?>
软件成功</font> </td>
</tr>
<tr>
<td width="100%" >
<p align="left"><br>
下载地址1为:<?PHP echo($_POST["txtfilename1"]); ?><br><br>
下载地址2为:<?PHP echo($_POST["txtfilename2"]); ?><br><br>
下载地址3为:<?PHP echo($_POST["txtfilename3"]); ?><br><br>
软件名称为:<?PHP echo($sw->DownName); ?><br><br>
</td>
</tr>
</table>
<?PHP
if($_GET["action"]=="edit") { ?>
<p align="center"><a href="javascript:window.close()">[关闭本窗口]</a></p>
<?PHP } /*end of if*/ ?>
</body>
</html>
5.设计软件管理页面
在admin\index.php中,单击“软件资源管理”超链接,将执行admin\DownList.php,用来管理软件下载资源,如图A10所示。
图A10 软件管理页面
在软件管理页面DownList.php中,从数据库表DownLoad中读取软件信息。代码如下:
<?PHP
include('..\Class\DownLoad.php');
$dw = new DownLoad();
$results = $dw->GetDownLoadlist();
while($row = $results->fetch_row()) {
?>
<tr>
<td align="center"><?PHP echo($row[0]); ?> </td>
<td><?PHP echo($row[1]); ?> </td>
<td align="center"><a href="DownEdit.php?id=<?PHP echo($row[0]); ?>"onClick="return newwin(this.href)">修改</a></td>
<td align="center"><a href="DownDelt.php?id=<?PHP echo($row[0]); ?>"onClick="return newwin(this.href)">删除</a></td>
</tr>
<?PHP } ?>
用户可以通过单击“修改”超链接,打开DownEdit.php,修改软件资源记录。修改和保存软件信息的过程与添加软件相似,请参照理解。
用户可以通过单击“删除”超链接,执行SoftDelt.php,删除软件资源信息。代码如下:
<?PHP
include('..\Class\DownLoad.php');
$dw = new DownLoad();
$id = $_GET["id"];
$dw->DeleteDownLoad($id);
echo("软件资源成功删除!");
?>
6.设计用户管理页面
在admin\index.php中,单击“用户管理”超链接,执行admin\UserList.php,显示系统管理员用户列表,如图A11所示。
图A11 用户管理页面
在用户管理页面UserList.php中,可以添加和删除系统管理员用户,并且可以重置用户密码。
(1)添加用户信息
当用户单击“新建用户信息”按钮后,将打开UserEdit.php页面,添加新用户。代码如下:
<input type="button" value="新建用户信息" onclick="newView('UserEdit.php)" name=add>
在UserEdit.php页面中,只需要输入新用户的用户名即可,如图A12所示。
图A12 添加新用户页面
(2)保存用户信息
在添加新用户页面中,当用户单击“提交”按钮时,将提交表单。代码如下:
<form name="form1" method="POST" action="UserSave.php" onsubmit="return CheckFlds()">
函数CheckFlds用来检验是否输入了用户名,如果用户名为空,则不允许提交表单。
保存用户信息的文件为UserSave.php,代码如下:
<?PHP
//在数据库表Users中插入新信息
$usr = new Users();
$usr->UserName = $_POST["uname"];
//插入用户前判断该用户名是否已经存在
if($usr->HaveUserName($usr->UserName)) {
echo("<script>alert('该用户名已经存在');history.go(-1);</script>");
exit("");
}
$usr->InsertUser();
echo("<h3>用户成功保存</h3>");
?>
程序调用$usr->HaveUserName()函数判断表Users中是否已经存在该用户名,如果存在则不允许添加新用户;如果不存在,则调用$usr->InsertUser()函数保存用户信息。
(3)删除用户信息
在用户管理页面中,当用户单击“删除”超链接时,执行代码如下:
<td align="center"><?PHP if($row[0]<>"Admin") { ?><a href="UserDelt.php?uid=<?PHP echo($row[0]); ?>" onClick="if(confirm(' 确定要删除用户吗 ?')){return newView(this.href);}return false;">删除</a><?PHP } ?> </td>
程序将询问用户是否确认要删除该用户系统,如果是,则在新窗口中执行UserDelt.php脚本,删除该用户。代码如下:
<?PHP
$uid = $_GET["uid"];
$usr = new Users();
$usr->DeleteUser($uid);
echo("<h3>用户记录成功删除</h3>");
?>
(4)密码重置
在用户管理页面中,当用户单击“密码重置”超级链接时,执行代码如下:
<td align="center"><a href="PwdReset.php?uid=<?PHP echo($row[0]); ?>"onClick="if(confirm('确定要重置用户密码吗?')){return newView(this.href);}return false;">密码重置</a></td>
程序将询问用户是否确认要重置该用户的登录密码,如果是,则在新窗口中执行PwdReset.php脚本,将该用户的密码还原为111111。代码如下:
<?PHP
$uid = $_GET["uid"];
$usr = new Users();
$usr->UpdatePassword(uid,1);
echo("<h3>用户密码成功重置</h3>");
?>
7.设计修改密码页面
在admin\index.php中,单击“修改密码”超链接,执行admin\PwdChange.php,允许系统管理员修改登录密码,如图A13所示。
图A13 修改密码页面
当管理员单击“提交”按钮时,将提交页面,代码如下:
<form method="POST" action="PwdSave.php?uid=<?PHP echo($UserId); ?>" name="myform"onsubmit="return ChkFields()">
函数ChkFields的功能是对输入的新密码进行校验,代码如下:
<Script Language="JavaScript">
function ChkFields() {
if (document.myform.OriPwd.value=='') {
alert("请输入原始密码!")
return false
}
if (document.myform.Pwd.value.length<6) {
alert("新密码长度大于等于6!")
return false
}
if (document.myform.Pwd.value!=document.myform.Pwd1.value) {
alert("两次输入的新密码必须相同!")
return false
}
return true
}
</Script>
程序将检查新密码是否输入、新密码长度是否大于等于6位和两次输入的新密码是否相同,只有满足以上条件,才执行SavePwd.php文件。
在SavePwd.php页面中,程序调用UpdatePassword()函数修改密码,代码如下:
<?PHP
$OriPwd = $_POST["OriPwd"];
$Pwd = $_POST["Pwd"];
$usr = new Users();
$usr->UserPwd = $Pwd;
$usr->UpdatePassword($UserName,0);
echo("<h2>更改密码成功!</h2>");
$_SESSION["UserPwd"] = $Pwd;
?>
项目5 系统主界面程序设计
本项目将介绍系统主页面的设计过程。
1.设计主界面
本实例的主界面为index.php,它的功能是显示系统的给定信息,包括软件查询、推荐软件、热点浏览排行等信息,如图A14所示。
在index.php中,包含top.php和left.php脚本,分别用来显示上方和左侧内容。index.php的代码显示网页中间部分的内容。
下面将介绍index.php的主要代码。
在index.php的中央,将显示推荐下载的软件信息,代码如下:
<table width="100%" border="1" cellpadding="0" cellspacing="0"bordercolorlight="#B06A00" bordercolordark=#E7E4E2>
<tr>
<td width="100%" valign="top">
<table width="100%">
<?PHP
$m = 0;
//include('Class\DownLoad.php');
$dw = new DownLoad();
$results = $dw->GetHot();
$exist = false;
while($row = $results->fetch_row()) {
$exist = true;
if($m>=31)
break;
$m = $m + 1;
?>
<TR>
<A href="list.php?id=<?PHP echo($row[0]); ?>"><?PHP echo($row[1]); ?></A><FONT color='#B06A00'>(
<?PHP echo($row[21]); ?> <font color=#000099><?PHPecho($row[19]); ?></font>)</font></TD>
</TR>
<?PHP
}
if(!$exist) {
echo("<TR><td>没有任何软件资源</td></Tr>");
}
?>
</table>
图A14 index.php的运行界面
当用户单击软件名称时,在新窗口中打开list.php文件,查看下载软件的详细资料。
2.设计top.php
top.php文件用于显示主界面的上侧部分,包括图片、首页链接、软件类别名称和软件搜索。用户通过单击软件类别名称查看指定类别名称下所有的软件列表。代码如下:
<?PHP
include('Class\Category.php');
$ca = new Category();
$results = $ca->GetCategorylist();
while($row = $results->fetch_row()) {
?>
| <a class="list" href="sort.php?cid=<?PHP echo($row[0]); ?>"><font color="#B06A00">
<?PHP echo($row[1]); ?></font></a>
<?PHP } ?>
|</p>
</font> </td>
</tr>
</table>
</center>
</div>
<div align="center">
<center>
<table width="703" border="1" cellpadding="0" cellspacing="0"bordercolorlight="#B06A00" bordercolordark=#FFFFFF>
<tr>
<form method="post" name="myform" action="search.php">
<td width="100%" bordercolorlight="#B06A00" bordercolordark=#FFFFFF>
<font color=#B06A00 >软件搜索:</font><SELECT name="cid" size="1">
<OPTION selected value="">类目不限</OPTION>
<?PHP
$results = $ca->GetCategorylist();
while($row = $results->fetch_row()) {
?>
<OPTION value="<?PHP echo($row[0]); ?>"><?PHP echo($row[1]); ?></OPTION>
<?PHP } ?>
当用户在软件搜索下拉列表中选择软件类别,并在文本域中输入搜索关键字后,单击“搜索”按钮,将提交表单,代码如下:
<form method="post" name="myform" action="search.php">
查询结果显示页面Search.php将在稍后介绍。
3.设计Left.php
Left.php文件用于显示主界面的左侧部分,包括今日浏览排行、本周浏览排行和累计浏览排行。
(1)显示今日下载排行
今日浏览排行列表中将读取表DownLoad中日浏览数量大于0、不隐藏的和最后浏览时间为当日的10个软件信息。代码如下:
<?PHP
date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题
$now = getdate();
$mm = $now['mon'];
if(strlen($now['mon'])<2)
$mm = "0" . $now['mon'];
$dd = $now['mday'];
if(strlen($now['mday'])<2)
$dd = "0" . $now['mday'];
$today = $now['year'] . "-" . $mm . "-" . $dd;
// echo($today);
include('Class\DownLoad.php');
$dw = new DownLoad();
$exist = false;
$sql = "SELECT Did, DownName FROM DownLoad WHERE DayHits>0 AND LEFT(LastHitTime, " . strlen($today) . ")='" . $today . "' Order By DayHits DESC LIMIT 0, 10";
$results = $dw->GetDLlist($sql);
while($row = $results->fetch_row()) {
$exist = true;
echo("<img src='IMG/follow.gif' width='11' height='11'><A href=list.php?id=" . $row[0] . ">" . $row[1] . "</A><br>");
}
if(!$exist)
echo("本日没有下载");
?>
(2)显示本周下载排行
本周浏览排行列表中将读取表DownLoad中本周浏览数量大于0、不隐藏的且最后浏览时间在本周的10个软件信息。代码如下:
<?PHP
$weekday = $now['wday']; // 获取当前星期几0-周日~6-周6
if($weekday == 0)
$weekday = 7;
$sql = "Select DId,DownName From DownLoad Where (LastHitTime > DATE_ADD('" . $today . "', INTERVAL " . (1-$weekday) . " DAY)) AND (LastHitTime < DATE_ADD('" . $today . "', INTERVAL " . (7-$weekday) . " DAY)) And IsHide=0 And WeekHits>0 Order By WeekHits Desc LIMIT 0,10";
$results = $dw->GetDLlist($sql);
$exist = false;
while($row = $results->fetch_row()) {
$exist = true;
echo("<img src='IMG/follow.gif' width='11' height='11'><A href=list.php?id=" . $row[0] . ">" . $row[1] . "</A><br>");
}
if(!$exist)
echo("本周没有下载");
?>
(3)显示累计下载排行
累计下载排行列表中将读取表DownLoad中累计浏览数量最多的10个软件信息,代码如下:
<?PHP
$sql = "Select DId,DownName From DownLoad Order By TotalHits Desc LIMIT 0,10";
$results = $dw->GetDLList($sql);
$exist = false;
while($row = $results->fetch_row()) {
$exist = true;
echo("<img src='IMG/follow.gif' width='11' height='11'><A href=list.php?id=" . $row[0] . ">" . $row[1] . "</A><br>");
}
if(!$exist)
echo("没有下载");
?>
4.设计查看下载软件页面
在主界面index.php中,单击任一下载软件,将打开List.php页面,显示下载软件的详细信息,如图A15所示。
下面介绍查看软件信息页面的部分代码。
(1)显示软件信息
程序会根据软件编号读取和显示软件基本信息,代码如下:
图A15 查看软件信息页面
<?PHP
$did = $_GET["id"];
if($did=="")
exit("您没有选择相关软件资源,请返回");
$dw = new DownLoad();
$results = $dw->GetDetail($did);
if($row = $results->fetch_row()) {
$DownName = $row[1];
$uCId = $row[23]; // UpperId
$nCId = $row[2];// CId
$uName = $row[22]; //分类名称
$nName = $row[24]; //上级分类名称
$LastHitTime = $row[17]; //最近点击的时间
……
<TABLE width="100%" border="1" cellpadding="0" cellspacing="0"bordercolorlight="#B06A00" bordercolordark=#E7E4E2>
<TR>
<TD width="100%" colspan="3"><font color=B06A00><B><?PHP echo($row[1]); ?></B></TD>
</TR>
<TR>
<TD width="70" align="center" nowrap><font color=#B06A00>软件类别:</TD>
<TD width="258"><font color=#B06A00><?PHP echo($uName); ?>-<?PHPecho($nName); ?></TD>
……
(2)显示软件图片
在List.php页面中,显示软件图片的代码如下:
<?PHP
if($row[9]<>"")
echo("<a href=ShowPic.php?id=" . $row[0] . " target=_blank><img src=" . $row[9] . " border=0 width=150 height=120 alt=点击放大></a>");
else
echo("无图片");
?>
ShowPic.php页面用来显示软件的图片信息,代码如下:
<?PHP
$dw = new DownLoad();
$did = $_GET["id"];
$results = $dw->GetDownLoadInfo($did);
if($row = $results->fetch_row()) {
if($row[9] <> "") // ImageFile字段
header("Location: " . $row[9]);
}
?>
(3)显示相关软件信息
根据软件名称从表DownLoad中读取和显示与本软件有相似名称的软件,代码如下:
<?PHP
//在下载表中查找不包括本记录的相关的资源信息
$sql ="Select * From DownLoad Where DId<>" . $did . " And DownName Like '%" . $row[1] . "%' Order By DId Desc";
$results = $dw->GetDLlist($sql);
$exist = false;
while($row = $results->fetch_row()) {
$exist = true;
echo("<a href=List.php?id=" . $row[0] . " target=_blank>" . $row[1] . "</A><br>");
}
if(!$exist)
echo("没有相关资源");
?>
(4)显示软件评论信息
程序会根据软件编号从表Votes中读取和显示软件的评论信息,代码如下:
<?PHP
include('Class\Votes.php');
$vt = new Votes();
$results2 = $vt->GetVoteslist($did);
$exist = false;
$i = 0;
while($row2 = $results2->fetch_row()) {
$exist = true;
echo("<font color=#B06A00><li>[打分:" . $row2[3] . "] " . $row2[1] . "</font></li>");
$i=$i+1;
if(i>=5)
break; //只显示5条记录
}
if(!$exist)
echo("暂时没有此软件的评论!");
?>
5.设计下载软件页面
在查看下载软件页面List.php中,提供2个下载链接,定义如下:
1. <a href="download.php?did=<?php echo($row[0]); ?>&flag=1" target=_blank><?PHP echo($row[4]); ?></a>
2. <a href="download.php?did=<?php echo($row[0]); ?>&flag=1" target=_blank><?PHP echo($row[6]); ?>%> <?PHP echo($row[1]); ?></A>
3. <a href="download.php?did=<?php echo($row[0]); ?>&flag=1" target=_blank><?PHP echo($row[8]); ?> <?PHP echo($row[1]); ?></A>
download.php用于处理软件下载,参数did用于指定下载的软件编号,参数flag指定下载链接的序号,如果flag等于1,则从下载链接1下载软件;如果flag等于2,则从下载链接2下载软件;如果flag等于3,则从下载链接3下载。
download.php主要完成如下工作。
(1)获取下载软件的信息
程序首先根据参数did从表DownLoad中获取下载软件的相关信息,代码如下:
<?php
$did = $_GET["did"];
$flag = $_GET["flag"];
if($did=="")
exit("您没有选择相关软件资源,请返回");
include('Class\DownLoad.php');
$dw = new DownLoad();
$results = $dw->GetDetail($did);
if($row = $results->fetch_row()) {
// print_r($row);
$DownName = $row[1];
$dl1 = $row[3]; // 下载链接1
$dl2 = $row[5];//下载链接2
$dl3 = $row[7]; //下载链接3
$LastHitTime = $row[18]; //最近点击的时间
}
else {
exit("没有找到相关软件资源。");
}
if($flag<1 or $flag>3 or ($flag==1 and $dl1=="") or ($flag==2 and $dl2=="") or ($flag==3 and $dl3== ""))
exit("没有相关下载链接");
(2)更新下载数
当打开软件信息页面时,download.php会根据软件编号更新下载数具体代码如下:
//更新每周每日数据
date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题
$now = getdate();
$today = $now['year'] . "-" . $now['mon'] . "-" . $now['mday'];
if($LastHitTime==$today)
$dw->UpdateDayHits($did,1);
else
$dw->UpdateDayHits($did,0);
$dw->UpdateTotalHits($did); //更新总点击数
//更新本周点击次数
$weekday = $now['wday']; // 获取当前星期几0-周日~6-周6
if($dw->isInThisWeek($LastHitTime))
$dw->UpdateWeekHits($did,1);
Else
$dw->UpdateWeekHits($did,0);
更新下载数的具体方法如下。
• 如果最后浏览日期为当日,则日浏览数加1。
• 如果最后浏览日期不为当日,则日浏览数等于1。
• 将累计浏览数加1。
• 如果最后浏览日期为本周,则周浏览数加1。
• 如果最后浏览日期不为本周,则周浏览数等于1。
(3)转向下载链接
最后,download.php会根据参数flag转向对应的下载链接开始下载,代码如下:
if ($flag == 1){
header("Location: " . $dl1);
}
if ($flag == 2)
header("Location: " . $dl2);
if ($flag == 3)
header("Location: " . $dl3);
6.设计软件投票页面
在查看下载软件页面List.php中单击“讨论投票”超链接,将打开Vote.php页面用于显示软件投票打分页面,如图A16所示。
图A16 Vote.php的运行界面
在Vote.php中,程序会根据软件下载编号从数据库表Votes中读取投票的数量,同时计算平均分。代码如下:
<?PHP
……
$results = $vt->GetVoteslist($id);
$V_Count=0;//投票数量
$AvgGrade=0;//投票平均分
while($row = $results->fetch_row()) {
$V_Count++;
}
if($V_Count > 0)
$AvgGrade = $vt->GetSum($id)/$V_Count; //投票平均分
?>
在Vote.php中,还可以根据评论数量显示访客的评论信息。代码如下:
<p align="center"><font color="#666666">本软件共有<?PHP echo($V_Count); ?>人打分,综合评分为<?PHP echo($AvgGrade); ?></font></p>
</td>
</tr>
<tr>
<td align="center">
<form method=post action="Vote.php?action=save&id=<?PHP echo($id); ?>">
<input name=grade type=radio value=1> 1
<input name=grade type=radio value=2> 2
<input checked name=grade type=radio value=3> 3
<input name=grade type=radio value=4> 4
<input name=grade type=radio value=5> 5
<input name=id type=hidden value='<%=Request("id")%>'>
<br>
<font color="#666666">简短评论:</font>
<input name=content type=text size="30" maxlength="100">
<input type=submit value="提交" name="b1">
</form>
</td>
</tr>
<tr>
<td align="center"><font color="#666666">已发表评论</font></td>
</tr>
<tr>
<td>
<?PHP
if($V_Count==0) { ?><font color="#666666">暂时没有评论</font>
<?PHP
} // end of if
else {
$results = $vt->GetVoteslist($id);
while($row = $results->fetch_row()) {
?>
<table board=0 width=100%>
<tr>
<td width=90%> <font color="#666666"> ☉ <?PHPecho($row[1]); ?> [打分:<?PHP echo($row[3]); ?>分]</font></td>
</tr>
<?PHP
} // end of while
}// end of else
?>
当用户单击“提交”按钮时,将提交评论信息。代码如下:
<form method=post action="Vote.php?action=save">
保存评论信息也在Vote.php页面中,根据参数action的值保存评论内容和评论分数。代码如下:
$id = $_GET["id"];
if($id=="")
exit("请选择软件");
include('Class\Votes.php');
$vt = new Votes();
if($_GET["action"]=="save") {
$content = $_POST["content"];
if($_SESSOIN["truevote"]<>$id) {
$vt->VContent = $content;
$vt->Grade = $_POST["grade"];
$vt->DId = $id;
$_SESSION["truevote"] = $id; //设置Session表示已经投票
$vt->InsertVotes();
}
else {
echo("<script>alert('对不起!你已经进行了投票!');</script>");
}
}
程序将评论信息插入数据库 Votes 表中,并将投票标志设置为当前软件编号,表示不允许对同一软件同时投票2次以上。
7.设计软件搜索页面
用户经常需要从众多软件信息中查询自己关注的内容。在系统首页左侧的软件搜索中输入软件名,然后单击“搜索”按钮,将会打开Search.php,查询软件资源,如图A17所示。
图A17 Search.php的运行界面
在Search.php页面中,程序将首先读取从top.php中传递来的数据。下拉菜单CId的值决定查询软件类别,文本域keyword的值表示查询关键字。根据CId和keyword生成SELECT语句的代码如下:
<?PHP
$dw = new DownLoad();
//取得查询条件
$uCId = $_POST["cid"];
$StrKey = $_POST["keyword"];
echo($uCId . " " . $StrKey);
//根据不同情况生成WHERE子句whereTo
if($StrKey == "") {
//没有输入要查询的条件
exit("请输入查询条件");
}
if($uCId == "") { //所有软件
//在所有的类别中,查询指定软件
$sql ="Select * From DownLoad Where DownName Like '%" . $StrKey . "%' Order By DId";
}
else {
$sql = "Select d.*,c.CName AS nCName,c1.CName AS uCName From DownLoad d,Category c,Category c1 Where d.CId=c.CId And c.UpperId=c1.CId And c.UpperId=" . $uCId . " And d.DownName Like '%" . $StrKey . "%' Order By d.DId";
}
?>
8.设计按类别查看软件页面
在系统首页的上方,有一个链接条,包括首页、软件一级类别信息等链接。可以单击任意类别的超级链接,进入按类别显示下载软件列表的页面,如图A18所示。
图A18 按类别查看软件信息
按类别查看软件资源信息的脚本是sort.php,下面介绍其主要代码。
(1)获取参数
参数Order指定排序的项目,参数updown指定排序顺序,参数cid指定显示的软件类别编号。获取参数的代码如下:
<?PHP
include('Class\DownLoad.php');
$order_name = $_GET["Order"];
if($_GET["updown"]<>"") //更改排序方向
$updown="Desc";
else
$updown="";
switch($order_name) {
Case "DownName":
$order_name="DownName"; //按软件名排序
break;
Case "IsHot":
$order_name="IsHot"; //按热度排序
break;
Case "CreateTime": //按创建时间排序
$order_name="CreateTime";
break;
Case "TotalHits": // 按点击数排序
$order_name="TotalHits";
break;
Case "Rights": // 按版权排序
$order_name="Rights";
Case "DownSize":
$order_name="DownSize"; //按软件大小排序
default:
$order_name="LastHitTime"; //按最新点击时间排序
(2)读取软件类别
在sort.php页面左侧,程序从表Category中读取和显示软件类别名称。代码如下:
<?php
$ca = new Category();
$cid = $_GET["cid"];
if($cid=="") { //下级类目编号
$nCId = "";
$uCId = "";
$uCName = "";
$nCName = "所有软件";
exit("没有选择软件类目");
}
else {
//判断当前类目编号是否为1级类目
$results = $ca->GetCategoryInfo($cid);
if($row = $results->fetch_row()) {
if($row[2]==0) { //表示一级类目
$iLevel = 1;
$uCName = $row[1];
$nCName = "所有软件";
$uCId = $row[0];
$nCId = "";
}
else {
$iLevel = 2;
$nCName = $row[1];
$nCId = $cid;
$uCId = $row[2];
//读取上级类目信息
$results1 = $ca->GetCategoryInfo($uCId);
if($row1 = $results1->fetch_row()) {
$uCName = $row[1];
}
}
}
}
......
?>
<?php
if($iLevel == 1) //一级类目
$sql = "Select * From Category Where UpperId=" . $cid;
else //二级类目
$sql = "Select * From Category Where cid=" . $cid;
$results3 = $ca->GetCDetail($sql); ?>
</FONT> <TABLE width="100%" border="0" cellspacing="0">
<?PHP while($row3 = $results3->fetch_row()) { ?>
<TR>
<TD align="right" height="21"><div align="center"><img src="IMG/into.gif"width="9" height="9"></div></td>
<TD align="left" height="21">
<A href="sort.php?cid=<?PHP echo($row3[0]); ?>"><?PHPecho($row3[1]); ?></A></TD>
</TR>
<?PHP } ?>
(3)读取软件信息
程序会根据参数cid读取指定类别中包含的软件信息,代码如下:
<?PHP
if($iLevel == 1) {
$sql ="Select d.* From DownLoad d,Category c Where IsHide=0 And d.cid=c.cid And c.UpperId=" . $cid . " Order By " . $order_name . " " . $updown;
}
else
{
$sql = "Select * From DownLoad Where cid=" . $cid . " And IsHide=0 Order By " . $order_name . " " . $updown;
}
$results4 = $dw->GetDLlist($sql);
$exist = false;
while($row4 = $results4->fetch_row()) {
$exist = true;
//下面省略显示软件信息的代码
// ......
?>