数据库使用

为了简化调用,KaliPHP 框架数据库主要考虑使用 MySQL(ClickHouse),并没有考虑其他数据库的情况,因此并没有很复杂的数据库驱动之类的数据类结构,并且只支持mysqli函数,使用时记得安装mysqli扩展。

db类的成员方法都是静态方法,因此使用时不需要初始化。

连接配置

数据库库信息都配置在app/config/database.php中,也可根据环境配置在database_dev.php/database_pre.php/database_pub.php里面

基本参数如下:

// app/config/database_dev.php
return array(
    'config' => array(
        // 库名
        'name'       => 'kali',
        // 用户名
        'user'       => 'root',
        // 密码
        'pass'       => 'pwd',
        // 端口号
        'port'       => 3306,
        // 编码格式
        'charset'    => 'utf8',
        // 是否长链接(默认关闭, mysqli的长链问题很多)
        'keep-alive' => true,
        // 表前缀
        'prefix'     => 'kali',
        // 是否对SQL语句进行安全检查并处理,在插入十万条以上数据的时候会出现瓶颈
        'safe_test'  => true,
        // 慢查询阀值,秒
        'slow_query' => 0.5,
        // 库IP
        'host' => array(
            // 主库IP
            'master' => '192.168.0.2:3306',
            // 从库IP, 支持多个从库,随机链接
            'slave'  => array('192.168.0.3:3306', '192.168.0.4:3306', '192.168.0.5:3306')
        ),
        // 字段加密key
        'crypt_key' => 'key',
        // 需要加解密字段, 字段类型记得采用BLOB
        'crypt_fields' => array(
            'kali_member' => array( 'name', 'email', 'address' ),
        ),
        // JSON类型字段
        'json_fields' => array(
            'kali_product' => array( 'params' ),
        ),
    )
);

如果你有多个项目需要用到同一份配置,只需要把上面的配置放在公共处,在你需要使用处引用

主从操作

框架支持配置不同组别的数据库(MySQL、ClickHouse) ,但是都需要同时配置主从库,从库支持多个,操作数据库时会自动判断,增删改操作主库,查询操作从库

如果需要强制使用主库: 1、程序上下文有对数据修改并且需要立刻获得修改结果的时候,常见于订单生成接口。 2、操作事务的时候,这个时候我们可以在操作的时候指定使用主库:

还可以设置从库状态为 false

切换数据库

框架支持随时切换数据库,比如从 MySQL 切换到 ClickHouse 进行快速查询,记得 ClickHouse 配置也需要同时设置主从配置,但是信息可以一样

基础查询

$is_master 是读写分离参数,默认false为智能操作,查询操作从库,增删改操作主库,true为强制操作主库

返回值

返回值是根据查询类型而变化的

SELECT: 1、无数据返回 array() 2、默认返回多维数组 3、使用as_sql()后返回将要执行的SQL 4、使用as_row()后返回一维数组 5、使用as_field()后返回第一个元素 6、使用as_result()后返回结果集

INSERT: array( insert id, affected rows )

UPDATE & DELETE: affected rows

查询数据

查询数据支持两种字段选择方式:字符串(字段以逗号隔开)、数组,如果需要使用db::expr()方法,请使用数组方式

增加数据

单条数据增加可采用set方法, 成功返回(自增ID受影响行数

批量增加数据可采用columnsvalues组合方法

修改数据

单字段修改可采用value方法, 成功返回(受影响行数

多字段修改可采用set方法

删除数据

删除操作成功返回(受影响行数

多联表

框架支持多连表模型: join(全联接),left join(左联接),right join(右联接)方法

多次使用join方法可以继续联接,理论上可以建立任意数量的关联表。

选择器

选择器用于筛选表内数据,参数可以为两个或者三个,两个相当于=号省略不写。

INBETWEEN等多值方式需要传递一维数组参数

多条件查询可采用数组或者迭代调用

复杂选择

除了正常的匹配选择以外,框架还提供了其他复杂选择器。

其他条件

order by语句支持迭代调用方式

group by语句单字段情况下传递字符串即可,多字段需要传递数组

Limit && Offset

防止构建

正常情况下,传递参数进去后会被构建器重新构建成表达式,expr方法会返回一个db_expression类对象,可以防止表达式被重新构建,保留它原来的样子。

JSON字段

JSON字段需要在Mysql中设置好字段类型为json,然后在 config/database.php 文件中配置好参数:

配置好后,对当前字段操作只要传入array,便会自动转为json字符串,不需要json_encode

添加字段

更新字段

查询字段

SQL模版

框架中提供了上述选择器条件语句联表等,基本覆盖了所有sql语法,但可能还有部分生僻的用法无法被实现, 于是这里提供了一种SQL模版的使用方式,支持用户自定义SQL语句,但并不推荐用户使用,如果一定要使用的话,请务必自己做好防SQL注入

你可以使用框架提供的标准占位符,他是一个字符串,以冒号(:varname)为前缀。

多个参数绑定采用数组穿参

游标数据

如果DB中取出的数据非常大,而PHP中却无法承受这么大量的内存可以用来处理,这时候就需要用到游标了

游标可以将复合条件的数据逐一取出,在程序中进行分批处理,从而降低大数据所带来的内存瓶颈

事务处理

框架提供了一套简单的事务处理机制,默认是关闭的,可以通过db::start()方法开启

注意:请确保连接的数据表是innodb的存储引擎,否者事务并不会生效。

db::start()之后可以通过db::commit()来进行完整事务的提交保存,但并不会影响start之前的操作

同理,可以通过db::rollback()进行整个事务的回滚,回滚所有当前未提交的事务

当程序调用db::end()方法后事务会全部终止,未提交的事务也会自动回滚,另外,程序析构时,也会自动回滚未提交的事务

另外,事务的开启并不会影响select操作,只对增加,删除,修改操作有影响

还有就是,框架默认是主从操作以缓解数据库查询压力,但是数据库主从同步需要时间而且远比PHP执行效率要低,开始事务、回滚事务、提交事务、关闭事务会自动调用主库,增加,删除,修改操作也会自动调用主库,所以用户只需要在查询操作时强制使用主库( execute(true) )即可

数据缓存

尚未实现。

语句调试

SQL调试方法已经集成在框架事件中,只需要在需要调试语句的方法前调用event::on(onSql)就可以在页面控制台中输出sql语句了

该SQL事件功能还可自行绑定方法,具体用法会在后面事件介绍中详细展开

Last updated

Was this helpful?