neoan3 mysqli 类
Requires
- php: ^7.4||^8
- ext-ctype: *
- ext-mysqli: *
Requires (Dev)
- phpunit/phpunit: ^9.5
- dev-master
- v0.3.10
- v0.3.9
- v0.3.8
- v0.3.7
- 0.3.6
- 0.3.5
- 0.3.4
- 0.3.2
- 0.3.0
- 0.2.1
- 0.2.0
- 0.1.4
- 0.1.2
- 0.1.1
- 0.1.0
- 0.0.9
- 0.0.8
- 0.0.7
- 0.0.6
- 0.0.4
- dev-release/0.3.10
- dev-release/0.3.9
- dev-release/0.3.6
- dev-encoding
- dev-release/0.3.5
- dev-php-8-update
- dev-version-update
- dev-debug-patch
- dev-port-support
- dev-release/0.2.1
- dev-feature/table-column-conventions
- dev-release/0.1.1
- dev-release/0.1.0
- dev-release/0.0.9
- dev-release/0.0.8
- dev-error-handler
- dev-prepared_stmt
This package is auto-updated.
Last update: 2024-09-18 16:46:21 UTC
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 获取更多快速开始示例或深入了解
安装
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 标记是表示数据库结构的简化选择字符串。
查看 operandi 和 selectandi 了解更多复杂性
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 版本以来抛出了弃用通知。