### db对象
* db配置
- 配置文件:/root/cfgs/boot/cfg_db.php;
- 表的前后缀:`db_prefix`-表前缀,`db_suffix`-表后缀;
- 默认表前缀为空,表后缀为`_ys`,由安装时配置决定;
* db对象
- 先配置数据库链接,见文件:/root/cfgs/boot/cfg_db.php;
- 代码:`$db = glbDBObj::dbObj();`, 或`$db = db();` 即得到了一个可操作的db对象;
- 提示:本系统很多场合,已经初始化了这个`$db`对象,可直接使用;
* 调用外部数据
- 配置文件:/root/cfgs/boot/cfg_db.php。
- 在文件尾部添加类似代码(链接织梦系统)
`$_cfgs['dede_cms'] = $_cfgs;`
`//$_cfgs['dede_cms']['db_host'] = 'localhost';`
`$_cfgs['dede_cms']['db_name'] = 'dede_v998'; // 数据库名(pdo连接不使用)`
`$_cfgs['dede_cms']['db_prefix'] = 'dd_';`
`$_cfgs['dede_cms']['db_suffix'] = '';`
- 代码:`$db = glbDBObj::dbObj('dede_v998');` 或`$db = db('dede_v998');`
即得到了一个可操作的织梦系统的db对象;
### 增删改查
#### 插入数据
```
$data['kid']=basKeyid::kidTemp();
$data['kno']='1';
$data['atime']=time();
$data['content']='123abc@q.com';
$db->table('xtest_keyid')->data($data)->insert();
```
#### 更新数据
```
$data['kno']='2';
$data['content']='456abc@q.com';
unset($data['kid']);
$db->table('xtest_keyid')->data($data)->where("kid='2019-88-77ab'")->update();
```
#### 数据库查询
* 查询一条数据:
```
$info=$db->table('表名')->where($whrstr)->find();
成功返回一维数组,否则返回false
限制字段
$info=$db->table('表名')->field('id,title')->where($whrstr)->find();
排序
$info=$db->table('表名')->field('id,title')->where($whrstr)->order('id desc')->find();
注意:order('id desc')逆序order('id asc')升序
缓存
$info=$db->table('表名')->cache(10)->where($whrstr)->find();
cache($time) $time>0,数据缓存时间,$time=0,不缓存,$time=-1永久缓存
```
* 查询多条数据
```
$list=$db->table('表名')->where($whrstr)->select();
成功返回二维数组,否则返回false
限制字段
$list=$db->table('表名')->field('id,title')->where($whrstr)->select();
排序
$list=$db->table('表名')->field('id,title')->where($whrstr)->order('id desc')->select();
限制条数
$list=$db->table('表名')->field('id,title')->where($whrstr)->order('id desc')->limit(10)->select();
缓存
$list=$db->table('表名')->cache($time)->field('id,title')->where($whrstr)->order('id desc')->limit(10)->select();
cache($time) $time>0,数据缓存时间,$time=0,不缓存,$time=-1永久缓存
```
* 查询数据数量
```
$count=$db->table('表名')->where($whrstr)->count();
成功返回一个整数,否则返回false
$count=$db->table('表名')->cache($time)->where($whrstr)->count();
```
#### 删除数据
```
$whrstr为查询条件,可为数组或字符串,$whrstr['id']=1;
删除成功返回影响的数据行数,否则返回false
注意,当$whrstr为空时,不会删除数据。防止不小心把整个表的数据给删除了
$db->table('xtest_keyid')->where("kid='2015-cr-1234'")->delete();
```
### 规范说明
* 如使用缓存,初始化db如下:
- `$db = glbDBObj::dbObj([], 1);`, 或`$db = db([], 1);`;
* table('表名')
- 默认表名 省略前后缀;
- 原生的sql语句用中,使用 $db->pre/$db->ext 得到配置的表 前缀/后缀;
- $db->table('表名',$nofix=false)
- 特殊数据库前缀
- $nofix===2,=> $full 加上前后缀 的字符串(表名)
- $nofix===1,=> 不加前后缀 返回$db;
- $nofix===0,=> 加上前后缀 返回$db;
* 先后顺序
- field(),limit(),order(),cache(),table(),where()没有先后顺序之分
* $whrstr条件
- 可为字符串或数组,如果是数组,数组下标表示数据库字段名 多个元素用and连接,
* 原生sql
- 复杂一点的sql,可以写成原生的sql查询条件
* 查看生成的sql语句,echo $db->sql; 或者echo $db->getSql();
- 数据库操作有问题时,用来查看生成的sql语句 是否正确
* 操作数据库基类
- 具体方法查看/imcat/core/glib/glbDBObj.php文件
### 问题与缺陷
* 数据库操作:$db->操作里面不要含有$db->操作,(少数情况下会出错)
```
如:
$db->table('users_uacc')->data($acc+basSql::logData())->insert(); //
-=>改为两句:
$dataex = basSql::logData();
$db->table('users_uacc')->data($acc+$dataex)->insert();
```
* 设计缺陷
- 原则上,避免使用mysql关键字 作为数据表的字段;本系统使用了【show/key/char】等字段:
- 【show】用于控制资料显示如否,【key(wex_menu/base_paras中使用)】, 【char(init_types/types_*中使用)】;
- 这算是一些小`缺陷`,容易引起错误;出问题时,请按如下解决:
- $list = $db->table('users_inmem')->field('uid,grade,show')->where($usql)->select();
- 子句修改为:->field('uid,grade,\`show\`')即可;<!--源码的\为转义符号-->
#### 常用代码
```
如果$sql为查询条件,则返回二维数组,且可以设置缓存$db->cache(缓存时间)->query($sql);
如果sql不是查询条件语句,缓存设置无效,返回的数据跟mysqli_query($sql)一样
$db->query($sql);
--- 系统常用代码 ---
$db->table($tabid)->data(basReq::in($fm))->insert();
$db->table($tabid)->where("kid='$id'")->delete();
$db->table($tabid)->data(array('enable'=>'1'))->where("kid='$id'")->update();
$list = $db->table('base_model')->field('kid,title')->limit(3)->select(); if($list)foreach($list as $r){}}
$fm = $db->table($tabid)->where("model='$mod' AND kid='$kid'")->find();
$count = $db->table('base_model')->where("pid='groups'")->count();
$sql = "SELECT kid,title FROM base_model_ys WHERE pid='groups' LIMIT 3";
$list = $db->arr($sql);
print_r($db->fields('xtest_keyid_ys'));
print_r($db->tables());
```
### 常用sql
```
UPDATE users_adminer_ys set uid=concat('2010-4q-',uname)
UPDATE `users_person_ys` b INNER JOIN users_uacc_ys a ON a.uname=b.uname SET b.uid=a.uid;
UPDATE `dede_addonarticle` SET body=REPLACE (body,'</td>',");
```
-End-