php实现可用于mysql,mssql,pg数据库操作类

下面是实现可用于多种数据库操作的 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 类分别添加了 insertupdate 方法,用于执行 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);

在以上示例代码中,我们首先实例化了 MySQLDBPostgreSQLDB 两个类,并使用它们的 insertupdate 方法来执行 SQL 插入和更新操作。最后,我们调用了 getSchema 方法来获取 PostgreSQL 数据库的结构信息。通过实例化不同的类,我们可以非常方便地操作不同类型的数据库。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现可用于mysql,mssql,pg数据库操作类 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言实现哈夫曼树

    C语言实现哈夫曼树攻略 什么是哈夫曼树? 哈夫曼树是一种二叉树,将一组权值作为叶子结点,构造出一个有最小带权路径长度的树,被用于数据压缩和加密等领域。 实现哈夫曼树的基本思路 具体步骤如下: 根据给定的权值序列,按照从小到大的顺序,将权值存入森林F中,森林F中的每棵树都是只含一个节点的哈夫曼树; 从森林F中选出两棵根节点权值最小的树作为左右子树构造一棵新的二…

    C 2023年5月23日
    00
  • C语言实现数独游戏

    C语言实现数独游戏攻略 介绍 数独是一种逻辑填数游戏,通过在九宫格中填入数字1-9,使得每行、每列、每个九宫格内的数字都没有重复。C语言可以实现数独游戏,并对玩家的答案进行检测。 步骤 1. 定义九宫格 首先需要定义一个二维数组来表示数独的九宫格。在C语言中,可以使用如下代码定义一个9×9的九宫格: int grid[9][9]; 2. 初始化九宫格 在定义…

    C 2023年5月23日
    00
  • JavaScript简单实现合并两个Json对象的方法示例

    下面我将详细讲解“JavaScript简单实现合并两个Json对象的方法示例”的完整攻略。 1. 什么是Json对象 Json对象是一种轻量级的数据交换格式,它以易于阅读和编写的文本格式呈现,用于异构系统间的数据交换。 2. Json对象的合并 有时候我们需要将两个Json对象合并成一个,这时可以使用JavaScript的extend方法来实现Json对象的…

    C 2023年5月23日
    00
  • C语言关于文件的操作方法总结

    C语言关于文件的操作方法总结 文件操作是 C 语言中常用的功能之一。本文将综合介绍 C 语言操作文件的各种方法,包括打开文件、读取文件、写入文件、关闭文件,以及文件指针的使用。 打开文件 在 C 语言中,打开文件必须使用 fopen() 函数。这个函数有两个参数:文件名和打开模式。文件名是需要打开的文件名字符串,打开模式参数指定打开文件时的操作。 以下是一些…

    C 2023年5月23日
    00
  • C++实现宿舍管理查询系统

    C++实现宿舍管理查询系统攻略 1. 系统介绍 C++实现宿舍管理查询系统是一款基于控制台界面的宿舍管理查询应用。该系统主要用于方便宿舍管理员进行学生入住管理和住宿情况查询。系统功能包括:学生信息录入、住宿信息录入、学生信息查询、住宿信息查询、学生信息删除等。 2. 开发环境 操作系统:Windows 10 编程语言:C++ 集成开发环境:Visual St…

    C 2023年5月23日
    00
  • Rust 能够取代 C 语言吗

    可以开始讨论“Rust能否取代C语言”这个话题了。对于这个问题,我们可以从以下几个方面入手: 1. 性能表现 C语言因历史悠久和底层的特性而被广泛使用。因为C语言非常接近机器硬件,它能够直接访问内存和硬件资源,因此具有非常高的性能。但C语言在安全方面较差,容易出现内存泄漏和指针错误等问题。 Rust语言是一个新型的系统编程语言,它被设计为具有高性能和内存安全…

    C 2023年5月22日
    00
  • 浅谈JSON.parse()和JSON.stringify()

    浅谈JSON.parse()和JSON.stringify() JSON.parse()和JSON.stringify()是JavaScript中常用的JSON数据解析和生成方法,它们可以让我们轻松地将JavaScript的对象或数组转换为JSON格式,或者将JSON格式的数据转换为JavaScript的对象或数组。本文将从以下几个方面进行详细讲解: JSO…

    C 2023年5月23日
    00
  • Vue-admin-template 报Uncaught (in promise) error问题及解决

    问题描述: 在使用 Vue-admin-template 开发项目时,如果使用路由时出现了以下报错,可能会导致页面无法正常加载: Uncaught (in promise) Error: Redirected when going from “/xxx” to “/xxx” via a navigation guard. 这个问题可能是由于路由中的钩子函数未…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部