luri / bddi
Requires
- php: >=7.1
- luri/bddi-common: ~1.0-BETA1
- luri/bddi-driver: ^1.0
Requires (Dev)
- luri/bddi-mock-driver: ~1.0-BETA3
- phpunit/phpunit: ^7
This package is auto-updated.
Last update: 2024-09-20 22:02:49 UTC
README
BDD-I 是一个功能强大且简单的数据库请求抽象层。它简化了数据库操作。
- 自动连接
- 自动事务
- 支持多数据库/登录连接
- 有用的响应获取器
- 支持用于 IN() 语法的数组变量
- 支持预处理语句中的匿名 (?) 和命名参数 (:NAME)
专注于你的查询!
专为小型和中型网站简单使用而设计。
目录
安装
通过 Composer
$ composer require luri/bddi
你必须添加一个 低级驱动器,例如
$ composer require luri/bddi-mysqli-driver
警告:此项目处于 BETA 版。你必须将 "minimum-stability" 属性设置为 "beta"。
$ composer config minimum-stability beta
测试
要执行 phpunit 测试:(你必须使用 dev 依赖安装项目)
$ composer test
关于此库
四年前,我开始帮助重做一个小的 PHP 粉丝游戏 (SWHologame)。我很快注意到他们的数据库代码很难用。我认为如果 Db 类专注于查询并且数据库连接由此类管理,这将更简单。我重写并适配了一个旧的数据库访问类。Bdd-I v2 诞生了。
去年,我想将这个 Db 类用于其他一些项目,但 BDD-I v2 是一个庞大的单体类,与 SWHologame 的其他特定类紧密交织在一起。因此,我开始开发这个重构:BDD-I v3。
对于某些项目,我需要一个可以用于不同数据库的库,但我不想失去我的辅助获取器。我不想使用 PDO,因为 (4-5 年前) PDO-MYSQL 不支持多次使用同一结果。
我认为最好的办法是将高级逻辑与低级逻辑(PHP 数据库扩展的适配器)分开。这样可以允许某人开发他们想要的驱动器。
在类组织方面,我深受 Eric GELOEN 和 Márk Sági-Kazár 的 php-http/httplug 的启发
graph TD;
subgraph "user Application"
U1(Application);
U2(user DbConfig);
end
subgraph "Bdd-I"
A(Query);
B(QuerySet);
C(DbFactory);
end;
subgraph
D(Common Interfaces);
end;
subgraph "Low level drivers"
E(LlMysqli);
F(Mock);
G("LlSQLite (todo)");
end
subgraph "PHP extensions"
H(Mysqli);
I(SQLite 3);
end
classDef BlackTxt stroke:#000,fill:#ccf;
class U1 BlackTxt;
class U2 BlackTxt;
class A BlackTxt;
class B BlackTxt;
class C BlackTxt;
class D BlackTxt;
class E BlackTxt;
class F BlackTxt;
class G BlackTxt;
class H BlackTxt;
class I BlackTxt;
U1-->A;
U1-->B;
U2---C;
A-->D;
B-->D;
D-->E;
D-->F;
D-->G;
E-->H;
G-->I;
基本用法
你必须创建自己的 DbConfig 文件,见下文
要执行单个请求,请使用 Query 类。例如
<?php
/* DATA SQL EXAMPLE :
*
* CREATE TABLE IF NOT EXISTS `singer` (
* `idsinger` int(11) NOT NULL AUTO_INCREMENT,
* `name` varchar(100) NOT NULL,
* `nationality` varchar(100) NOT NULL,
* PRIMARY KEY (`idsinger`)
* ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
*
* INSERT INTO `singer` (`idsinger`, `name`, `nationality`) VALUES
* ('1', 'Bars and Melody', 'British'),
* ('2', 'Eddy De Pretto', 'French'),
* ('3', 'Greyson Chance', 'U.S.A.'),
* ('4', 'Troye Sivan', 'Australian'),
* ('5', 'Ronan Parke', 'British')
*/
require_once 'DbConfig.php'; //See below "Configuration"
require_once 'libs/autoload.php'; //composer require
use Luri\BddI\Query;
?>
<html>
<body>
<ul>
<?php
//Simple example
$singer = new Query("<SINGER_LIST>", "SELECT name FROM singer");
foreach ($singer as $v) {
echo ' <li>' . htmlentities($v['name']) . "</li>\n";
}
unset($singer); //= free result
?>
</ul>
<h2>List of information about Ronan Parke (id:2)</h2>
<?php
//Fluent interface syntax
//Remember all variable is insecure ! You must use prepared statement if you use variable :
$id = 5; //probably a $_GET['xxx'] here. Think verify validy of your $_GET parameter
$infos = Query::factory('<INFO>')
->addReq('SELECT * FROM singer WHERE idsinger = :ID')
->addDatas([':ID' => $id])
->exe()
->getLineNumber(); //this return the first line of the result
?>
<p>Nom : <?php echo htmlentities($infos['name']); ?></p>
<p>Nationality : <?php echo htmlentities($infos['nationality']); ?></p>
...
要一次性执行 2 个或更多 Query,例如一组 INSERT 或 UPDATE 请求,请使用 QuerySet 类。
配置
嗯,你必须配置 bdd 账户。这可以通过在脚本顶部包含你自己的 DbConfig.php 来轻松完成。
DbConfig.php 的示例
<?php
namespace Luri\BddI {
/**
* Configuration Class
*/
abstract class DbConfig {
/**
* Config of database
* Here, We have 3 accessible db with id trampo, gac and forum.
* trampo is the database 'test' in local server
* gac is the database 'gac' in local server
* forum is the dabase 'forum' in forum.example.org server
*/
protected const DBCONFIG = [
'trampo' => [ //db id for use in you apps
'name' => 'test', //Db name in SQL server
'server' => 'local' //SQL server Id in SERVERCONFIG
],
'gac' => [ //db id for use in you apps
'name' => 'gac', //Db name in SQL server
'server' => 'local' //SQL server Id in SERVERCONFIG
],
'forum' => [ //db id for use in you apps
'name' => 'forum', //Db name in SQL server
'server' => 'db2' //SQL server Id in SERVERCONFIG
],
];
/**
* Config of server
* Here, we have 2 configured server with id local and db2. This id must be used in DBCONFIG['xx']['server'] parameter (see overhead)
* You can also define 2 servers in same address but with different login.
*/
protected const SERVERCONFIG = [
'local' => [ ////SQL server Id
'login' => 'root', //Login for this connexion (you MUST not use root)
'password' => 'root', //Password for this connexion (you MUST create a robust password)
'address' => '127.0.0.1', //IP address for SQL server
'lowLevelDriver' => '\Luri\BddI\LowLevel\LlMysqli', //Name of low level driver class to use
'charset' => 'utf8' //Charset to use
],
'db2' => [ ////SQL server Id
'login' => 'root', //Login for this connexion (you MUST not use root)
'password' => 'root', //Password for this connexion (you MUST create a robust password)
'address' => 'forum.example.org', //IP address for SQL server
'lowLevelDriver' => '\Luri\BddI\LowLevel\LlMysqli', //Name of low level driver class to use
'charset' => 'utf8' //Charset to use
],
];
/**
* Default database
*
* This is the database used if no database id is passed to Query or QuerySet class.
*
* @var string
*/
protected const DEFAULTDATABASE = 'trampo';
}
}
namespace {
// you're global code
}
?>
嗯,你可以选择除了 DbConfig.php 之外的其他文件名。但不要更改类名或命名空间名。
低级驱动器
- Mysqli 驱动器
- Mock 驱动器
Mysqli 驱动器不使用比持久连接更高级的功能。如果你愿意,你可以开发一个新的驱动器。
为什么选择 mysqli 驱动器而不是 PDO 驱动器? 当我在很多年前创建 V2 时,我比较了 PDO 和 Mysqli 用于我的用途(小型数据库)。使用 mysqli,我可以多次使用同一结果,但不能使用命名占位符。使用 PDO,我可以使用命名占位符,但不能多次使用同一结果。所以我选择使用 mysqli 并为 mysqli 开发命名占位符支持。
创建一个新的低级驱动器
如果你想添加强大的功能,请确保它们易于使用和配置。
待续...
待办事项列表
V1 之前
- 定义一组异常
- 添加日志支持
- 还有一个第三件事,但我记不起来了
- 编写文档
文档
待办事项 ;-)
作者
我是来自法国(阿尔卑斯山)的Luri,我从学校时代就开始学习PHP,一直用到PHP 3。但PHP只是我的兴趣爱好(像奥运蹦床、滑雪等),并不是我的工作。我没有太多时间进行开发。欢迎任何形式的帮助。如果有人想接管这个库,请与我联系,非常欢迎。
邮箱:Luri AT e DOT email 如果您懂法语,请使用法语。否则请使用英语。
许可证
BDD-I是在CECILL-C许可证的条款下分发的:[英文](https://cecill.info/licences/Licence_CeCILL-C_V1-en.html) | [法语](https://cecill.info/licences/Licence_CeCILL-C_V1-fr.html)
CECILL-C是由开源倡议组织(OSI)认可的免费软件许可证。这个许可证比L-GPL许可证更有保护性,因为它受到法国法律的保护。(法国法律不承认软件专利)