目录
0x01数据库配置文件以及连接数据库:
打开application/database.php可以进行连接数据库的配置
测试连接是否成功:
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Index extends Controller
{
public function index(){
$ret = Db::query("SELECT * FROM user");
dump($ret);
}
}
原生sql语句可以用以下两个函数来执行:
Db::query(原生sql语句)
Db::execute(原生sql语句)
容易疏忽导致sql注入漏洞,不建议使用,建议使用占位符操作:
Db::query('SELECT * FROM user WHERE id=:id',['id'=>1]);
0x02ORM插入数据
Db::table('表名')->insert(数组);
Db::name('不带前缀的表名')->insert(数组);
注:
1.如果在配置文件中设置了表的前缀,则用table方法时表名需要带上前缀,用name方法时表名可以不带前缀
2.insert方法执行成功后,返回的是添加成功的条数。
3.如果想获取插入成功后的id,可以使用:$id=Db::name('user')->getLastInsID()或者也可以将insert()方法的第三个参数传入true,则insert()的返回值将是插入成功后的id
演示:
$data=['name'=>'xiaoming','pwd'=>'123'];//字段名=>字段值
$res = Db::table('user')->insert($data);
如果要插入多条数据,$data弄一个二维数组,然后将insert修改成insertAll()即可。
0x03 ORM查询数据
查询一条数据:
$ret = Db::name('user')->find();
如果find中不传任何参数,默认查询第一条数据
直接传数字的话,则会查询对应的id(默认查询自增的主键)
查询多条数据:
$ret = Db::name('user')->select();
如果不传参数,默认返回所有数据。如果想返回特定id的数据,可以传入[id1,id2,id3]
db助手函数(不推荐使用)
db('user')->find();
注意:使用db助手函数默认每次都会重新连接数据库,而使用Db::name或者Db::table方法的话都是单例的
0x04 ORM where查询
注:
eq means equal
neq means not equal
gt means great than 即大于 >
lt means little than 即小于<
表达式查询:
等于:
$res = Db::name('user')->where("pwd","123")->find();
大于:
$res = Db::name('user')->where("pwd",'gt',"123")->find()
and查询:链式操作
$res = Db::name('user')->where("pwd",'gt',"123")->where("id",'eq','2')->find();
or查询:链式操作
$res=Db::name('user')->where("pwd",'gt',"123")->whereOr("id",'lt','3')->select();
以数组的方式:(默认关系为等于,各个条件之间是and)
$where = ['id'=>9,'pwd'=>'123'];
$res = Db::name('user')->where($where)->select();
在where中直接放sql原生语句:
$res = Db::name('user')->where("id>1 && id<5")->select();
dump($res);
0x05 field()查询某些字段
$res = Db::name('user')->field('username','reg_time')->where("id>1 && id<5")->select();
dump($res);
也支持传入数组的方式:
$res = Db::name('user')->field(['username','reg_time'])->where("id>1 && id<5")->select();
dump($res);
给字段名添加别名:(只是显示数据的时候用别名显示)
$res = Db::name('user')->field(['username','reg_time'=>'time'])->where("id>1 && id<5")->select();
字段排除:表示查询除了数组中字段的所有字段
$res = Db::name('user')->field(['username'],true)->where("id>1 && id<5")->select();
注意:字段排除功能不支持跨表join操作
支持聚合运算:
$res = Db::name('user')->field('sum(id)')->where("id>1 && id<5")->select();
可用的sql函数除了sum还有avg,max(),min()
0x06 limit
倒序显示:
$res = Db::name('user')->field('id')->where("id>1 && id<5")->order('id desc')->select();
限制条数:
$res = Db::name('user')->field('id')->limit(3)->order('id desc')->select()
分页查询:从第x条开始查询x条
$res = Db::name('user')->field('id')->limit(2,4)->order('id desc')->select();
0x07 distinct
唯一的,即加上之后,被限定字段如果有重复,只返回一次:
$res = Db::name('user')->distinct(true)->field('username')->select();
如果想打印我们的sql语句:
$res = Db::name('user')->distinct(true)->field('username')->fetchSql(true)->select();
如果想对表名设置别名:alias()
$res = Db::name('user')->alias('u')->distinct(true)->field('username')->select();
0x08 连表查询
可以为INNER,LEFT,RIGHT,FULL 不区分大小写,默认为INNER
join(‘表名 表的别名’,'条件','连接类型')
内连接:INNER
$res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id')->select();
dump($res);
查询结果:
即从两个表的笛卡尔积中选择符合条件的结果。
由于我们不需要id和cat_id所以可以通过filed过滤,注意连表查询不支持反向过滤
$res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id')->field(['a.title','a.content','c.cat_name'])->select();
外连接:
1.左连接:以左边的表为基准
$res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id','left')->field(['a.title','a.content','c.cat_name'])->select();
2.右连接:以右边的表为基准
$res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id','right')->field(['a.title','a.content','c.cat_name'])->select();
0x09事务Transaction
事务通俗说就是一系列 要么一起成功要么一起失败的操作,例如转账事务,要么A的钱减少且B的钱增加,要么A的钱不减少B的钱也不增加。
public function index(){
// 1.开启事务
Db::startTrans();
try{
Db::table('user')->where('id','1')->update(['reg_time'=>40]);
Db::table('user')->where('id','2')->update(['reg_time'=>10]);
//2.如果上面两个操作能一起成功,那么就提交,让操作保持生效
Db::commit();
}catch(Exception $e){
//3.如果上面两个操作有一个失败,那么就回滚,让成功操作失效。一起失败。
Db::rollback();
}
}
0x0A 更新以及自增自减操作
$data =['username'=>'xiaoliu'];
$ret = Db::name('user')->where('id',2)->update($data);
返回值是影响的行数
如果data数组中含有主键,则主键项会被当做条件。这样就不需要where()函数来限定条件了。
$data =['username'=>'xiaoliu','id'=>4,'pwd'=>'hahah'];
Db::name('user')->update($data);
自增:
reg_time字段加1
Db::name('user')->where('id','1')->setInc('reg_time');
可以指定增加的数目
Db::name('user')->where('id','1')->setInc('reg_time',50);
自减:
Db::name('user')->where('id','1')->setDec('reg_time');
0x0B删除操作
删除一条数据,传入主键即可,返回成功删除的行数,如果不传主键的话,不会执行删除操作
$res = Db::name('user')->delete(9);
dump($res);
删除多条数据:
$res = Db::name('user')->delete([1,2,3]);
dump($res);
根据条件删除:
$res = Db::name('user')->where("username",'eq','Rerere')->delete();