zoukankan      html  css  js  c++  java
  • 模型类

    所谓的模型类,就是把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模型类 在继承基础

    模型类就可以了

  • 相关阅读:
    Vue 计算属性(四)
    Vue 方法与事件(三)
    Vue 基本指令使用(二)
    Vue 项目开发环境搭建(一)
    SpringBoot 整合 Dubbo
    Nginx 中 include 指令使用
    Nginx 中 root 和 alias 的使用区别
    JS动态修改网站图标以及标题
    vue中使用轮播图插件carousel,克隆的图片点击事件无效的解决办法
    根据 url + fileName下载文件,并更改文件名
  • 原文地址:https://www.cnblogs.com/xiaowie/p/14316859.html
Copyright © 2011-2022 走看看