发布于 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>";

    }
}
©2020 edoou.com   京ICP备16001874号-3