10.5 新闻发布系统系统实施
设计阶段完成后,在将系统移交给用户前的一系列活动叫做系统实施。新闻发布系统涉及新闻管理、评论管理、类别管理和用户管理等功能,这里以新闻管理和评论管理为例着重介绍这两个功能的实施过程。
10.5.1 文件组织结构
在“C:\wamp\www”目录下创建“news”目录,在“news”目录下创建如图10-18所示的目录或文件。
10.5.2 数据库的实施
在“C:\wamp\www\news”目录下创建news.sql脚本文件,news.sql脚本文件首先设置存储引擎为InnoDB,然后设置字符集为gbk,接着创建news数据库,并在该数据库中创建category表、users表、news表和review表。SQL语句如下。
set table_type=InnoDB;
show variables like 'table_type';
SET character_set_client = gbk ;
SET character_set_connection = gbk ;
SET character_set_database = gbk ;
SET character_set_results = gbk ;
SET character_set_server = gbk ;
SET collation_connection = gbk_chinese_ci ;
SET collation_database = gbk_chinese_ci ;
SET collation_server = gbk_chinese_ci ;
show variables like 'character%';
show variables like 'collation%';
create database news;
use news;
create table category(
category_id int auto_increment primary key,
name char(20) not null
);
create table users(
user_id int auto_increment primary key,
name char(20) not null,
password char(32)
);
create table news(
news_id int auto_increment primary key,
user_id int,
category_id int,
title char(100) not null,
content text,
publish_time datetime,
clicked int,
attachment char(100),
constraint FK_news_user foreign key (user_id) references users(user_id),
constraint FK_news_category foreign key (category_id) references category(category_id)
);
create table review(
review_id int auto_increment primary key,
news_id int,
content text,
publish_time datetime,
state char(10),
ip char(15),
constraint FK_review_news foreign key (news_id) references news(news_id)
);
在MySQl Console命令窗口中输入命令“\. C:\wamp\www\news\news.sql”运行news.sql脚本文件中的SQL语句,创建新闻发布系统所需的数据库及数据库表。
10.5.3 新闻管理和评论管理功能的实施
新闻管理和评论管理是新闻发布系统的核心功能,下面以新闻管理和评论管理为例详细讲解这两个功能的实施步骤。
(1)制作MySQL服务器连接函数和文件上传函数。
在“C:\wamp\www\news\functions”目录下创建 database.php 文件,database.php 程序用于实现MySQL服务器连接的开启和关闭。database.php代码如下。
<?php
$database_connection = null;
function get_connection(){
$hostname = "localhost"; //数据库服务器主机名,可以用IP代替
$database = "news"; //数据库名
$username = "root"; //数据库服务器用户名
$password = ""; //数据库服务器密码
global $database_connection;
$database_connection = @mysql_connect($hostname, $username, $password) ordie(mysql_error()); //连接数据库服务器
mysql_query("set names 'gbk'"); //设置字符集
@mysql_select_db($database, $database_connection) or die(mysql_error());
}
function close_connection(){
global $database_connection;
if($database_connection){
mysql_close($database_connection) or die(mysql_error());
}
}
?>
(2)向数据库中添加测试数据的程序init.php。
在“C:\wamp\www\news\”目录下创建init.php文件,init.php程序负责向用户表users中添加一个管理员用户(用户名为admin、密码为admin的两次md5加密),向新闻类别category表中添加娱乐和财经类别。init.php代码如下。
<?php
include_once("functions/database.php");
get_connection();
//添加新闻类别
mysql_query("insert into category values(null,'娱乐')");
mysql_query("insert into category values(null,'财经')");
//添加管理员用户admin,密码admin经过MD5函数双重加密
$password = md5(md5("admin"));
mysql_query("insert into users values(null,'admin','$password')");
close_connection();
echo "成功添加初始化数据";
?>
打开浏览器,在地址栏中输入“http://localhost/news/init.php”,运行init.php页面后users表以及category表中将添加特定的记录信息。
(3)创建新闻添加页面news_add.php。
在“C:\wamp\www\news\”目录下创建news_add.php文件,在该文件中添加form表单为浏览器用户提供输入数据的界面,news_add.php代码如下。
<form action="news_save.php" method="post" enctype="multipart/form-data">
标题:<input type="text" size="60" name="title"><br/>
内容:<textarea cols="60" rows="16" name="content"></textarea><br/>
类别:
<select name="category_id" size="1">
<?php
include_once("functions/database.php");
get_connection();
$result_set = mysql_query("select * from category");
close_connection();
while($row = mysql_fetch_array($result_set)){
?>
<option value="<?php echo $row['category_id'];?>"><?php echo $row['name'];?></option>
<?php
}
?>
</select><br/>
附件:<input type="file" name="news_file" size="50">
<input type="hidden" name="MAX_FILE_SIZE" value="10485760">
<br/>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
由于新闻的类别信息保存在数据库表category中,粗体字代码的功能是:从数据库表category中提取“类别”数据,然后生成新闻类别下拉选择框。
(4)创建文件管理页面file_system.php。
在“C:\wamp\www\news\functions”目录下创建file_system.php文件,file_system.php文件中提供了实现文件上传功能upload()函数和下载功能download()函数。先在file_system.php文件中编写文件上传函数upload(),file_system.php代码如下。
<?php
function upload($file,$file_path){
$error = $file['error'];
switch ($error){
case 0:
$file_name = $file['name'];
$file_temp = $file['tmp_name'];
$destination = $file_path."/".$file_name;
move_uploaded_file($file_temp,$destination);
return "文件上传成功!";
case 1:
return "上传附件超过了php.ini中upload_max_filesize选项限制的值!";
case 2:
return "上传附件的大小超过了form表单MAX_FILE_SIZE选项指定的值!";
case 3:
return "附件只有部分被上传!";
case 4:
return "没有选择上传附件!";
}
}
?>
(5)创建新闻信息保存页面news_save.php。
在“C:\wamp\www\news\”目录下创建news_save.php文件,该程序实现的功能依次为:采集新闻的标题和内容信息;设置新闻的发布时间为WEB服务器时间;设置新闻的浏览次数为0;设置新闻的发布者ID为1;上传新闻附件到uploads目录;附件上传成功后将新闻信息添加到数据库表中;将页面重定向到新闻标题列表页面news_list.php,并向news_list.php页面传递附件上传消息。news_save.php代码如下。
<?php
include_once("functions/file_system.php");
if(empty($_POST)){
$message = "上传的文件超过了php.ini中post_max_size选项限制的值";
}else{
$user_id = 1;
$category_id = $_POST["category_id"];
$title = $_POST["title"];
$content = $_POST["content"];
$currentDate = date("Y-m-d H:i:s");
$clicked = 0;
$file_name = $_FILES["news_file"]["name"];
$message = upload($_FILES["news_file"],"uploads");
$sql = "insert into news
values(null,$user_id,$category_id,'$title','$content', '$currentDate',$clicked,'$file_name')";
if($message=="文件上传成功!"||$message=="没有选择上传附件!"){
include_once("functions/database.php");
get_connection();
mysql_query($sql);
close_connection();
}
}
header("Location:news_list.php?message=$message");
?>
程序news_save.php中使用到了header("Location:URL")函数的重定向功能。
(6)创建新闻标题列表显示页面news_list.php。
在“C:\wamp\www\news\”目录下创建 news_list.php 文件,该程序实现的功能依次为:显示文件上传的状态信息;提供一个新闻模糊查询的 form 表单;按照新闻发布时间降序显示新闻的标题以及编辑和删除超链接;当单击新闻标题的超级链接时进入新闻详细信息页面news_detail.php,查看新闻详细信息;当单击编辑超链接时进入新闻编辑页面news_edit.php,实现对新闻的编辑;当点击删除超链接时进入新闻删除页面 news_delete.php,实现对新闻信息的删除。news_list.php代码如下。
<?php
include_once("functions/database.php");
//显示文件上传的状态信息
if(isset($_GET["message"])){
echo $_GET["message"]."<br/>";
}
//构造查询所有新闻的SQL语句
$search_sql = "select * from news order by news_id desc";
//若进行模糊查询,取得模糊查询的关键字keyword
$keyword = "";
if(isset($_GET["keyword"])){
$keyword = $_GET["keyword"];
//构造模糊查询新闻的SQL语句
$search_sql = "select * from news where title like '%$keyword%' or content like '%$keyword%' order by news_id desc";
}
//提供进行模糊查询的form表单
?>
<form action="news_list.php" method="get">
请输入关键字:<input type="text" name="keyword" value="<?php echo $keyword?>">
<input type="submit" value="搜索">
</form>
<br/>
<table>
<?php
get_connection();
$result_set = mysql_query($search_sql);
close_connection();
if(mysql_num_rows($result_set)==0){
exit("暂无记录!");
}
while($row = mysql_fetch_array($result_set)){
?>
<tr>
<td>
<a href="news_detail.php?news_id=<?php echo $row['news_id']?>"><?php echo $row['title']?></a>
</td>
<td>
<a href="news_edit.php?news_id=<?php echo $row['news_id']?>">编辑</a>
</td>
<td>
<a href="news_delete.php?news_id=<?php echo $row['news_id']?>">删除</a>
</td>
</tr>
<?php
}
?>
</table>
在浏览器地址栏中输入“http://localhost/news/news/news_add.php”打开news_add.php页面,然后在该页面中填写测试数据,如图10-19所示。单击news_add.php页面中的“提交”按钮,页面被重定向到news_list.php程序,该程序的运行结果如图10-20所示。
news_list.php程序说明如下。
① 程序 news_list.php 存在两个入口:直接打开浏览器并在浏览器地址栏中输入“http://localhost/news/news/news_list.php”时可以访问news_list.php页面;新闻信息添加成功后也可以由news_save.php页面重定向到news_list.php页面。
② 在图10-20中的关键字表单中输入关键字,单击“搜索”按钮后,触发news_list.php的模糊查询功能。
(7)创建新闻信息的编辑页面news_edit.php。
在“C:\wamp\www\news\”目录下创建news_edit.php文件,该程序实现的功能是:当单击新闻标题列表页面news_list.php中的“编辑”超链接时,news_edit.php页面从数据库中查询指定新闻的详细信息并显示在编辑页面news_edit.php中,新闻内容进入编辑状态。news_edit.php代码如下。
<?php
include_once("functions/database.php");
$news_id = $_GET["news_id"];
get_connection();
$result_news = mysql_query("select * from news where news_id=$news_id");
$result_category = mysql_query("select * from category");
close_connection();
$news = mysql_fetch_array($result_news);
?>
<form action="news_update.php" method="post">
标题:<input type="text" size="60" name="title" value="<?php echo $news['title']?>"><br/>
内容:<textarea cols="60" rows="16" name="content"><?php echo $news['content']?></textarea><br/>
类别:<select name="category_id" size="1">
<?php
while($category = mysql_fetch_array($result_category)){
?>
<option value="<?php echo $category['category_id'];?>" <?php echo ($news ['category_id']==$category['category_id'])?"selected":""?>><?php echo $category ['name'];?></option>
<?php
}
?>
</select><br/>
<br/>
<input type="hidden" name="news_id" value="<?php echo $news_id?>">
<input type="submit" value="修改">
</form>
说明:程序news_edit.php中使用条件运算符(exp1) ? (exp2) : (exp3)实现了下拉选择框的默认选中状态(见粗体字部分代码)。
(8)创建新闻信息的修改页面news_update.php。
在“C:\wamp\www\news\”目录下创建 news_update.php 文件,该程序实现的功能是:单击news_edit.php页面的“修改”按钮时,修改指定新闻的信息,然后将页面重定向到news_list.php页面,并向news_list.php页面传递“新闻信息修改成功!”信息。news_update.php代码如下。
<?php
include_once("functions/database.php");
$news_id = $_POST["news_id"];
$category_id = $_POST["category_id"];
$title = $_POST["title"];
$content = $_POST["content"];
$sql = "update news set category_id=$category_id,title='$title',content='$content' where news_id=$news_id";
get_connection();
mysql_query($sql);
close_connection();
$message = "新闻信息修改成功!";
header("Location:news_list.php?message=$message");
?>
此时news_list.php页面又多了一个入口:可以从news_update.php页面重定向到news_list.php页面。
(9)创建新闻信息的删除页面news_delete.php。
在“C:\wamp\www\news\”目录下创建 news_delete.php 文件,该页面实现的功能是:单击news_list.php页面的“删除”超链接时,从数据库中删除指定新闻然后重定向到新闻标题列表页面news_list.php,并向news_list.php页面传递“新闻信息删除成功!”消息。news_delete.php代码如下。
<?php
include_once("functions/database.php");
$news_id = $_GET["news_id"];
get_connection();
mysql_query("delete from review where news_id=$news_id");
mysql_query("delete from news where news_id=$news_id");
close_connection();
$message = "新闻及相关评论信息删除成功!";
header("Location:news_list.php?message=$message");
?>
此时news_list.php页面又多了一个入口:可以从news_delete.php页面重定向到news_list.php页面。在删除新闻信息的过程中,若该新闻存在评论信息,由于新闻表news和评论表review之间的外键约束关系,该新闻将删除失败。因此若想成功删除新闻信息,建议先删除新闻的所有评论,然后再删除该新闻信息。
(10)创建查看新闻详细信息页面news_detail.php。
打开新闻标题列表显示页面news_list.php后,单击新闻标题的超级链接后可以查看该新闻的详细信息。在“C:\wamp\www\news\”目录下创建 news_detail.php 文件,该程序实现的功能依次为:将该新闻的浏览次数加1;显示该新闻详细信息(标题、内容、发布者、类别等信息);该新闻若有“已审核”评论则显示“共有**条评论”的超链接,否则显示“暂无评论”;提供“添加评论”的form表单供浏览器用户为该新闻发表评论。news_detail.php代码如下。
<?php
include_once("functions/database.php");
$news_id = $_GET["news_id"];
//构造3条SQL语句
$sql_news_update = "update news set clicked=clicked+1 where news_id=$news_id";
$sql_news_detail = "select * from news where news_id=$news_id";
$sql_review_query = "select * from review where news_id=$news_id and state='已审核'";
//执行3条SQL语句
get_connection();
mysql_query($sql_news_update);
$result_news = mysql_query($sql_news_detail);
$result_review = mysql_query($sql_review_query);
//取出结果集中新闻条数
$count_news = mysql_numRows($result_news);
//取出结果集中该新闻"已审核"的评论条数
$count_review = mysql_numRows($result_review);
if($count_news==0){
echo "该新闻不存在或已被删除!";
exit;
}
//根据新闻信息中的user_id查询对应的用户信息
$news = mysql_fetch_array($result_news);
$user_id = $news["user_id"];
$sql_user = "select * from users where user_id=$user_id";
$result_user = mysql_query($sql_user);
$user = mysql_fetch_array($result_user);
//根据新闻信息中的category_id查询对应的新闻类别信息
$category_id = $news["category_id"];
$sql_category = "select * from category where category_id=$category_id";
$result_category = mysql_query($sql_category);
$category = mysql_fetch_array($result_category);
close_connection();
mysql_free_result($result_user);
mysql_free_result($result_category);
mysql_free_result($result_news);
mysql_free_result($result_review);
//显示新闻详细信息
?>
<table>
<tr><td width="80">标题:</td><td><?php echo $news['title'];?></td></tr>
<tr><td width="80">内容:</td><td><?php echo $news['content'];?></td></tr>
<tr><td width="80"> 附 件 : </td><td><a href="download.php?attachment=<?php echo $news['attachment'];?>"><?php echo $news['attachment'];?></a></td></tr>
<tr><td width="80">发布者:</td><td><?php echo $user['name'];?></td></tr>
<tr><td width="80">类别:</td><td><?php echo $category['name'];?></td></tr>
<tr><td width="80">发布时间:</td><td><?php echo $news['publish_time'];?></td></tr>
<tr><td width="80">点击次数:</td><td><?php echo $news['clicked'];?></td></tr>
</table>
<?php
//显示查看评论超链接
if($count_review>0){
echo "<a href='review_news_list.php?news_id=".$news['news_id']."'> 共 有".$count_review."条评论</a><br/>";
}else{
echo "该新闻暂无评论!<br/>";
}
?>
<br/>
<form action="review_save.php" method="post">
添加评论:<textarea name="content" cols="50" rows="5"></textarea><br/>
<input type="hidden" name="news_id" value="<?php echo $news['news_id'];?>">
<input type="submit" value="评论">
</form>
(11)制作文件下载函数download()。
由于文件下载是WEB系统中较为常用的功能,有必要将下载功能的PHP代码封装成函数。在“C:\wamp\www\news\functions”目录的file_system.php文件中添加download()函数,该函数完成的功能是下载存放在目录$file_dir中文件名为$file_name的文件。download()函数的代码如下。
function download($file_dir,$file_name){
if (!file_exists($file_dir.$file_name)) { //检查文件是否存在
exit("文件不存在或已删除");
} else {
$file = fopen($file_dir.$file_name,"r"); // 打开文件
//强迫浏览器显示保存对话框,并提供一个推荐的文件名
header("Content-Disposition: attachment; filename=".$file_name);
// 输出文件内容
echo fread($file,filesize($file_dir.$file_name));
fclose($file);
exit;
}
}
(12)文件下载功能的实现。
在“C:\wamp\www\news”目录下创建 download.php 文件,download.php 程序负责下载服务器“/news/uploads/”目录下的某个文件。当单击查看新闻详细信息news_detail.php页面的“附件名”超链接时,下载该文件到本地机。download.php代码如下。
<?php
include_once("functions/file_system.php");
$file_name = $_GET["attachment"];
download("uploads/","$file_name");
?>
(13)创建保存新闻评论页面review_save.php。
在“C:\wamp\www\news\”目录下创建review_save.php文件,该程序实现的功能是:普通用户在news_detail.php页面中输入指定新闻的评论信息,单击“评论”按钮后,review_save.php程序负责将该新闻的评论信息添加到数据库表review中,然后将页面重定向到news_list.php页面,并向news_list.php页面传递“该新闻的评论信息成功添加到数据库表中!”消息。review_save.php代码如下。
<?php
include_once("functions/database.php");
$news_id = $_POST["news_id"];
$content = $_POST["content"];
$currentDate = date("Y-m-d H:i:s");
$ip = $_SERVER["REMOTE_ADDR"];
$state = "未审核";
$sql = "insert into review values(null,$news_id,'$content','$currentDate','$state','$ip')";
get_connection();
mysql_query($sql);
close_connection();
$message = "该新闻的评论信息成功添加到数据库表中!";
header("Location:news_list.php?message=$message");
?>
(14)创建查看所有评论信息页面review_list.php。
在“C:\wamp\www\news\”目录下创建review_list.php文件,review_list.php程序实现的功能是:将数据库中所有评论信息显示出来(评论信息按review_id倒序排列),并为每条“未审核”的评论提供“删除”和“审核”超链接。review_list.php代码如下。
<?php
include_once("functions/database.php");
$sql = "select * from review order by review_id desc";
get_connection();
$result_set = mysql_query($sql);
close_connection();
echo "系统所有评论信息如下:<br/>";
while($row = mysql_fetch_array($result_set)){
echo "评论内容:".$row["content"]."<br/>";
echo "日期:".$row["publish_time"]." ";
echo "IP地址:".$row["ip"]." ";
echo "状态:".$row["state"]."<br/>";
echo "<a href='review_delete.php?review_id=".$row["review_id"]."'>删除</a>";
echo " ";
if($row["state"]=="未审核"){
echo "<a href='review_verify.php?review_id=".$row["review_id"]."'>审核</a>";
}
echo "<hr/>";
}
?>
(15)创建评论的审核页面review_verify.php。
在“C:\wamp\www\news\”目录下创建 review_verify.php 文件,该程序实现的功能是:将指定的新闻评论从“未审核”状态修改为“已审核”状态,然后将页面重定向到 review_list.php 页面,重新显示新闻发布系统所有评论信息。review_verify.php代码如下。
<?php
include_once("functions/database.php");
$review_id = $_GET["review_id"];
$sql = "update review set state='已审核' where review_id=$review_id";
get_connection();
mysql_query($sql);
close_connection();
header("Location:review_list.php");
?>
(16)创建显示指定新闻的评论列表页面review_news_list.php。
在“C:\wamp\www\news\”目录下创建review_news_list.php文件,该程序的功能是显示指定新闻的所有“已审核”评论。当单击新闻详细信息页面news_detail.php中的“共有**条评论”超链接时,显示该新闻所有“已审核”的评论信息,评论信息按 review_id 倒序排列。review_news_list.php代码如下。
<?php
include_once("functions/database.php");
$news_id = $_GET["news_id"];
$sql = "select * from review where news_id=$news_id and state='已审核' order by review_id desc";
get_connection();
$result_set = mysql_query($sql);
close_connection();
echo "该新闻的评论如下:<br/>";
while($row = mysql_fetch_array($result_set)){
echo "评论内容:".$row["content"]."<br/>";
echo "评论日期:".$row["publish_time"]."<br/>";
echo "评论IP地址:".$row["ip"]."<hr/>";
}
?>
(17)创建删除评论页面review_delete.php。
在“C:\wamp\www\news\”目录下创建 review_delete.php 文件,该程序实现的功能是:将指定的新闻评论从数据库表中删除,然后将页面重定向到review_list.php页面,显示所有评论信息。review_delete.php代码如下。
<?php
include_once("../functions/database.php");
$review_id = $_GET["review_id"];
$sql = "delete from review where review_id=$review_id";
get_connection();
$result_set = mysql_query($sql);
close_connection();
header("Location:review_list.php");
?>
至此,新闻发布系统有关新闻管理和评论管理等基本功能已经实现。
共有条评论 网友评论