PHP的数据库连接、管理和统计库。

2.0.0 2016-08-31 11:29 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:36:59 UTC


README

Build Status Code Quality Code Climate PHP 7 ready HHVM Latest Stable Version License

phossa2/db是一个PHP数据库连接管理库,用于处理与数据库的交互。

它需要PHP 5.4,支持PHP 7.0+和HHVM。它遵循PSR-1PSR-2PSR-3PSR-4,以及提议的PSR-5

特性

  • 简单接口。没有你不需要的。

  • 支持多个数据库平台/驱动,目前支持PDO(所有PDO驱动)和Mysqli。

  • 通过驱动管理器处理多个连接

    • 轮询负载均衡

      使用轮询方式使用多个数据库连接,并支持权重因子(1-10)。每个连接都会被监控(ping)。

    • 驱动标记,用户可以将不同的数据库连接标记为“读取器”或“写入器”等。

  • 易于分析,获取每个执行的SQL及其执行时间。

  • 安全。所有SQL都通过低级驱动程序中的prepare/execute执行。

安装

通过composer工具安装。

composer require "phossa2/db"

或者将以下行添加到您的composer.json

{
    "require": {
       "phossa2/db": "2.*"
    }
}

用法

  • 驱动

    • DDL

      use Phossa2\Db\Driver\Pdo\Driver as Pdo_Driver;
      
      $db = new Pdo_Driver([
          'dsn' => 'mysql:dbname=test;host=127.0.0.1;charset=utf8'
      ]);
      
      // simple delete
      if ($db->query("DELETE FROM test WHERE id < 10")) {
          echo sprintf("%d records deleted", $db->affectedRows()) . \PHP_EOL;
      } else {
          echo $db->getError() . \PHP_EOL;
      }
      
      // with parameters
      if ($db->query("INSERT INTO test (val) VALUES (?)", [ 100 ])) {
          echo sprintf("last id is %d", $db->lastInsertId()) . \PHP_EOL;
      } else {
          echo $db->getError() . \PHP_EOL;
      }
    • SELECT

      // simple select
      if ($db->query("SELECT * FROM test WHERE id < 10")) {
          $rows = $db->getResult()->fetchAll();
      } else {
          echo $db->getError() . \PHP_EOL;
      }
      
      // fetch first 5 rows
      if ($db->query("SELECT * FROM test WHERE id > ? LIMIT ?", [10, 20])) {
          $rows = $db->getResult()->fetchRow(5);
      }
      
      // fetch first field
      if ($db->query("SELECT id, name FROM test WHERE id < :id", ['id' => 10])) {
          $cols = $db->getResult()->fetchCol('id');
      }
  • 语句

    Statement在执行$db->prepare()后返回。

    // PREPARE using prepare()
    if ($db->prepare("SELECT * FROM test WHERE id < :id")) {
        $stmt = $db->getStatement();
        if ($stmt->execute(['id' => 10])) {
            $rows = $stmt->getResult()->fetchAll();
        }
    } else {
        echo $db->getError() . \PHP_EOL;
    }
  • 结果

    Result通过$db->getResult()$stmt->getResult()返回。

    if ($db->query('SELECT * FROM test')) {
        // SELECT
        if ($db->getResult()->isSelect()) {
            // get fields count
            $fieldCount = $db->getResult()->fieldCount();
            // row count
            $rowCount = $db->getResult()->rowCount();
    
        // DDL
        } else {
            $affectedRows = $db->getResult()->affectedRows();
        }
    }

Mysqli

也支持Mysqli驱动。

use Phossa2\Db\Driver\Mysqli\Driver as Mysqli_Driver;

$db = new Mysqli_Driver([
    'db' => 'mysql',
    'host' => '127.0.0.1',
    'charset' => 'utf8'
]);

// simple delete
if ($db->query("DELETE FROM test WHERE id < ?", [10])) {
    echo sprintf("%d records deleted", $db->affectedRows()) . \PHP_EOL;
} else {
    echo $db->getError() . \PHP_EOL;
}

注意:Mysqli驱动不支持命名参数。

驱动管理器

驱动管理器管理多个数据库连接。权重因子N表示添加虚拟N次驱动。将具有因子5的驱动A和具有因子1的驱动B添加到池中,意味着在调用getDriver()时,用户将获得5次A而不是一次B

// dbwriter 1
$db1 = (new Phossa2\Db\Driver\Pdo\Driver($conf1))->addTag('RW');

// dbreader 2
$db2 = (new Phossa2\Db\Driver\Pdo\Driver($conf2))->addTag('RO');

// dbreader 3
$db3 = (new Phossa2\Db\Driver\Pdo\Driver($conf3))->addTag('RO');

// db manager
$dbm = (new Phossa2\Db\Manager\Manager())
    ->addDriver($db1, 1)    // writable connection with factor 1
    ->addDriver($db2, 5)    // read_only, factor 5
    ->addDriver($db3, 5)    // read_only, factor 5

// get a db connect, no matter writer or reader
$db = $dbm->getDriver();

// get a readonly driver
$db = $dbm->getDriver('RO');

SQL分析

获取执行的SQL及其执行时间。

// init driver
$db = new Phossa2\Db\Driver\Pdo\Driver($conf);

// enable profiling
$db->enableProfiling();

// execute a DELETE
$db->query("DELETE FROM test WHERE test_id > 10");

// get sql
$sql = $db->getProfiler()->getSql();
$time = $db->getProfiler()->getExecutionTime();

方法重载

在查询成功执行后,可以通过数据库驱动访问来自Phossa2\Db\Interfaces\ResultInterface的方法。

if ($db->query('SELECT * FROM test')) {
    // normally is $db->getResult()->fetchAll()
    $rows = $db->fetchAll();
}

变更日志

请参阅CHANGELOG以获取更多信息。

测试

$ composer test

贡献

请参阅CONTRIBUTE以获取更多信息。

依赖

  • PHP >= 5.4.0

  • phossa2/shared >= 2.0.25

许可

MIT许可