关键词搜索

源码搜索 ×
×

《php从零开始开发属于自己的php框架》课程笔记2——数据库与模型

发布2021-01-27浏览333次

详情内容

课程链接:https://www.php.cn/course/665.html


一、数据库操作类

操作数据的前提是与数据库建立连接,为了方便,通常会将数据库连接所需的一些参数、常用的操作方法(如查询)等,封装在一个文件中。

1.封装数据库操作类Db

Db.php:

<?php

/**
 * 数据库的基本操作
 * 实现两类功能:
 * 1.创建当前类的唯一实例
 * 2.创建数据库的基本操作
 * Class Db
 */
class Db
{
    // 数据库的默认连接参数
    private $dbConfig = [
        'db'=>'mysql', // 数据库类型
        'host'=>'localhost', // 主机名称
        'port'=>'3306', // 默认端口
        'user'=>'root', // 用户名
        'pass'=>'123456', // 密码
        'charset'=>'utf8', // 默认字符集
        'dbname'=>'edu', // 默认数据库
    ];


    // 新增主键id
    public $insertId = null;
    // 受影响的记录数据
    public $num = 0;
    // 单例模式,本类的实例
    private static $instance = null;

    // 数据库的连接
    private $conn = null;

    /**
     * Db 构造方法
     * 私有化以防止外部实例化
     * Db constructor.
     * @param $params
     */
    private function __construct($params)
    {
        // 初始化连接参数
        // 将默认参数与用户自定义的参数合并
        $this->dbConfig = array_merge($this->dbConfig, $params);
        // 连接数据库
        $this->connect();
    }

    /**
     * 禁止外部克隆该实例
     */
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * 获取当前类的单一实例
     * @param array $params
     * @return Db|null
     */
    public static function getInstance($params=[])
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self($params);
        }
        return self::$instance;
    }

    /**
     * 数据库的连接
     */
    private function connect()
    {
        try {
            // 配置数据库DSN
            $dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};
            port={$this->dbConfig['port']};dbname={$this->dbConfig['dbname']};
            charset={$this->dbConfig['charset']}";

            // 创建PDO对象
            $this->conn = new PDO($dsn, $this->dbConfig['user'], $this->dbConfig['pass']);

            // 设置客户端的默认字符集
            $this->conn->query("SET NAMES {$this->dbConfig['charset']}");

        } catch (PDOException $e) {
            die('数据库连接失败'.$e->getMessage());
        }
    }

    // 完成数据表的写操作:新增,更新,删除
    // 返回受影响的记录,如果新增还返回新增主键id
    public function exec($sql)
    {
        $num = $this->conn->exec($sql);
        if ($num > 0) {
            // 如果是新增操作,初始化新增主键id属性
            if (null !== $this->conn->lastInsertId()) {
                $this->insertId = $this->conn->lastInsertId();
            }
            $this->num = $num; // 返回受影响的记录数据
        } else {
            $error = $this->conn->errorInfo(); // 获取最后操作的错误信息的数据
            // [0]错误标识符 [1]错误代码 [2]错误信息
            print '操作失败'.$error[0].':'.$error[1].':'.$error[2];
        }
    }

    // 获取单条查询结果
    public function fetch($sql)
    {
        return $this->conn->query($sql)->fetch(PDO::FETCH_ASSOC);
    }

    // 获取多条查询结果
    public function fetchAll($sql)
    {
        return $this->conn->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    }
}

    2.测试数据库操作类Db

    查询单条数据:

    <?php
    
    /**
     * Db类测试
     */
    
    require_once 'model\Db.php';
    
    $db = Db::getInstance(); // 获取Db类实例
    
    
    // 查询单条
    $sql = "SELECT id,name,email,grade FROM student WHERE grade > 90";
    $row = $db->fetch($sql);
    print_r($row);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行效果:

    Array
    (
        [id] => 7
        [name] => 杨过
        [email] => yangguo@php.cn
        [grade] => 99
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    查询多条数据:

    // 查询多条
    $sql = "SELECT id,name,email,grade FROM student WHERE grade > 80";
    $rows = $db->fetchAll($sql);
    echo '<pre>';
    print_r($rows);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    执行效果:

    Array
    (
        [0] => Array
            (
                [id] => 2
                [name] => 黄蓉
                [email] => huangrong@php.cn
                [grade] => 88
            )
    
        [1] => Array
            (
                [id] => 7
                [name] => 杨过
                [email] => yangguo@php.cn
                [grade] => 99
            )
    
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    新增数据:

    // 新增
    /**
     * INSERT INTO:INTO可以省略
     *
     * INSERT...SET...:可以忽略字段顺序,更灵活
     */
    $createTime = time();
    $updateTIme = time();
    $sql = "INSERT student SET name='盖伦', email='gailun@qq.com', course='js', grade=98,
    create_time={$createTime}, update_time={$updateTIme}";
    $db->exec($sql);
    echo '成功新增了'.$db->num.'条记录,新增主键id是'.$db->insertId;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    执行效果:

    成功新增了1条记录,新增主键id是12
    
    • 1

    查询id为12的记录:

    $sql = "SELECT id,name,email,grade FROM student WHERE id=12";
    $row = $db->fetch($sql);
    echo '<pre>'; // 格式化
    print_r($row);
    
    • 1
    • 2
    • 3
    • 4

    执行效果:

    Array
    (
        [id] => 12
        [name] => 盖伦
        [email] => gailun@qq.com
        [grade] => 98
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    更新数据:

    // 更新
    $sql = "UPDATE student SET grade=88 WHERE id=12";
    $db->exec($sql);
    echo '成功更新了'.$db->num.'条记录~~';
    
    • 1
    • 2
    • 3
    • 4

    执行效果:

    成功更新了1条记录~~
    
    • 1

    查询id为12的记录:

    $sql = "SELECT id,name,email,grade FROM student WHERE id=12";
    $row = $db->fetch($sql);
    echo '<pre>'; // 格式化
    print_r($row);
    
    • 1
    • 2
    • 3
    • 4

    执行效果:

    Array
    (
        [id] => 12
        [name] => 盖伦
        [email] => gailun@qq.com
        [grade] => 88
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    删除数据:

    // 删除
    $sql = "DELETE FROM student WHERE id=12";
    $db->exec($sql);
    echo '成功删除了'.$db->num.'条记录~~';
    
    • 1
    • 2
    • 3
    • 4

    执行效果:

    成功删除了1条记录~~
    
    • 1

    二、模型类

    1.创建公共模型类Model

    Model.php:

    <?php
    
    /**
     * 公共模型类
     * 
     * 完成数据库连接和一些公共方法
     * Class Model
     */
    
    class Model
    {
        protected $db = null; // 数据库连接对象
    
        public $data = null; // 当前表中数据
        
        public function __construct()
        {
            $this->init(); // 完成数据库连接
        }
    
        private function init()
        {
            $dbConfig = [
              'user' => 'root',
              'pass' => '123456',
              'dbname' => 'edu',  
            ];
            
            // 用自定义连接配置覆盖默认参数
            $this->db = Db::getInstance($dbConfig);
        }
    
        // 获取全部数据
        public function getAll()
        {
            $sql = "SELECT * FROM student";
            return $this->data = $this->db->fetchAll($sql);
        }
    
        // 获取单条数据
        public function get($id)
        {
            $sql = "SELECT * FROM student WHERE id={$id}";
            return $this->data = $this->db->fetch($sql);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    2.创建用户自定义模型

    StudentModel.php:

    <?php
    
    
    class StudentModel extends Model
    {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    往期文章

    php从零开始开发属于自己的php框架》课程笔记1——MVC与单例模式


    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载