代码如下:
<?php
//数据库连接信息(extract将关联数组转为独立变量)
extract($config = [
'type' => $type ?? 'mysql',
'hostname' => $hostname ??'127.0.0.1',
'database' => $database ?? 'php_pro',
'username' => $username ?? 'root',
'password' => $password ?? 'root',
'hostport' => $hostport ?? '3306',
'charset' => $charset ?? 'utf8',
]);
//PDO数据源名称
$dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$hostname,$database,$charset,$hostport);
//数据库CURD接口类
interface DbBase
{
// Create
public static function insert($db, $data);
// Update
public static function update($db, $data);
// Retrieve
public static function select($db, $id);
// Delete
public static function delete($db, $id);
}
// 实现类使用抽象类来充当
abstract class aDb implements DbBase
{
// 使用单例模式连接: 创建类的唯一实例,唯一对象
protected static $db = null;
// 抽象类充当接口实现类时, 不用必须实现接口中的抽象方法
// 当实现类中的方法中有一些公共操作时,可以将这些操作放在中间的抽象类中实现它
public static function connect($dsn, $username, $password)
{
try {
// 如果当前连接对象是null,表示未连接数据库
if (is_null(self::$db)){
self::$db = new PDO($dsn, $username, $password);
}
return self::$db;
} catch (PDOException $e) {
exit('Connection Error: ' . $e->getMessage());
}
}
}
// 类的真正实现类
class DB extends aDb
{
// Create
public static function insert($db, $data)
{
$sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
$stmt = $db->prepare($sql);
$stmt->execute($data) or die(print_r($stmt->errorInfo(),true));
if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $db->lastInsertId();
unset($pdo);
}
// Update
public static function update($db, $data)
{
$sql = 'UPDATE `users` SET `username`=?,`age`=?, `email`= ?, `password`=? WHERE `id` = ?;';
$stmt = $db->prepare($sql);
$stmt->execute($data);
if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';
unset($pdo);
}
// Retrieve
public static function select($db, $id)
{
$sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
$stmt = $db->prepare($sql);
$stmt->execute([$id]);
while ($user = $stmt->fetch(PDO::FETCH_ASSOC)) {
vprintf('%s | %s | %d | %s <br>', $user);
}
unset($pdo);
}
// Delete
public static function delete($db, $id)
{
$sql = 'DELETE FROM `users` WHERE `id` = ?;';
$stmt = $db->prepare($sql);
$stmt->execute([$id]);
if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';
unset($pdo);
}
}
//客户端代码:
// Create----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
$data = ['arwang',30,'arwang@126.com',md5('123456php.pro')];
// 连接数据库
$db = DB::connect($dsn, $username, $password);
// 执行新增方法
DB::insert($db,$data);
// 输出:新增成功 1 条记录,主键id: 23
// Update----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
$data = ['arwang1',23,'arwang1@php.cn', md5('123456php.pro'), 23];
// 连接数据库
$db = DB::connect($dsn, $username, $password);
// 执行新增方法
DB::update($db,$data);
// 输出:更新成功 1 条记录
// Retrieve----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
// 查询ID大于等于1的数据
$id = 1;
// 连接数据库
$db = DB::connect($dsn, $username, $password);
// 执行新增方法
DB::select($db,$id);
// 输出:
// 15 | lixiaoming | 23 | lixiaoming@php.cn
// 13 | xiaowen | 19 | xiaowen@php.cn
// 12 | xiaoli | 21 | xiaoli@php.cn
// 23 | arwang1 | 23 | arwang1@php.cn
// Delete----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
// 删除ID等于23的数据
$id = 23;
// 连接数据库
$db = DB::connect($dsn, $username, $password);
// 执行新增方法
DB::delete($db,$id);
// 输出:删除成功 1 条记录
总结:
- 这个作业其实没有难度,根据前面学习数据库知识,在方法实现而已;
- 实际接口以及抽象应用场景仍然模糊,什么时候用接口,抽象类?用接口及抽象类有什么好处等还是不明白。