本章主要介绍了一个简单CMS系统的实现。本章中的CMS系统通过PHP代码实现了对文章内容的管理。事实上,一个完善的CMS系统要复杂得多。CMS系统不仅可以用来管理字符型数据,还可以用来管理二进制数据,例如,图片、音频和视频等。
CMS系统是PHP在实际应用中使用最多的一种类型。对本章中提供的代码进行研究和学习对创建一个网站系统很有好处。读者可以通过对本章中的设计思想的研究设计出符合需求的更复杂的CMS系统。
35.4.8 网站模板管理页面的实现
网站模板管理页面与文章管理页面类似,不同的是更新的表为templates。具体代码如下所示。
<?php require_once('Connections/conn.php'); ?>
<?php
//格式转换函数
function GetSQLValueString($theValue, $theType, $theDefinedValue = "",
$theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType)
{
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
//获得用户输入执行更新操作
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1"))
{
$updateSQL = sprintf("UPDATE templates SET template_name=%s, folder_name=%s
WHERE template_id=%s",
GetSQLValueString($_POST['template_name'], "text"),
GetSQLValueString($_POST['folder_name'], "text"),
GetSQLValueString($_POST['template_id'], "int"));
mysql_select_db($database_conn, $conn);
$Result1 = mysql_query($updateSQL, $conn) or die(mysql_error());
echo "<script>alert('模板更新成功!');</script>";
}
//获得用户输入执行插入操作
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form2"))
{
$insertSQL = sprintf("INSERT INTO templates (template_name, folder_name)
VALUES (%s, %s)",
GetSQLValueString($_POST['template_name'], "text"),
GetSQLValueString($_POST['folder_name'], "text"));
mysql_select_db($database_conn, $conn);
$Result1 = mysql_query($insertSQL, $conn) or die(mysql_error());
echo "<script>alert('模板添加成功!');</script>";
}
获得用户输入执行删除操作
if (isset($_GET["delete_id"]))
{
$deleteSQL = sprintf("DELETE FROM templates WHERE template_id=%s",
GetSQLValueString($_GET['delete_id'], "int"));
mysql_select_db($database_conn, $conn);
$Result1 = mysql_query($deleteSQL, $conn) or die(mysql_error());
echo "<script>alert('模板删除成功!');</script>";
}
mysql_select_db($database_conn, $conn); //连接数据库
$query_rs_template = "SELECT * FROM templates ORDER BY template_id ASC";
$rs_template = mysql_query($query_rs_template, $conn) or die(mysql_error()); //执行SQL语句
$row_rs_template = mysql_fetch_assoc($rs_template); //获得记录集
$totalRows_rs_template = mysql_num_rows($rs_template);
if (isset($_GET['template_id'])) //获得模板信息
{
mysql_select_db($database_conn, $conn);
$query_rs_upt = sprintf("SELECT * FROM templates WHERE template_id = %s",
$_GET['template_id']);
$rs_upt = mysql_query($query_rs_upt, $conn) or die(mysql_error());
$row_rs_upt = mysql_fetch_assoc($rs_upt);
$totalRows_rs_upt = mysql_num_rows($rs_upt);
$row_rs_upt_template_name = $row_rs_upt['template_name'];
$row_rs_upt_folder_name = $row_rs_upt['folder_name'];
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.
w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
.style1 {
font-size: 18px;
font-weight: bold;
}
.style4 {font-size: 12px}
-->
</style>
</head>
<body>
<p align="center" class="style1">模板管理</p>
<p align="center" class="style1"><span class="style4"><a href="index.php">
返回首页</a></span></p>
<table width="400" border="1" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><strong>模板名称</strong></td>
<td><strong>模板所在文件夹</strong></td>
<td> </td>
</tr>
<?php do { ?>
<tr>
<td><a href="?template_id=<?php echo $row_rs_template['template_
id']; ?>"><?php echo $row_rs_template['template_name']; ?></a></td>
<td><?php echo $row_rs_template['folder_name']; ?></td>
<td><a onClick="javascript:return confirm('确实要删除吗?')" href="?delete
_id=<?php echo $row_rs_template['template_id']; ?>">删除</a></td>
</tr>
<?php } while ($row_rs_template = mysql_fetch_assoc($rs_template)); ?>
</table>
<p> </p>
<form method="post" name="form1" action="?">
<table align="center">
<tr valign="baseline">
<td nowrap align="right">模板名称:</td>
<td><input type="text" name="template_name" value="<?php echo $row_rs_
upt_template_name; ?>" size="32"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right">文件夹名:</td>
<td><input type="text" name="folder_name" value="<?php echo $row_rs_
upt_folder_name; ?>" size="32"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right"> </td>
<td><input type="submit" value="更新模板"></td>
</tr>
</table>
<input type="hidden" name="MM_update" value="form1">
<input type="hidden" name="template_id" value="<?php echo $row_rs_upt
['template_id']; ?>">
</form>
<p> </p>
<form method="post" name="form2" action="?">
<table align="center">
<tr valign="baseline">
<td nowrap align="right">模板名称:</td>
<td><input type="text" name="template_name" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right">文件夹名:</td>
<td><input type="text" name="folder_name" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right"> </td>
<td><input type="submit" value="新建模板"></td>
</tr>
</table>
<input type="hidden" name="MM_insert" value="form2">
</form>
<p> </p>
</body>
</html>
<?php
mysql_free_result($rs_template);
if (isset($_GET['template_id'])) {
mysql_free_result($rs_upt);
}
?>
运行结果如图35-14所示。
图35-14 模板管理页面
35.4.9 退出登录页面的实现
退出登录页面用于清除实现登录时注册的Session,具体代码如下所示。
<?php
$logoutGoTo = "index.php";
session_start();
unset($_SESSION['MM_Username']); //删除Session内容
unset($_SESSION['MM_UserGroup']);
header("Location: $logoutGoTo"); //跳转页面
session_unregister('MM_Username'); //注销Session
session_unregister('MM_UserGroup');
?>
35.4 页面代码设计
本节将通过对CMS中的一些主要页面的设计来说明该系统的具体实现。
35.4.1 首页的实现
网站的首页HTML代码存放在模板文件中,代码如下所示。
<!-- 模板文件:templates/default/index.inc.php -->
<html>
<head>
<title>欢迎<?php echo $_SESSION['MM_Username']; ?>使用
<?php echo $row_rs_config['website_name']; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
.style1 {
font-size: 18px;
font-weight: bold;
}
-->
</style>
</head>
<body>
<div align="center">
<p class="style1">欢迎<?php echo $_SESSION['MM_Username']; ?>使用
<?php echo $row_rs_config['website_name']; ?></p>
<HR>
<table width="900" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="207" align="left" valign="top"><?php do { ?>
- <a href="list.php?type_id=<?php echo $row_rs_types['type_id']; ?>">
<?php echo $row_rs_types['type_name']; ?></a><BR>
<?php } while ($row_rs_types = mysql_fetch_assoc($rs_types)); ?> </td>
<td width="501" align="left"><?php do { ?>
* <a href="show.php?article_id=<?php echo $row_rs_articles ['article_
id']; ?>">
<?php echo $row_rs_articles['title']; ?></a>(<?php echo $row_rs_articles
['author']; ?>|
<?php echo $row_rs_articles['last_upt_time']; ?>) <BR>
<?php } while ($row_rs_articles = mysql_fetch_assoc($rs_articles)); ?> </td>
<td width="192" valign="top">
<?php
if(!isset($_SESSION['MM_Username'])) {
?> <form name="form1" method="POST" action="<?php echo $loginFormAction; ?>">
<p align="center">登录</p>
<table width="200" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>用户名</td>
<td><input name="username" type="text" id="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input name="password" type="password" id="password"></td>
</tr>
</table>
<p align="center">
<input type="submit" name="Submit" value="Submit">
<input type="reset" name="Submit2" value="Reset">
</p>
</form><BR>
<P><a href='reg.php'>注册新用户</a></P>
<?php
} elseif($_SESSION['MM_UserGroup']=='user') {
?>
<a href="send.php">文章投稿</a><BR>
<a href="logout.php">退出登录</a>
<?php
} elseif($_SESSION['MM_UserGroup']=='admin') {
?>
<a href="admin_addnew.php">添加新文章</a><BR>
<a href="admin_list.php">文章管理</a><BR>
<a href="admin_typemanage.php">文章类别维护</a><BR>
<a href="admin_config.php">网站参数配置</a><BR>
<a href="admin_templatemanage.php">网站模板管理</a><BR>
<a href="logout.php">退出登录</a>
<?php
}
?> </td>
</tr>
</table>
<HR>
<p><?php echo $row_rs_config['copyright']; ?></p>
</div>
</body>
</html>
用于读取数据库和调用模板的流程如图35-2所示。
图35-2 读取数据库和调用模板的流程
PHP代码如下所示。
<!-- 首页文件:index.php -->
<?php require_once('Connections/conn.php'); ?>
<?php
//分页的计算
$maxRows_rs_articles = 20; //每页显示记录数
$pageNum_rs_articles = 0; //初始化页码编号
if (isset($_GET['pageNum_rs_articles'])) //获取当前页码
{
$pageNum_rs_articles = $_GET['pageNum_rs_articles'];
}
$startRow_rs_articles = $pageNum_rs_articles * $maxRows_rs_articles; //计算起始记录数
//读取文章信息
mysql_select_db($database_conn, $conn);
$query_rs_articles = "SELECT * FROM articles WHERE checked_indc=1 ORDER BY
last_upt_time DESC";
$query_limit_rs_articles = sprintf("%s LIMIT %d, %d", $query_rs_articles,
$startRow_rs_articles, $maxRows_rs_articles);
$rs_articles = mysql_query($query_limit_rs_articles, $conn) or die(mysql_error());
$row_rs_articles = mysql_fetch_assoc($rs_articles);
//设定分页页码
if (isset($_GET['totalRows_rs_articles'])) //如果参数中存在总记录数则获取
{
$totalRows_rs_articles = $_GET['totalRows_rs_articles'];
}
else //否则执行SQL语句计算
{
$all_rs_articles = mysql_query($query_rs_articles);
$totalRows_rs_articles = mysql_num_rows($all_rs_articles);
}
$totalPages_rs_articles = ceil($totalRows_rs_articles/$maxRows_rs_ articles)-1; //计算总页数
//读取文章类别信息
mysql_select_db($database_conn, $conn);
$query_rs_types = "SELECT * FROM types ORDER BY type_id ASC";
$rs_types = mysql_query($query_rs_types, $conn) or die(mysql_error());
$row_rs_types = mysql_fetch_assoc($rs_types);
$totalRows_rs_types = mysql_num_rows($rs_types);
//读取网站配置信息
mysql_select_db($database_conn, $conn);
$query_rs_config = "SELECT * FROM config, templates WHERE config.template_
id=templates.template_id";
$rs_config = mysql_query($query_rs_config, $conn) or die(mysql_error());
$row_rs_config = mysql_fetch_assoc($rs_config);
$totalRows_rs_config = mysql_num_rows($rs_config);
//验证用户权限
session_start();
$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($accesscheck)) //检查是否已经登录
{
$GLOBALS['PrevUrl'] = $accesscheck;
session_register('PrevUrl');
}
//获取用户登录信息
if (isset($_POST['username'])) //如果用户输入了用户名
{
$loginUsername=$_POST['username']; //获得用户输入的用户名
$password=$_POST['password']; //获得用户输入的密码
$MM_fldUserAuthorization = "userflag"; //定义用户等级列
$MM_redirectLoginSuccess = "index.php"; //定义登录成功页面
$MM_redirectLoginFailed = "index.php"; //定义登录失败页面
mysql_select_db($database_conn, $conn); //连接数据库
$LoginRS__query=sprintf("SELECT username, password, userflag FROM users
WHERE username='%s' AND password='%s'", //定义SQL语句
get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername),
get_magic_quotes_gpc() ? $password : addslashes($password));
$LoginRS = mysql_query($LoginRS__query, $conn) or die(mysql_error()); //执行SQL语句
$loginFoundUser = mysql_num_rows($LoginRS); //获得用户数
//如果登录成功,则检查当前登录是否开启。如果用户级别不是管理用户并且网站登录已经关闭,也
不允许登录
if ($loginFoundUser)
{
$loginStrGroup = mysql_result($LoginRS,0,'userflag');
if($loginStrGroup!='admin' && $row_rs_config['login_indc']==0) {
die("网站登录已经关闭");
}
//定义存放用户信息的Session
$GLOBALS['MM_Username'] = $loginUsername;
$GLOBALS['MM_UserGroup'] = $loginStrGroup;
session_register("MM_Username");
session_register("MM_UserGroup");
//登录后的页面跳转
if (isset($_SESSION['PrevUrl']) && false)
{
$MM_redirectLoginSuccess = $_SESSION['PrevUrl'];
}
header("Location: " . $MM_redirectLoginSuccess );
}
else //如果没有输入用户名
{
header("Location: ". $MM_redirectLoginFailed );
}
}
//检查网站是否关闭
if($row_rs_config['available_indc']==0)
{
die("网站维护中 - 暂时无法访问");
}
//调用模板文件
include('templates\\'.$row_rs_config['folder_name'].'\\index.inc.php');
//关闭数据库连接
mysql_free_result($rs_articles);
mysql_free_result($rs_types);
mysql_free_result($rs_config);
?>
运行效果如图35-3所示。
图35-3 CMS首页
35.4.2 注册页面的实现
注册页面实际上就是对users表添加记录。需要注意的是注册页面往往需要验证用户两次输入的密码是否相同,其流程如图35-4所示。
图35-4 用户注册流程
具体代码如下所示。
<!-- 注册页面文件:reg.php -->
<?php require_once('Connections/conn.php'); ?>
<?php
//连接数据库
mysql_select_db($database_conn, $conn);
$query_rs_config = "SELECT * FROM config, templates WHERE config.template_
id=templates.template_id";
$rs_config = mysql_query($query_rs_config, $conn) or die(mysql_error());
$row_rs_config = mysql_fetch_assoc($rs_config);
$totalRows_rs_config = mysql_num_rows($rs_config);
//文本字符串转换
function GetSQLValueString($theValue, $theType, $theDefinedValue = "",
$theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType)
{
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
}
return $theValue;
}
//两次密码输入确认
if($_POST['password'] != $_POST['password_cfm']) {
echo "<script>alert('错误:两次密码输入不一致!');</script>";
}
//插入用户信息
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1") &&
($_POST['password'] == $_POST['password_cfm'])) //检查表单的有效性
{
$insertSQL = sprintf("INSERT INTO users (username, password, userflag,
last_upt_id) VALUES (%s, %s, 'user', %s)", //准备SQL语句
GetSQLValueString($_POST['username'], "text"),
GetSQLValueString($_POST['password'], "text"),
GetSQLValueString($_POST['username'], "text"));
mysql_select_db($database_conn, $conn); //连接数据库
$Result1 = mysql_query($insertSQL, $conn) or die(mysql_error()); //执行SQL语句
$insertGoTo = "index.php"; //首页文件
if (isset($_SERVER['QUERY_STRING'])) //读取当前参数
{
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo)); //跳转页面到首页
}
//检查网站是否关闭
if($row_rs_config['available_indc']==0) {
die("网站维护中 - 暂时无法访问");
}
if($row_rs_config['reg_indc']==0) {
die("网站注册已经关闭");
}
//调用模板文件
include('templates\\'.$row_rs_config['folder_name'].'\\reg.inc.php');
//关闭数据库连接
mysql_free_result($rs_config);
?>
运行结果如图35-5所示。
图35-5 注册新用户
35.4.3 分类文章列表页面与文章显示页面的实现
分类文章列表页面允许用户通过选择一个文章类别来获得该类别下的全部文章列表。该页面需要获取从浏览器地址栏传入的参数type_id,然后执行相应的SQL语句来获得数据。其流程如图35-6所示。
图35-6 分类文章列表页面与文章显示页面的流程
具体代码如下所示。
<!-- 分类文章列表页面文件:list.php -->
<?php require_once('Connections/conn.php'); ?>
<?php
$currentPage = $_SERVER["PHP_SELF"];
//设置默认的type_id为1,并获取传入的参数
$colname_rs_type = "1";
if (isset($_GET['type_id'])) {
$colname_rs_type = (get_magic_quotes_gpc()) ? $_GET['type_id'] : addslashes
($_GET['type_id']);
}
//连接数据库,获取类别信息
mysql_select_db($database_conn, $conn);
$query_rs_type = sprintf("SELECT * FROM types WHERE type_id = %s", $colname_ rs_type);
$rs_type = mysql_query($query_rs_type, $conn) or die(mysql_error());
$row_rs_type = mysql_fetch_assoc($rs_type);
$totalRows_rs_type = mysql_num_rows($rs_type);
//分页的设置
$maxRows_rs_articles = 10;
$pageNum_rs_articles = 0;
if (isset($_GET['pageNum_rs_articles'])) {
$pageNum_rs_articles = $_GET['pageNum_rs_articles'];
}
$startRow_rs_articles = $pageNum_rs_articles * $maxRows_rs_articles;
//连接数据库,获取文章内容
$colname_rs_articles = "1";
if (isset($_GET['type_id'])) {
$colname_rs_articles = (get_magic_quotes_gpc()) ? $_GET['type_id'] :
addslashes($_GET['type_id']);
}
mysql_select_db($database_conn, $conn);
$query_rs_articles = sprintf("SELECT * FROM articles WHERE checked_indc=1 AND
type_id = %s ORDER BY last_upt_time DESC", $colname_rs_articles);
$query_limit_rs_articles = sprintf("%s LIMIT %d, %d", $query_rs_articles,
$startRow_rs_articles, $maxRows_rs_articles);
$rs_articles=mysql_query($query_limit_rs_articles,$conn)or die(mysql_error());
$row_rs_articles = mysql_fetch_assoc($rs_articles);
//获得分页信息
if (isset($_GET['totalRows_rs_articles'])) {
$totalRows_rs_articles = $_GET['totalRows_rs_articles'];
} else {
$all_rs_articles = mysql_query($query_rs_articles);
$totalRows_rs_articles = mysql_num_rows($all_rs_articles);
}
$totalPages_rs_articles = ceil($totalRows_rs_articles/$maxRows_rs_ articles)-1;
//获得模板信息
mysql_select_db($database_conn, $conn);
$query_rs_config = "SELECT * FROM config, templates WHERE config.template_id
=templates.template_id";
$rs_config = mysql_query($query_rs_config, $conn) or die(mysql_error());
$row_rs_config = mysql_fetch_assoc($rs_config);
$totalRows_rs_config = mysql_num_rows($rs_config);
//构建SQL语句
$queryString_rs_articles = "";
if (!empty($_SERVER['QUERY_STRING'])) {
$params = explode("&", $_SERVER['QUERY_STRING']);
$newParams = array();
foreach ($params as $param) {
if (stristr($param, "pageNum_rs_articles") == false &&
stristr($param, "totalRows_rs_articles") == false) {
array_push($newParams, $param);
}
}
if (count($newParams) != 0) {
$queryString_rs_articles = "&" . htmlentities(implode("&", $newParams));
}
}
$queryString_rs_articles = sprintf("&totalRows_rs_articles=%d%s",
$totalRows_rs_articles, $queryString_rs_articles);
//检查网站是否可用
if($row_rs_config['available_indc']==0) {
die("网站维护中 - 暂时无法访问");
}
//调用模板文件
include('templates\\'.$row_rs_config['folder_name'].'\\list.inc.php');
//关闭数据库连接
mysql_free_result($rs_type);
mysql_free_result($rs_articles);
mysql_free_result($rs_config);
?>
运行结果如图35-7所示。
图35-7 文章分类页面
文章显示页面的实现与文章分类页面类似,通过获得传入的参数article_id来获取文章内容。具体代码如下所示。
<?php require_once('Connections/conn.php'); ?>
<?php
//获得参数
$colname_rs_article = "1";
if (isset($_GET['article_id'])) {
$colname_rs_article = (get_magic_quotes_gpc()) ? $_GET['article_id'] :
addslashes($_GET['article_id']);
}
//查询文章内容
mysql_select_db($database_conn, $conn);
$query_rs_article = sprintf("SELECT * FROM articles, types WHERE checked _indc=1
AND article_id = %s AND articles.type_id = types.type_id", $colname_ rs_article);
$rs_article = mysql_query($query_rs_article, $conn) or die(mysql_error());
$row_rs_article = mysql_fetch_assoc($rs_article);
$totalRows_rs_article = mysql_num_rows($rs_article);
//查询网站配置信息
mysql_select_db($database_conn, $conn);
$query_rs_config = "SELECT * FROM config, templates WHERE config.template_id
=templates.template_id";
$rs_config = mysql_query($query_rs_config, $conn) or die(mysql_error());
$row_rs_config = mysql_fetch_assoc($rs_config);
$totalRows_rs_config = mysql_num_rows($rs_config);
//检查网站是否开启
if($row_rs_config['available_indc']==0) {
die("网站维护中 - 暂时无法访问");
}
//HTML转换函数
function conv($Text) {
$Text=htmlspecialchars($Text); //转换HTML关键字符
$Text=nl2br($Text); //转换换行符
return $Text;
}
include('templates\\'.$row_rs_config['folder_name'].'\\show.inc.php'); //调用模板文件
//关闭数据库连接
mysql_free_result($rs_article);
mysql_free_result($rs_config);
?>
运行结果如图35-8所示。
posted on 2009-12-15 21:34
Documents 阅读(486)
评论(0) 编辑 收藏 所属分类:
php 、
CMS