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

课程链接: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);

执行效果:

Array
(
    [id] => 7
    [name] => 杨过
    [email] => yangguo@php.cn
    [grade] => 99
)

查询多条数据:

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

执行效果:

Array
(
    [0] => Array
        (
            [id] => 2
            [name] => 黄蓉
            [email] => huangrong@php.cn
            [grade] => 88
        )

    [1] => Array
        (
            [id] => 7
            [name] => 杨过
            [email] => yangguo@php.cn
            [grade] => 99
        )

)

新增数据:

// 新增
/**
 * 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条记录,新增主键id是12

查询id为12的记录:

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

执行效果:

Array
(
    [id] => 12
    [name] => 盖伦
    [email] => gailun@qq.com
    [grade] => 98
)

更新数据:

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

执行效果:

成功更新了1条记录~~

查询id为12的记录:

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

执行效果:

Array
(
    [id] => 12
    [name] => 盖伦
    [email] => gailun@qq.com
    [grade] => 88
)

删除数据:

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

执行效果:

成功删除了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);
    }
}

2.创建用户自定义模型

StudentModel.php:

<?php


class StudentModel extends Model
{

}

往期文章

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里逆天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值