DB 类
DB 类为静态类。如果要创建实例可以使用Mysql 类创建
在BeaconPHP 中 需要配置和使用表名前缀。
配置文件格式如下:
#数据库配置文件,目前只支持mysql
return [
'db_host' => '127.0.0.1',
'db_port' => 3306,
'db_name' => 'oooo',
'db_user' => 'root',
'db_pwd' => '123456',
'db_prefix' => 'sl_', #表名前缀
'db_charset' => 'utf8mb4',
];
在使用查询语句的时候 使用 @pf_ 来替代前缀
如 我们要查询表 sl_member
sql 语句使用的表名是 @pf_member
DB::getList('select * from @pf_member order by id desc');
DB类的静态方法
exec(string $sql): false|int
执行 sql 语句,不返还任何结果,仅返回影响行数。
返回修改的行数,如果没有任何修改可能会返回 0 ,这个函数也会返回 false 可以参考 PDO::exec();
execute(string $sql, $args = null): false|\PDOStatement
执行sql 语句 并返回 \PDOStatement 结果集对象。
$sql 需要执行的字符串。
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
#没有参数的情况
DB::execute('select * from @pf_member order by id desc');
#如果有1个参数,不需要数组包括起来。
DB::execute('select * from @pf_member where `type`= ? order by id desc',1);
#如果有多个参数
DB::execute('select * from @pf_member where `type`= ? and dateTime < ? order by id desc',[1,'2020-01-01 10:00:00']);
getList(string $sql, mixed $args = null, int $fetch_style = \PDO::FETCH_ASSOC): array
获取多行数据,返回二维数组
$sql 需要执行的字符串。
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
$fetch_style 与PDO的Fetch参数保持一致
#没有参数的情况
DB::getList('select * from @pf_member order by id desc');
#如果有1个参数,不需要数组包括起来。
DB::getList('select * from @pf_member where `type`= ? order by id desc',1);
#如果有多个参数
DB::getList('select * from @pf_member where `type`= ? and dateTime < ? order by id desc',[1,'2020-01-01 10:00:00']);
getRow(string $sql, mixed $args = null, int $fetch_style = \PDO::FETCH_ASSOC): mixed
返回1行数据,如果没有找到数据则返回 null。
$sql 需要执行的字符串。
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
$fetch_style 与PDO的Fetch参数保持一致
#没有参数的情况
DB::getRow('select * from @pf_member order by id desc limit 0,1');
#如果有1个参数,不需要数组包括起来。
DB::getRow('select * from @pf_member where `id`= ? order by id desc',1);
#如果有多个参数
DB::getRow('select * from @pf_member where `id`= ? and dateTime < ? order by id desc',[1,'2020-01-01 10:00:00']);
getItem(string $table, int $id): ?array
通过id 直接获取一行数据。
$table 要查询的表
$id 表id 值
DB::getItem('@pf_member',1);
#相当于
DB::getRow('select * from @pf_member where `id`= ?',1);
getOne(string $sql, mixed $args = null, ?string $field = null, mixed $def = null): mixed
获取一行中的1个字段值
$sql 需要执行的字符串。
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
$field 要查询的字段,如果没有则返回第一个字段
$def 如果没有找到数据 使用该默认值
$name=DB::getOne('select name from @pf_member where id=?',1,'name:s','空');
getMax(string $tbname, string $field, string|int|null $where = null, mixed $args = null): mixed
查询最大值:
$tbname 表名
$field 字段名
$where 要查询的条件
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
$sort = DB::getMax('@pf_news','sort','mode=?',1);
getMin(string $tbname, string $field, string|int|null $where = null, mixed $args = null): mixed
查询最小值
$tbname 表名
$field 字段名
$where 要查询的条件
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
$sort = DB::getMax('@pf_news','sort','mode=? and pid=?',[1,3]);
insert(string $tbname, array $values = [])
插入数据
$tbname 需要插入的表
$values 和表结构对应的键值对。
DB::insert('@pf_news',['title'=>'这是一个标题','type'=>1,'pid'=>3,'addTime'=>date('Y-m-d H:i:s')]);
$id=DB::lastInsertId();
lastInsertId(?string $name = null): string
获取最后1次插入的id. 或者其他字段名
$name 如果需要可以设置成其他字段名。
replace(string $tbname, array $values = [])
替换数据,数据字典中需要存在主键,如果主键存在则更新,如果不存在则插入。
$tbname 需要替换数据的表
$values 和表结构对应的键值对。
DB::replace('@pf_news',['id'=>3,'title'=>'这是一个标题','type'=>1,'pid'=>3,'addTime'=>date('Y-m-d H:i:s')]);
update(string $tbname, array $values, string|int|null $where = null, mixed $args = null)
更新数据
$tbname 需要更新数据的表
$values 和表结构对应的键值对。
$where 如果有条件,则可以书写条件,如果是整数 则直接更新id=这个整数
$args 如果 $where 不是整数 且有参数站位符,这里可以填写站位符。同样 只有1个数据则可直接填写,多个数据需要用数组包括起来。
DB::update('@pf_news',['title'=>'这是一个标题','type'=>1,'pid'=>3,'addTime'=>date('Y-m-d H:i:s')],'pid=? and id=?',[3,1]);
#如果$where 是整数
DB::update('@pf_news',['title'=>'这是一个标题','type'=>1,'pid'=>3,'addTime'=>date('Y-m-d H:i:s')],1);
#等价于
DB::update('@pf_news',['title'=>'这是一个标题','type'=>1,'pid'=>3,'addTime'=>date('Y-m-d H:i:s')],'id=?',1);
#原子更新,需要使用到 sql 代码片段
#如 update @pf_news set click=click+1 where id=1
DB::update('@pf_news',['click'=>DB::raw('click+?',1)],1);
raw(string $sql, mixed $args = null)
Sql 原义片段
在更新,或者添加时,需要对数据进行语句原义设置时需要。
$sql Sql片段字符串。
$args 占位符数据,如果只有1个数据则可直接填写,多个数据需要用数组包括起来。
delete(string $tbname, string|int|null $where = null, mixed $args = null)
删除数据记录
$tbname 需要删除数据的表
$where 如果有条件,则可以书写条件,如果是整数 则直接更新id=这个整数
$args 如果 $where 不是整数 且有参数站位符,这里可以填写站位符。同样 只有1个数据则可直接填写,多个数据需要用数组包括起来。
DB::delete('@pf_news','pid=? and kind=?',[3,1]);
#如果$where 是整数
DB::delete('@pf_news',1);
#等价于
DB::delete('@pf_news','id=?',1);
beginTransaction(): bool
开启事务
commit(): bool
提交事务
rollBack(): bool
回滚事务
inTransaction(): bool
是否在事务中
例如:
try{
DB::beginTransaction();
DB::update('@pf_news',['allow'=>1],3);
DB::update('@pf_member',['news'=>DB::raw('`news`+?',1)],10);
DB::commit();
}catch(\Exception $e){
DB::rollBack();
}
getFields(string $tbname): array
获取表字段信息,返回所有字段名的数组
$tbname 表名
如:
$fields=DB::getFields('@pf_news')
fieldFilter(array $data, string $tbname): array
过滤 $data 键值对数组中,只保留 $tbname 表中含有的字段的键名。
existsField(string $tbname, string $field): bool
检查数据表中,字段是否存在
$tbname 表名
$field 待检查的字段名
createTable(string $tbname, array $options = [])
创建一个数据
$tbname 表名
$options 建表数据
$options['engine'] 数据引擎,默认是 InnoDB
$options['charset'] 字符集,默认是 utf8
$options['comment'] 表注释,默认为空
addField(string $tbname, string $field, array $options = []): false|int
添加一个字段
$tbname 表名
$field 字段名
$options 创建字段的选项
$options['type'] 字段类型,默认是 VARCHAR
$options['len'] 字符长度,
$options['scale'] 小数点位数
$options['comment'] 字段注释,默认为空
modifyField(string $tbname, string $field, array $options = []): false|int
修改字段,在同一个字段名上做参数修改
$tbname 表名
$field字段名
$options 创建字段的选项
$options['type'] 字段类型,默认是VARCHAR
$options['len'] 字符长度,
$options['scale'] 小数点位数
$options['comment'] 字段注释,默认为空
updateField(string $tbname, string $oldField, string $newField, array $options = []): false|int
更新字段,字段名字会重命名。
$tbname 表名
$oldField 原来的字段名
$newField新的字段名
$options 创建字段的选项
$options['type'] 字段类型,默认是VARCHAR
$options['len'] 字符长度,
$options['scale'] 小数点位数
$options['comment'] 字段注释,默认为空
dropField(string $tbname, string $field): false|int
删除表字段
$tbname 表名
$field字段名
existsTable(string $tbname): bool
检查表是否已经存在
$tbname 表名
dropTable(string $tbname): int|false
删除表
$tbname 表名
engine(): Mysql
获取默认Mysql实例
Mysql 类
Mysql类是可以实例化的类:
构造方法如下:
__construct(string $host, int $port = 3306, string $name = '', string $user = '', string $pass = '', string $prefix = '', string $charset = 'utf8', int $timeout = 120)
在默认情况下 我们一般使用静态DB类,DB类会启动默认实例。
但是一些情况下我们可能需要实例化一个数据库链接对象,
Mysql 的方法和DB类的方法参数是一致的。
只是需要使用对象来调用。
$host 数据库地址
$port 数据库端口
$name 数据库名
$user 数据库账号
$pass 数据库密码
$prefix 数据库前缀
$charset 数据库编码
$timeout 数据库超时,如果设置超时时间 则链接数据库会使用持久链接,并在120秒后如果没有任何操作将会释放持久链接,如果设置为0 则不使用持久链接,每次链接都是重新创建链接。
例如:
$db = new Mysql('127.0.0.1', 3306, 'beacon', 'roow', '123456', 'sl_', 'utf8', 120);
$list=$db->getList('select * from @pf_news');
$db->insert('@pf_news',['title'=>'这是一个标题','type'=>1,'pid'=>3,'addTime'=>date('Y-m-d H:i:s')]);