模型类
所谓的模型类,就是把MVC中的数据处理单元的功能封装到一个类中,
由于数据处理单元都是和数据库进行交互,而数据表又是数据库的基本单元,所以典型的我们
一般将一张数据表的所有操作,封装到一个典型的类当中,也就是说,一张数据表对就对应着php
项目中的一个模型类。(如果我数据库中有10张表,那我就需要创建10个模型类)
代码改动下:
C 控制器下
<?php //控制器调用视图 view.html require 'index.html'; //调用Model 模型类; require './Mybank.class.php'; if(!empty($_GET)){ $out=$_GET['out']; $in=$_GET['in']; $money=$_GET['money']; //把操作的my_bank表封装成一个类调用 $ban=new Mybank(); $ban->zhuangZ($out,$in,$money); }
M 模型下
my_bank 模型类
<?php //转账模型类,有多么功能就封装什么方法就行 class Mybank { public function zhuangZ($out,$in,$money){ require './MyPDO.class.php'; $pdo=MyPDO::getInstance($money,$out,$in); return $pdo->beginTransction("update my_bank set money=money-$money where carNo=$out","update my_bank set money=money+$money where carNo=$in"); } }
M 数据库连接操作模型类
<?php class MyPDO { private static $instance; //保存对象 private $host; //主机地址 private $dbname; //数据库名字 private $port; //端口 private $user; //用户名 private $pwd; //密码 private $charset; //字符集 private $link; //连接对象 private function __construct($data){ $this->initParam($data); $this->getPDO(); $this->errorMode(); } private function __clone(){ } //获取单例 public static function getInstance($data=array()){ if(!self::$instance instanceof self){ return self::$instance=new self($data); } return self::$instance; } //初始化参数 private function initParam($data){ $this->host=isset($data['host'])?$data['host']:'localhost'; $this->dbname=isset($data['dbname'])?$data['dbname']:'my_db'; $this->port=isset($data['port'])?$data['port'] : '3306'; $this->user=isset($data['user'])?$data['user']:'root'; $this->pwd=isset($data['pwd'])?$data['pwd']:'root'; $this->charset=isset($data['charset'])?$data['charset']:'utf8'; } //显示错误 private function showError($e,$sql=null){ echo "错误信息".$e->getMessage()."<br>"; echo "错误代码".$e->getCode()."<br>"; echo "错误文件".$e->getFile()."<br>"; echo "错误行号".$e->getLine().'<br>'; if($sql!=null){ echo "错误sql语句".$sql; } } //连接数据库 private function getPDO(){ try { $this->link= new PDO("mysql:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}","{$this->user}","{$this->pwd}"); } catch (PDOException $e) { $this->showError($e); exit; } } //设置错误模式 private function errorMode(){ $this->link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); } /** * 增删改功能 * @param string sql语句 * @return int 受影响的行数 */ public function exec($sql){ try { return $row=$this->link->exec($sql); } catch (PDOException $e) { $this->showError($e,$sql); exit; } } /** * 获取二维数组结果集 * @param string sql * @return PDOStatement 结果集 */ public function fetchAll($sql){ try{ $stmt=$this->link->query($sql); return $stmt->fetchAll(); }catch(PDOException $e){ $this->showError($e,$sql); } } /** * 获取一维数组结果集 *@param string sql *@return PDOStatement 结果集 */ public function fetch($sql){ try { $stmt= $this->link->query($sql); return $stmt->fetch(); } catch (PDOException $e) { $this->showError($e,$sql); } } /** * 获取单行单列 * @param string sql * @return mixed 内容 */ public function fetchColumn($sql){ try { $stmt=$this->link->query($sql); return $stmt->fetchColumn(); } catch (PDOException $e) { $this->showError($e,$sql); } } //转账事务操作 public function beginTransction($sql_out,$sql_in){ try { $this->link->beginTransaction(); $out=$this->link->exec($sql_out); $in=$this->link->exec($sql_in); if($out && $in){ $this->link->commit(); echo "转账成功"; }else{ $this->link->rollBack(); } } catch (PDOException $e) { $this->showError($e); } } }
V 视图类
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="" method="get"> 转出卡号:<input type="text" name="out" id=""><br> 转入卡号:<input type="text" name="in" id=""><br> 金额:<input type="text" name="money" id=""><br> <input type="submit" value="转账"> </form> </body> </html>
那么问题来了?
每个数据表都是一个模型类,增 删 改 查 重复代码太多,而且每次都需要 在每个模型类
中去连接数据库,代码重复,怎么解决?
我们会用到基础模型类,把 连接数据库 增删改查 都封装到一个基础模型类中,my_bank模型类 在继承基础
模型类就可以了