|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习了六个多月PHP了,还是个新手,在这里受到了很多人的帮助,谢谢你们!model 3、完成你的Mode层
Model层,就是MVC形式中的数据处置层,用来停止数据和贸易逻辑的装封,停止他的设计的时分设计到三个个概念:
------Model类。是实体类。用来保留数据库表格的中一笔记录的一切字段的数据。而且可以验证这笔记录数据的完全性。
------ModelManager类。 是实体类的办理类。凡是每个实体类(Model)都要有一个对应的办理类(ModelManager)。办理类可以用来办理实体类外面的数据记载(例如删除/添加/更改.....)。 然而ModelManager类纷歧定要有对应的Model类。
------db类。 用来办理对数据库的联接。 ModelManager类一切的对数据的操作。都是经由过程这个db类来完成的。 在全部MVC形式中。只要这个db类可以直接对数据库停止操作。同时也只要ModelManager类可以对db类停止挪用。
看上去好象是对照费事。然而实践上其实不庞杂。这类Model层设计体例。和网上购物体系的购物车法式是极为类似的。Model可以看做是购物车里的单个商品的信息类。Manager可以看做是定单。 定单是用来办理推销的商品的。
上面是一个复杂的例子。应当是对照典范的。侧重看他的全部设计和流程的完成。细心研讨一下。其实不难。
注重:上面例子利用的一切的类和办法都是经由简化的。实践情形比这个要庞杂的多。然而。作为一个实例已是足够用了。
文件夹布局:
|- Db.php
|- Model.php
|- Manager.php
|- ModelTest1.php
|- ModelTest2.php
|- ModelTest3.php
|- ModelTest4.php
|- Model /
|- Model / ClassModel.php
|- Model / StudentModel.php
|- Model / ClassManager.php
|- Model / StudentManager.php
注重文件夹和文件名的巨细写
内容:假定有一个数据库,保留在两张表,一张是class(班级)表格,一张是student(先生)的表格,
class表格字段: cls_id----------int--------not null
cls_name--------string-----not null
cls_address-----string-----null
student表格字段:stu_id----------int--------not null
stu_clsid-------int--------not null
stu_name--------string-----null
ClassModel.php 外面是class表的一个实体类ClassModel
ClassManager.php 外面是ClassModel的办理类ClassManager
StudentModel.php 外面是student表的一个实体类StudentModel
StudentManager.php 外面是StudentModel的办理类StudentManager
Db.php 外面是一个数据库操作办理类,他和外面用的接口和正常利用情形是一样的, 然而本例只是摹拟的完成了这个托言.因而,可以在不必真实数据库的情形下运转.
文件0:(Model.php)Model层实体的基本类
<?php
//用来包装信息实体的基本类
class Model{
//这个实体类的数据,
//example: array("id"=>1, "name"=>"this is name");
var $data;
//这个实体类的数据束缚信息,用来判别到场的$data数据的正确性
//see: ClassModel
var $match;
//与该实体对应的数据库中表的称号
var $table;
//初始化
function Model(&$data){
$this->data = &$data;
}
//设置该实体的某个数据是值
function set($key, $value){
$this->data[$key] = $value;
}
//获得该实体的某个数据
function get($key){
return $this->data[$key];
}
//获得该实体的全体数据
function getData(){
return $this->data;
}
//获得该实体的束缚信息
function getMatch(){
return $this->match;
}
//验证明体数据的正确性和完全性
function isValid(){
foreach($this->match as $key=>$value){
if(!isset($value["null"]) && !isset($this->data[$key])) die("$key 的数值不克不及为空");
//.....可以在加其他的判别,例如是不是超越多么的最大数值,或长渡过长.....
}
}
}
?>
文件1:(Manager.php)Model层停止实体办理的基本类
<?php
//对实体信息停止办理的基本类
class Manager{
//数据库办理类对象
var $db;
//初始化
function Manager(){
$this->db = new Db();
}
//用来向数据库中拔出实体信息
function insert(&$model){
$model->isvalid();
$table = $model->table;
$match = $model->getMatch();
$data = $model->getData();
$str1 = $str2 = array();
foreach($match as $key=>$value){
if(isset($data[$key])){
$str1[] = $key;
$str2[] = ($value["type"]=="C")? "\"".$data[$key]."\"": $data[$key];
}
}
$sql = "INSERT INTO $table (".implode(",", $str1).") VALUES(".implode(",", $str2).")";
return $this->db->execute($sql);
}
}
?>
文件2:(ClassModel.php)班级信息的实体类
<?php
//用来包装班级信息的实体类
class ClassModel extends Model{
var $data = array();
//$match中,
//type用来暗示数据的类型(I暗示整数, C暗示是字符串)
//name用来暗示在数据库表中的字段名
//null暗示该字段的值是不是准予为空
// (数组中有"null"=>true暗示是准予为空,不然不克不及为空)
var $match = array("cls_id" => array("name"=>"cls_id", "type"=>"I"),
"cls_name" => array("name"=>"cls_name", "type"=>"C"),
"cls_address" => array("name"=>"cls_address", "type"=>"C", "null"=>true)
);
var $table = "class";
//初始化
function ClassModel(&$data){
parent::Model($data);
}
//用来获得这个班级的先生的信息
function getStudent(){
require_once "./Model/StudentManager.php";
$manager = new StudentManager();
$classId = $this->get("cls_id");
return $manager->getList($classId);
}
}
?>
文件3:(StudentModel.php)先生信息的实体类
<?php
//用来包装先生信息的实体类
class StudentModel extends Model{
var $data = array();
//$match中,
//type用来暗示数据的类型(I暗示整数, C暗示是字符串)
//name用来暗示在数据库表中的字段名
//null暗示该字段的值是不是准予为空
// (数组中有"null"=>true暗示是准予为空,不然不克不及为空)
var $match = array("stu_id" => array("name"=>"stu_id", "type"=>"I"),
"stu_clsid" => array("name"=>"stu_clsid", "type"=>"I"),
"stu_name" => array("name"=>"stu_name", "type"=>"C", "null"=>true)
);
var $table = "student";
//初始化
function StudentModel(&$data){
parent::Model($data);
}
}
?>
文件4:(ClassManager.php)班级实体的办理类
<?php
//班级实体信息的办理类
class ClassModelManager extends Manager{
//初始化
function ClassModelManager(){
parent::Manager();
}
//获得班级列表
function &getList(){
$sql = "SELECT * FROM class";
return $this->db->query($sql);
}
//查找并前往一个班级的实体类
function &findOneModel($id){
$sql = "SELECT * FORM class WHERE cls_id=$id";
$data = $this->db->getOne($sql);
if($data==null) die("该班级不存在!");
require_once "./Model/ClassModel.php";
$model = new ClassModel($data);
return $model;
}
}
?>
文件5:(StudentManager.php)先生实体的办理类
<?php
//先生信息实体的办理类
class StudentManager extends Manager{
//初始化
function StudentManager(){
parent::Manager();
}
//获得某个班级的先生的列表
function &getList($classId){
$sql = "SELECT * FROM student WHERE stu_clsid=$classId";
return $this->db->query($sql);
}
}
?>
文件6:(Db.php)数据库联接收理类,用于同享并办理数据的会见。因为这个类触及的内容不是本章要会商的内容,所以这个类摹拟了“真实的数据库办理类的办法”,托言是和正常的类是一样的,然而接口函数外面的内容是不合错误的,只是摹拟的数据。网上有良多这类类的做法,可以本人到早晨找找,(**别的本系列文章的第二章里也有具体的引见**)。
<?php
//数据库操作办理类
class Db{
//数据库联接
var $con;
//初始化
function Db(){
//$this->con=mysql_connect(********************);...........
}
//履行数据查询语句
function &query($sql){
//$result = mysql_query($sql); ..................
//return $result;
if($sql=="SELECT * FROM student WHERE stu_clsid=2")
return array("0"=>array("stu_id"=>1, "stu_clsid"=>2, "stu_name"=>"student1"),
"1"=>array("stu_id"=>2, "stu_clsid"=>2, "stu_name"=>"student2")
);
die("空班级");
}
//获得一条数查询了局
function getOne($sql){
//$result = mysql_query($sql); .............
//return $result[0];
if($sql=="SELECT * FORM class WHERE cls_id=1")
return null;
if($sql=="SELECT * FORM class WHERE cls_id=2")
return array("cls_id"=>2, "cls_name"=>"classname", "cls_address"=>"classaddress");
}
//履行数据库更新/添加/删除语句
function execute($sql){
//mysql_query($sql);
echo "<br>正在停止拔出操作<br>...<br>拔出操作完成<br>";
return true;
}
}
?>
测试文件1、(ModelTest1.php)(查询班级标号(cls_id)为2的班级的先生的名单)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$classId = 2;
require_once "./Model/ClassManager.php";
$manager = new ClassModelManager();
$model = $manager->findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "编号:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."<br>";
?>
前往的了局是:
编号:1 ------ 姓名: student1
编号:2 ------ 姓名: student2
测试文件2、(ModelTest2.php)(查询班级标号(cls_id)为1的班级的先生的名单)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$classId = 1;
require_once "./Model/ClassManager.php";
$manager = new ClassModelManager();
$model = $manager->findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "编号:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."<br>";
?>
前往的了局是:
该班级不存在!
测试文件3、(ModelTest3.php)(履行数据库的拔出任务,向student表添加数据)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$data = array("stu_id"=>3, "stu_clsid"=>2, "stu_name"=>"student3");
require_once "./Model/StudentModel.php";
$model = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "<h2>拔出操作胜利</h2>": "<h2>拔出操作掉败</h2>";
?>
前往的了局是:
正在停止拔出操作
...
拔出操作完成
拔出操作胜利
测试文件4、(ModelTest4.php)(履行数据库的拔出任务,向student表添加数据)
<?php
error_reporting(E_ALL);
require_once "Db.php";
require_once "Model.php";
require_once "Manager.php";
$data = array("stu_id"=>3, "stu_name"=>"student3");
require_once "./Model/StudentModel.php";
$model = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "<h2>拔出操作胜利</h2>": "<h2>拔出操作掉败</h2>";
?>
前往的了局是:
stu_clsid 的数值不克不及为空
了局剖析:
StudentModel中"match"的划定stu_clsid的值是不克不及为空的,
而代码中代码中$data = array("stu_id"=>3, "stu_name"=>"student3");
短少stu_clsid的值,因而不克不及经由过程数据的完全性校验,抱错.
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。 |
|