课程链接: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与单例模式