简化版/db

简化版数据库库

1.2.10 2013-11-20 09:48 UTC

This package is auto-updated.

Last update: 2024-09-21 00:29:30 UTC


README

     _                 _                   _ _     
 ___(_)_ __ ___  _ __ | | ___  _ __     __| | |__  
/ __| | '_ ` _ \| '_ \| |/ _ \| '_ \   / _` | '_ \ 
\__ \ | | | | | | |_) | | (_) | | | | | (_| | |_) |
|___/_|_| |_| |_| .__/|_|\___/|_| |_|  \__,_|_.__/ 
                |_|                                

简化版/Db

版本 1.1.0

简介

我的大多数项目都需要至少一种数据库类型的数据。为了处理所有通信,我编写了一些接口库,这些库帮助我处理日常编码的乐趣。我使用过所有受支持的数据库,因此所有这些接口都已被编写。

在过去的几个月里,我主要使用MySQL配置,并使用Redis作为缓存存储。我之前使用过Memcached,我认为它在预期任务上很稳定。我现在关闭了Couchbase章节,尽管我认为这是一个好主意。然而,我对它的性能以及与Redis相比不够成熟的行为并不满意。

支持的数据库

依赖项

所有库的大部分部分都将与PHP 5.3兼容。然而,由于我正在过渡到PHP 5.4,您会发现部分PHP 5.4代码。这将根据我找到的时间而增长。以下列出了所有依赖项

安装

您可以通过从github下载软件包或通过composer安装来安装Simplon/Db。我鼓励您使用后者

{
  "require": {
    "simplon/db": "1.1.0"
  }
}

根据您想使用的数据库,请注意上面列出的依赖项。

1. 使用MySQL

假设所有所需的数据库及其依赖项都已安装,让我们做一些编码。

1.1 MySQL连接

让我们创建一个MySQL连接实例

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = Mysql::Instance('localhost', 'test', 'rootuser', 'rootuser');

创建mysql实例的另一种方法是使用DbInstance类。该类创建实例,并在运行时将其作为单例保留在连接池中 - 如果您需要保留多个连接

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

1.2 MySQL查询

在查询数据库时,我们又有两种选择。第一种选择是直接通过EasyPDO访问数据库,它是PDO包装器

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

// ##############################################

// query
$results = $dbInstance->FetchAll('SELECT * FROM foobar WHERE ekey = :key', ['key' => 'BB']);

// dumps assoc. array of FALSE when fails
var_dump($results);

另一种选择需要使用SqlManager类。为了使用此类,我们需要传递一个构建模式类,即SqlQueryBuilder,以与我们的数据库通信。这有什么优势?好吧,如果我们想在发送查询之前对查询做更多的事情,我们可以在SqlQueryBuilder中将它封装为一个对象。从那里开始,我们可以在应用程序中传递它,以添加更多数据或类似内容,在最终将查询发送到数据库之前

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

// ##############################################

// create SqlManager instance
$sqlManager = new \Simplon\Db\SqlManager($dbInstance);

// query builder
$sqlQuery = (new \Simplon\Db\SqlQueryBuilder())
    ->setQuery('SELECT * FROM foobar WHERE ekey = :key')
    ->setConditions(['key' => 'BB']);

// query
$results = $sqlManager->fetchAll($sqlQuery);

// dumps assoc. array of FALSE when fails
var_dump($results);

两种选择共有的特点是命名参数ekey = :key,这些参数由条件/数据数组键标识。

1.3 MySQL插入/更新

插入/更新数据集的方式因选项而异。以下示例可以帮助您更好地理解

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

// ##############################################

// query: inserts one new row
$data = ['id' => NULL, 'ekey' => 'DD'];
$dbInstance->ExecuteSQL('INSERT INTO foobar VALUES (:id, :ekey)', $data);

// ##############################################

// query update
$data = ['id' => 5, 'ekey' => 'FF'];
$dbInstance->ExecuteSQL('UPDATE INTO foobar VALUES (:ekey) WHERE id = :id', $data);

以下是我们的SqlManager解决方案,带有SqlQueryBuilder

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

// ##############################################

// query: inserts one new row
$data = ['id' => NULL, 'ekey' => 'DD'];

$sqlQuery = (new SqlQueryBuilder())
->setTableName('foobar')    // define the table name
->setData($data);           // set data (keys = database column name)

$sqlManager->insert($sqlQuery);

// ##############################################

// query update
$conds = ['id' => 5];
$data = ['ekey' => 'FF'];

