luri / bddi

一个用于简化SQL请求的库,自动设置预处理语句和自动连接。

维护者

详细信息

framagit.org/bdd-i/bdd-i.git

主页

v3.0BETA9 2021-02-20 14:08 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许可证更有保护性,因为它受到法国法律的保护。(法国法律不承认软件专利)