下面是实现可用于多种数据库操作的 PHP 类的完整攻略,主要分为以下几个步骤:
步骤一:创建基础类
首先,我们需要创建一个基础的数据库操作类,该类可用于多种数据库的操作。以下是一个简单的示例代码,其中假设所有的配置都存在类的属性中:
class DB {
private $host;
private $username;
private $password;
private $dbname;
private $dbtype;
public function __construct($host, $username, $password, $dbname, $dbtype) {
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->dbname = $dbname;
$this->dbtype = $dbtype;
$this->connect();
}
private function connect() {
try {
switch ($this->dbtype) {
case 'mysql':
$dsn = "mysql:host=$this->host;dbname=$this->dbname;charset=utf8";
break;
case 'pgsql':
$dsn = "pgsql:host=$this->host;dbname=$this->dbname;user=$this->username;password=$this->password";
break;
case 'mssql':
$dsn = "sqlsrv:Server=$this->host;Database=$this->dbname";
break;
default:
throw new Exception('Unsupported database type');
}
$this->conn = new PDO($dsn, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
throw new Exception('Connection error: ' . $e->getMessage());
}
}
public function query($sql, $params = []) {
try {
$stmt = $this->conn->prepare($sql);
$stmt->execute($params);
return $stmt;
} catch (PDOException $e) {
throw new Exception('Query error: ' . $e->getMessage());
}
}
public function lastInsertId() {
return $this->conn->lastInsertId();
}
public function beginTransaction() {
return $this->conn->beginTransaction();
}
public function commit() {
return $this->conn->commit();
}
public function rollBack() {
return $this->conn->rollBack();
}
}
该类的构造函数需要传入数据库的一些基本信息,如主机地址、用户名、密码、数据库名以及数据库类型。在构造函数中,我们创建了一个 PDO 连接,并将一些 PDO 的属性设置为默认值。该类提供了一些常用的方法,如 query
用于执行 SQL 查询语句,lastInsertId
用于获取最后插入记录的 ID,beginTransaction
用于开启事务,commit
用于提交事务,以及 rollBack
用于回滚事务。
步骤二:扩展基础类
接下来,我们需要扩展上述基础类,以支持不同数据库的查询语句和特定功能。以下是一个简单的示例代码,这里以 MySQL 和 PostgreSQL 数据库为例:
class MySQLDB extends DB {
public function insert($table, $data) {
if (empty($table) || empty($data)) {
throw new Exception('Table name and data are required');
}
$columns = implode(',', array_keys($data));
$values = implode(',', array_fill(0, count($data), '?'));
$sql = "INSERT INTO $table ($columns) VALUES ($values)";
$stmt = $this->query($sql, array_values($data));
return $this->lastInsertId();
}
public function update($table, $data, $where = '') {
if (empty($table) || empty($data)) {
throw new Exception('Table name and data are required');
}
$set = implode(',', array_map(function ($k, $v) {
return "$k = ?";
}, array_keys($data), $data));
$sql = "UPDATE $table SET $set" . (empty($where) ? '' : " WHERE $where");
$this->query($sql, array_values($data));
return true;
}
}
class PostgreSQLDB extends DB {
public function insert($table, $data) {
if (empty($table) || empty($data)) {
throw new Exception('Table name and data are required');
}
$columns = implode(',', array_keys($data));
$values = implode(',', array_fill(0, count($data), '?'));
$sql = "INSERT INTO $table ($columns) VALUES ($values)";
$stmt = $this->query($sql, array_values($data));
return $this->lastInsertId();
}
public function update($table, $data, $where = '') {
if (empty($table) || empty($data)) {
throw new Exception('Table name and data are required');
}
$set = implode(',', array_map(function ($k, $v) {
return "$k = ?";
}, array_keys($data), $data));
$sql = "UPDATE $table SET $set" . (empty($where) ? '' : " WHERE $where");
$this->query($sql, array_values($data));
return true;
}
public function getSchema() {
$sql = "SELECT table_name, column_name, data_type FROM information_schema.columns WHERE table_catalog = '{$this->dbname}'";
$stmt = $this->query($sql);
return $stmt->fetchAll();
}
}
我们为 MySQLDB 和 PostgreSQLDB 类分别添加了 insert
和 update
方法,用于执行 SQL 插入和更新操作。这些方法也可以适用于其他数据库类型,只需要在 switch 语句中添加对应的代码。此外,我们还为 PostgreSQLDB 类添加了一个 getSchema
方法,用于获取数据库的结构信息,例如每张表的列名和数据类型等等。
步骤三:示例使用
最后,我们可以通过实例化 MySQLDB 和 PostgreSQLDB 类来实现具体的数据库操作。以下是一个简单的示例代码:
// 实例化 MySQLDB 类
$mysql = new MySQLDB('127.0.0.1', 'root', 'password', 'test', 'mysql');
// 插入一条记录到 'users' 表
$lastInsertId = $mysql->insert('users', ['name' => '张三', 'email' => 'zhangsan@example.com']);
// 更新 'users' 表中 ID 为 1 的记录
$mysql->update('users', ['name' => '李四', 'email' => 'lisi@example.com'], 'id = 1');
// 实例化 PostgreSQLDB 类
$postgresql = new PostgreSQLDB('pgsql.example.com', 'user', 'password', 'test', 'pgsql');
// 插入一条记录到 'users' 表
$lastInsertId = $postgresql->insert('users', ['name' => '张三', 'email' => 'zhangsan@example.com']);
// 更新 'users' 表中 ID 为 1 的记录
$postgresql->update('users', ['name' => '李四', 'email' => 'lisi@example.com'], 'id = 1');
// 获取 PostgreSQL 数据库的结构信息
$schema = $postgresql->getSchema();
print_r($schema);
在以上示例代码中,我们首先实例化了 MySQLDB
和 PostgreSQLDB
两个类,并使用它们的 insert
和 update
方法来执行 SQL 插入和更新操作。最后,我们调用了 getSchema
方法来获取 PostgreSQL 数据库的结构信息。通过实例化不同的类,我们可以非常方便地操作不同类型的数据库。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现可用于mysql,mssql,pg数据库操作类 - Python技术站