$sqlQuery = (new SqlQueryBuilder())
->setTableName('foobar')    // define the table name
->setConditions($conds)     // set conditions
->setData($data);           // set data (keys = database column name)

$sqlManager->update($sqlQuery);

区别在于后者方法我们不需要编写任何重复的SQL语句,这反过来又导致了更好的维护和代码概览。

1.4 MySQL 删除数据集

时不时地我们还需要删除几个数据集。再次,以下两个示例

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

// ##############################################

// query
$dbInstance->ExecuteSQL('DELETE FROM foobar WHERE id = :id', ['id' => 5]);

SqlManager 与 SqlQueryBuilder

require __DIR__ . '/../vendor/autoload.php';

// connect to server "localhost", db "test" with user/pass "rootuser/rootuser"
$dbInstance = \Simplon\Db\DbInstance::MySQL('localhost', 'test', 'rootuser', 'rootuser');

// ##############################################

// query
$sqlQuery = (new SqlQueryBuilder())
->setTableName('foobar')        // define the table name
->setConditions(['id' => 5]);   // set conditions

$sqlManager->remove($sqlQuery);

1.5 MySQL 概述:直接访问

  • 连接(两种选项都有效)
    • Mysql::Instance(HOST, DB, USER, PASSWORD)
    • \Simplon\Db\DbInstance::MySQL(HOST, DB, USER, PASSWORD)
      • 返回:DbInstance
  • 获取所有找到的数据
    • DbInstance->FetchAll(QUERY, CONDS)
      • 返回一个关联数组
    • DbInstance->FetchArray(QUERY, CONDS)
      • 返回一个数组
    • DbInstance->FetchObject(QUERY, CONDS)
      • 返回一个对象
  • 分步获取
    • DbInstance->Fetch(QUERY, CONDS)
      • 返回一个迭代指针,这对于非常大的结果集至关重要
  • 获取一列值
    • DbInstance->FetchValue(QUERY, CONDS)
      • 返回第一个选择的列
  • 插入数据
    • DbInstance->ExecuteSql(INSERT-QUERY, DATA)
      • 返回插入-id或null。失败时返回FALSE
  • 更新数据
    • DbInstance->ExecuteSql(UPDATE-QUERY, DATA)
      • 失败时返回FALSE
  • 删除数据
    • DbInstance->ExecuteSql(DELETE-QUERY, DATA)
      • 失败时返回FALSE

1.6 MySQL 概述:通过 SqlManager 与 SqlQueryBuilder 访问

  • 连接(两种选项都有效)
    • Mysql::Instance(HOST, DB, USER, PASSWORD)
    • \Simplon\Db\DbInstance::MySQL(HOST, DB, USER, PASSWORD)
      • 返回:DbInstance
  • SqlManager 实例
    • SqlManager = new \Simplon\Db\SqlManager(DbInstance)
  • 获取所有找到的数据
    • SqlQueryBuilder = (new SqlQueryBuilder)->setQuery(QUERY)->setConditions(CONDS)
    • SqlManager->fetchAll(SqlQueryBuilder)
      • 返回一个关联数组
  • 分步获取
    • SqlQueryBuilder = (new SqlQueryBuilder)->setQuery(QUERY)->setConditions(CONDS)
    • SqlManager->fetchCursor(SqlQueryBuilder)
      • 返回一个迭代指针,这对于非常大的结果集至关重要
  • 获取一列值
    • SqlQueryBuilder = (new SqlQueryBuilder)->setQuery(QUERY)->setConditions(CONDS)
    • SqlManager->fetchColumn(SqlQueryBuilder)
      • 返回第一个选择的列
  • 插入数据
    • SqlQueryBuilder = (new SqlQueryBuilder)->setTableName(TABLENAME)->setData(DATA)
    • SqlManager->insert(SqlQueryBuilder)
      • 返回插入-id或null。失败时返回FALSE
  • 更新数据
    • SqlQueryBuilder = (new SqlQueryBuilder)->setTableName(TABLENAME)->setConditions(CONDS)->setData(DATA)
    • SqlManager->update(SqlQueryBuilder)
      • 失败时返回FALSE
  • 删除数据
    • SqlQueryBuilder = (new SqlQueryBuilder)->setTableName(TABLENAME)->setConditions(CONDS)
    • SqlManager->remove(SqlQueryBuilder)
      • 失败时返回FALSE

2. 使用 Redis

工作正在进行中...

变更日志

版本 1.1.0

  • 重构了 Redis 库,因为它有 >3000 行代码
  • Redis 库已经根据其命令分开
  • RedisManager 提供了所有命令类的引用