neoan3 mysqli 类


README

neoan3 mysqli 连接应用

  • 有意见(但可配置)
  • 快速开发
  • 安全(预处理语句和额外安全措施)
  • 在任何(如果有)框架中“即插即用”

专为 neoan3 设计,但也可作为独立应用使用

预处理语句

所有查询都作为预处理语句执行,通过额外的安全措施来净化列。

在此文件中,您将找到表示简化 SQL 功能的示例。这些示例 不是 实际由包装器执行的查询,而是旨在提供对包装器功能的基本理解。

快速开始

简单的 SELECT

// SELECT name FROM user WHERE id = 1
// returns e.g.: [0=>['name'=>'Adam']]

$user = Db::easy('user.name',['id'=>1]);

简单的 INSERT

// INSERT INTO user(name,email) VALUES('Sam','sam@sam.example')

$insert = ['name'=>'Sam','email'=>'sam@sam.example'];
$newId = Db::user($insert);

简单的 UPDATE

// UPDATE user SET name = 'Sam', email = 'sam@sam.example' WHERE id = 1

$update = ['name'=>'Sam','email'=>'sam@sam.example'];
Db::user($update, ['id'=>1]);

查看 test/test.php 获取更多快速开始示例或深入了解

Watch the video

安装

composer require neoan3-apps/db

require dirname(__FILE__).'/vendor/autoload.php'

use Neoan3\Apps\Db;

Db::setEnvironment([
    'name' => 'your_db',
    'user' => 'root',
    'password' => 'Som3S3cur3Pa55word'
])

/*
*    OR per defines:
*    define('db_host','localhost');
*    define('db_name','yourDB');
*    define('db_user','root');
*    define('db_password','Som3S3cur3Pa55word');
*/

try {
    $test = Db::ask('>NOW() as now'); 
} catch(DbExeption $e){
    die($e->getMessage());
}


/*
*    $test: [0=>['now'=>'2019-01-01 12:12:12']]
*/

环境变量

环境变量可以设置为全局常量或使用 Db::setEnvironment()

/*
* When using Db::setEnvironment() the prepended 'db_' is ommitted.
*/

// set single variable:
Db::setEnvironment('name','test_db');

// set multiple variables:
Db::setEnvironment(['name'=>'test_db','password'=>'FooBar']);

我们建议在您的框架中使用 neoan3 时定义这些值。

约定

此工具是考虑到推荐的 neoan3 数据库结构而创建的。因此,为了最佳可用性,以下假设(如自动连接等)被采用。(见 环境变量

  • 表使用 snake_case 命名
  • 列使用 snake_case 命名或 cameCase 命名
  • 主键要么是 int(11) 自动增长的,要么是 binary(16)
  • 主键被称为 "id",外键关系被称为 [table_name]_id 或 [table_nameId]
  • 处理标记为已删除的行时,字段名称必须是 "delete_date" 或 "deleteDate"(类型可以是 DATE 或 DATETIME)

入门

Db::easy($selectorString [, $conditionArray, $callFunctions, $debug])

easy 函数将字符串转换为预处理语句并执行它。它返回关联数组数组。easy 标记是表示数据库结构的简化选择字符串。

查看 operandiselectandi 了解更多复杂性

Db::ask($param1 [, $param1, $param1])

ask 函数可以根据其使用方式执行查询。最好从下面的示例开始理解。它返回关联数组数组。

/component/user/user.sql

SELECT * FROM user WHERE CONCAT_WS(' ',first_name,last_name) LIKE {{name}}

使用 ANY 动作,SQL 可以以编辑器友好的格式管理。默认情况下,定位器期望 neoan3 文件夹 "component"(见环境变量)并理解以下格式

/[file] = '/[db_file_location]/[file]/[file].sql'(如上所示)

或更深层次的变体,如

/[folder]/[file] = '/[db_file_location]/[folder]/[file].sql'

关于参数的顺序没有考虑。使用大括号命名目标将确保只使用匹配的数组键。

这使得直接处理用户输入变得安全。

魔术方法调用

Db::ask 为什么会有这样的名字?因为 ask 函数是您 不需要 担心的东西。这是在幕后发生的事情,可以通过调用魔术方法来替换。

As-声明

处理字段名称修改。

条件修饰符(operandi)

可以通过字符串操作条件数组来应用常见的条件修改。

但是,如果传递给运算符的值以修饰符开头怎么办?您可以在修饰符前面加上等号 '=' 以防止运算符被触发!例如:

Db::ask('password',['password'=>'='.password_hash('123456', PASSWORD_DEFAULT)])

值修饰符(选择运算符)

可以通过选择语句的字符串操作应用常见的值修饰。应与 "as-声明" 一起使用这些修饰符。

但是,如果传递给选择运算符的值以修饰符开头怎么办?您可以在修饰符前面加上等号 '=' 以防止运算符被触发!我们不提供示例,因为这只会发生在您的列名以违反安全 过滤器字符 设置的开头字符开头时。

Db-easy 标记

说实话:我们的大多数查询都比较简单。每次我们需要更复杂的查询时,我们总会意识到纯 SQL 比无休止封装的数组更容易阅读。这就是使用 Db::ask 的 "any" 动作发挥作用的地方。

Db::easy 不会针对这些场景,而是专注于日常检索特定数据集。选定的列写在一个单独的字符串中。

从表中选择多个列

一个表的多列之间用空格分隔

// SELECT first_name, last_name FROM user

Db::easy('user.first_name user.last_name');

简单的连接

连接是基于字符串中从左到右出现的顺序生成的,尊重第一个使用的表作为 "主表"。Easy 只能在使用推荐的数据库结构时执行 JOIN。这意味着外键必须采用 "master"_id 的格式。

// SELECT 
//   user.first_name, 
//   user.last_name, 
//   user_email.email, 
//   user_password.confirm_date
// FROM user 
// JOIN user_email ON user_email.user_id = user.id
// JOIN user_password ON user_password.user_id = user.id

Db::easy('user.first_name user.last_name user_email.email user_password.confirm_date');

面向对象编程与测试

尽管您可能想要根据您框架使用的接口编写自己的包装器,但这个库自带了一个简单的包装器,以鼓励使用依赖注入。

$environment = ['name' => 'my_db'];
$database = new \Neoan3\Apps\DbOOP($environment);
$database->easy('user.*', ['^delete_date']); //executes & returns Db::easy 
$database->smart('user', ['name'=>'sam', 'user_type'=>'admin']); //executes & returns Db::ask

请注意

db-app 的一般方法已经应用了多年。虽然与常见的 mysqli 或 pdo 包装器相比,差异似乎很大,但开发者通常会惊讶于它提供的低学习曲线和更快开发的可能性。

弃用

Db::data 函数被认为在不适当转义的情况下是不安全的,自 0.0.3 版本以来抛出了弃用通知。