发布于 5年前
PHP 原生代码 MVC 模式实现简易留言板功能
目录结构
liuyanban
---- lib
------- Controller.php
------- DataAccess.php
------- Model.php
------- View.php
---- index.php
---- add.html
---- lyb.sql
lyb.sql
CREATE DATABASE `liuyanban` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE `liuyanban`.`note` (
`id` int( 10 ) unsigned NOT NULL AUTO_INCREMENT ,
`name` varchar( 100 ) DEFAULT NULL ,
`email` varchar( 100 ) DEFAULT NULL ,
`content` varchar( 5000 ) DEFAULT NULL ,
`timedate` int( 11 ) DEFAULT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE KEY `id` ( `id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT =1;
add.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>简易留言本</title>
<script language="javascript">
function check_form()
{
if (!document.form1.username.value)
{
alert("用户名不能为空!");
return false;
}
if (!test_email(document.form1.email.value))
{
alert("电子邮箱格式不正确!");
return false;
}
}
function test_email(str_email)
{
var pattern=/^[a-zA-Z0-9_.]+@([a-zA-Z0-9_]+.)+[a-zA-Z]{2,3}$/;
if (pattern.test(str_email))
return true;
else
return false;
}
</script>
</head>
<body leftmargin="50px">
<form id="form1" name="form1" method="post" action="index.php?action=post" onsubmit="return check_form();">
<p>用户名:</p>
<p>
<input type="text" name="username" />
<font color="#FF0000">* </font></p>
<p>电子邮件:</p>
<p>
<input type="text" name="email" />
<font color="#FF0000">*</font></p>
<p>留言内容:</p>
<p>
<textarea name="content" cols="60" rows="5"></textarea>
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
</body>
</html>
index.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP MVC留言板</title>
</head>
<body leftmargin="50px">
<a href="add.htm">添加新留言</a><br>
<p>
<?php
//!index.php 总入口
/**
* index.php的调用形式为:
* 显示所有留言:index.php?action=list
* 添加留言 :index.php?action=post
* 删除留言 :index.php?action=delete&id=x
*/
require_once('lib/DataAccess.php');
require_once('lib/Model.php');
require_once('lib/View.php');
require_once('lib/Controller.php');
//创建DataAccess对象(请根据你的需要修改参数值)
$dao = & new DataAccess ('localhost','root','','liuyanban');
//根据$_GET["action"]取值的不同调用不同的控制器子类
$action = isset($_GET["action"]) ? $_GET["action"] : 'list';
switch ($action)
{
case "post":
$controller=& new postController($dao); break;
case "list":
$controller=& new listController($dao); break;
case "delete":
$controller=& new deleteController($dao); break;
default:
$controller=& new listController($dao); break; //默认为显示留言
}
$view=$controller->getView(); //获取视图对象
$view->display(); //输出HTML
?>
</body>
</html>
DataAccess.php
<?php
/**
* 一个用来访问MySQL的类
* 仅仅实现演示所需的基本功能,没有容错等
* 代码未作修改,只是把注释翻译一下,加了点自己的体会
*/
class DataAccess {
var $link_id; //用于存储数据库连接
var $query_id; //用于存储查询源
//! 构造函数.
/**
* 创建一个新的DataAccess对象
* @param $host 数据库服务器名称
* @param $user 数据库服务器用户名
* @param $pass 密码
* @param $db 数据库名称
*/
function __construct($host,$user,$pass,$db) {
$this->link_id=mysql_pconnect($host,$user,$pass); //连接数据库服务器
mysql_select_db($db,$this->link_id); //选择所需数据库
mysql_query("set names utf8;");
}
//! 执行SQL语句
/**
* 执行SQL语句,获取一个查询源并存储在数据成员$query中
* @param $sql 被执行的SQL语句字符串
* @return void
*/
function query($sql) {
$this->query_id=mysql_unbuffered_query($sql,$this->link_id); // Perform query here
if ($this->query_id) return true;
else return false;
}
//! 获取结果集
/**
* 以数组形式返回查询结果的所有记录
* @return mixed
*/
function fetchRows($sql) {
$this->query($sql);
$arr=array();
$i=0;
//MYSQL_ASSOC参数决定了数组键名用字段名表示
while( $row=mysql_fetch_array($this->query_id,MYSQL_ASSOC) )
{
$arr[$i]=$row;
$i++;
}
return $arr;
}
}
Model.php
<?php
//! Model类
/**
* 它的主要部分是对应于留言本各种数据操作的函数
* 如:留言数据的显示、插入、删除等
*/
class Model {
var $dao; //DataAccess类的一个实例(对象)
//! 构造函数
/**
* 构造一个新的Model对象
* @param $dao是一个DataAccess对象
* 该参数以地址传递(&$dao)的形式传给Model
* 并保存在Model的成员变量$this->dao中
* Model通过调用$this->dao的fetch方法执行所需的SQL语句
*/
function __construct(&$dao) {
$this->dao=$dao;
}
function listNote() { //获取全部留言
$notes=$this->dao->fetchRows("SELECT * FROM note ORDER BY timedate DESC");
return $notes;
}
function postNote() { //插入一条新留言
$name=$_POST['username'];
$email=$_POST['email'];
$content=$_POST['content'];
$timedate=time()+8*3600;
$sql="INSERT INTO note (name, email, content, timedate) VALUES
('".$name."', '".$email."', '".$content."', '".$timedate."' )";
//echo $sql; //对于较复杂的合成SQL语句,<br />
//调试时用echo输出一下看看是否正确是一种常用的调试技巧
if ($this->dao->query($sql)) return true;
else return false;
}
function deleteNote() { //删除一条留言,$id是该条留言的id
$sql="DELETE FROM note WHERE id=".$_GET['id'];
if ($this->dao->query($sql)) return true;
else return false;
}
}
Controller.php
<?php
/**
* 控制器将$_GET['action']中不同的参数(list、post、delete)
* 对应于完成该功能控制的相应子类
*/
class Controller {
var $model; // Model 对象
var $view; // View 对象
/**
* 构造一个Model对象存储于成员变量$this->model;
*/
function __construct (& $dao) {
$this->model=& new Model($dao);
}
/**
* 返回视图对象view
*
*/
function getView() {
return $this->view;
}
}
//用于控制显示留言列表的子类
class listController extends Controller{ //extends表示继承
function __construct (& $dao) {
parent::__construct($dao); //继承其父类的构造函数
$notes=$this->model->listNote();
$this->view=& new listView($notes); //创建相应的View子类的对象来完成显示
}
}
//用于控制添加留言的子类
class postController extends Controller{
function __construct (& $dao) {
parent::__construct($dao);
if ($this->model->postNote()) $success=1;
else $success=0;
$this->view=& new postView($success);
}
}
//用于控制删除留言的子类
class deleteController extends Controller{
function __construct (& $dao) {
parent::__construct($dao);
if ($this->model->deleteNote()) $success=1;
else $success=0;
$this->view=& new deleteView($success);
}
}
View.php
<?php
//! View 类
/**
* 针对各个功能(list、post、delete)的各种View子类
* 被Controller调用,完成不同功能的网页显示
*/
class View {
var $output; //用于保存输出HTML代码的字符串
function display() { //输出最终格式化的HTML数据
echo($this->output);
}
}
class listView extends View //显示所有留言的子类
{
function __construct($notes) {
foreach ($notes as $value)
{
$this->output.="<p><strong>访客姓名:</strong>".$value['name']."</p>".
"<p><strong>访客邮箱:</strong>".$value['email']."</p>".
"<p><strong>访客留言:</strong>".$value['content']."</p>".
"<p><strong>来访时间:</strong>".date("y-m-d H:i",$value['timedate'])."</p>".
"<p align=\"right\"><a href=\"index.php?action=delete&id=".$value['id']."\">删除留言</a>".
"<hr />";
}
}
}
class postView extends View //发表留言的子类
{
function __construct($success)
{
if ($success)
$this->output="留言成功!<br><a href=\"".$_SERVER['PHP_SELF']."?action=list\">查看</a>";
else
$this->output="留言保存失败!";
}
}
class deleteView extends View //删除留言的子类
{
function __construct($success)
{
if ($success)
$this->output="留言删除成功!<br><a href=\"".$_SERVER['PHP_SELF']."?action=list\">查看</a>";
}
}