下面是详细的攻略。
1. 简介
在 PHP 中操作数据库是一个常见的需求,但是重复写 相同的操作代码是一件很麻烦的事情。我们可以通过封装一个数据库操作类来解决这个问题。
这个数据库操作类提供增、删、改、查等基本的功能,并支持链式操作。
2. 实现
我们可以将这个操作类放在一个单独的文件中,比如 db.php
。
在该类中,我们需要定义连接数据库、增删改查等基本方法。对于增、删、改方法,我们可以使用预处理语句来避免 SQL 注入安全问题。
下面是示例代码:
<?php
class DB {
private static $instance = null;
private $pdo = null;
private $table = null;
private function __construct($host, $port, $dbname, $username, $password) {
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
$this->pdo = new PDO($dsn, $username, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function getInstance($host, $port, $dbname, $username, $password) {
if (self::$instance === null) {
self::$instance = new DB($host, $port, $dbname, $username, $password);
}
return self::$instance;
}
public function table($table) {
$this->table = $table;
return $this;
}
public function insert($data) {
$keys = array_keys($data);
$placeholders = implode(',', array_fill(0, count($keys), '?'));
$sql = "INSERT INTO $this->table (" . implode(',', $keys) . ") VALUES ($placeholders)";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array_values($data));
return $stmt->rowCount();
}
public function delete($condition, $params = array()) {
$sql = "DELETE FROM $this->table WHERE $condition";
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt->rowCount();
}
public function update($data, $condition, $params = array()) {
$set = array();
foreach ($data as $key => $value) {
$set[] = "$key = ?";
}
$sql = "UPDATE $this->table SET " . implode(',', $set) . " WHERE $condition";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array_merge(array_values($data), $params));
return $stmt->rowCount();
}
public function select($columns = '*', $condition = '1', $params = array(), $orderBy = null, $limit = null) {
$sql = "SELECT $columns FROM $this->table WHERE $condition";
if ($orderBy !== null) {
$sql .= " ORDER BY $orderBy";
}
if ($limit !== null) {
$sql .= " LIMIT $limit";
}
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
这个类包含 getInstance
、table
、insert
、delete
、update
和 select
等方法。
其中,getInstance
为单例模式实现,确保只创建一个实例。
table
方法设置表名,返回 $this
,从而实现链式调用。
insert
方法插入记录,参数为关联数组,数组的键为字段名,值为字段值。
delete
方法删除记录,其中 $condition
参数应该使用占位符,这里传入的 $params
数组为占位符的值。
update
方法更新记录,其中 $data
参数为要更新的值,也是一个关联数组;$condition
参数同样应该使用占位符。
select
方法查询记录,其中 $columns
是查询的列名;$condition
同样应该使用占位符;$params
为占位符的值;$orderBy
为排序条件,如果不需要排序,则传入 null
;$limit
为限制查询的数量,如果不需要限制,则传入 null
。
3. 示例
下面是两个示例,以更清晰地展示 DB
类的使用方法。
示例1
假设我们有一个 users
表,其中包含 user_id
、 name
和 age
三个字段,现在需要向该表中插入一条记录。
$db = DB::getInstance('localhost', 3306, 'test', 'root', 'root');
$data = [
'name' => 'Tom',
'age' => 18,
];
$result = $db->table('users')->insert($data);
这里用 table
方法设置表名为 users
,然后使用 insert
方法插入一条记录。最后 $result
数组应该包含一个键为 rowCount
的元素,其值为插入的记录数量。
示例2
现在我们要更新 users
表中 user_id
为 1 的记录中的 age
字段为 20。
$db = DB::getInstance('localhost', 3306, 'test', 'root', 'root');
$data = ['age' => 20];
$condition = 'user_id = ?';
$params = [1];
$result = $db->table('users')->update($data, $condition, $params);
这里用 table
方法设置表名为 users
,然后使用 update
方法更新满足 $condition
和 $params
的记录,在该例子中,将 user_id
为 1 的记录中的 age
字段更新为 20。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP简单数据库操作类实例【支持增删改查及链式操作】 - Python技术站