简化版 / db
简化版数据库库
Requires
- php: >=5.4
- fightbulc/easy_pdo: 0.1.*
Suggests
README
_ _ _ _ ___(_)_ __ ___ _ __ | | ___ _ __ __| | |__ / __| | '_ ` _ \| '_ \| |/ _ \| '_ \ / _` | '_ \ \__ \ | | | | | | |_) | | (_) | | | | | (_| | |_) | |___/_|_| |_| |_| .__/|_|\___/|_| |_| \__,_|_.__/ |_|
简化版/Db
版本 1.1.0
简介
我的大多数项目都需要至少一种数据库类型的数据。为了处理所有通信,我编写了一些接口库,这些库帮助我处理日常编码的乐趣。我使用过所有受支持的数据库,因此所有这些接口都已被编写。
在过去的几个月里,我主要使用MySQL配置,并使用Redis作为缓存存储。我之前使用过Memcached,我认为它在预期任务上很稳定。我现在关闭了Couchbase章节,尽管我认为这是一个好主意。然而,我对它的性能以及与Redis相比不够成熟的行为并不满意。
支持的数据库
依赖项
所有库的大部分部分都将与PHP 5.3兼容。然而,由于我正在过渡到PHP 5.4,您会发现部分PHP 5.4代码。这将根据我找到的时间而增长。以下列出了所有依赖项
- PHP >= 5.4.8
- MySQL:EasyPDO
- Redis:phpiredis (PHP绑定) for hiredis (Redis的C客户端)
- Couchbase:PHP客户端库 with C客户端库
- Memcached:libevent
安装
您可以通过从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 提供了所有命令类的引用