第7章 TP5.0數據庫操做php
=========================================================mysql
Mysql、SqlServer、PgSQL、Sqlite等數據庫的支持。sql
一、配置文件定義數據庫
a、配置文件目錄數組
C:\AppServ\www\tp5\application\database.php服務器
b、如何配置app
return [框架
// 數據庫類型函數
'type' => 'mysql',學習
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'yzmedu',
// 用戶名
'username' => 'root',
// 密碼
'password' => '123456789',
// 端口
'hostport' => '3306',
];
c、如何使用
// 實例化系統數據庫類
$DB=new Db;
// 查詢數據
$data=$DB::table("user")->select();
// 使用sql語句
$data=$DB::query("select * from user");
二、方法配置
一、使用數組
$Db=Db::connect([
// 數據庫類型
'type' => 'mysql',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'yzmedu2',
// 用戶名
'username' => 'root',
// 密碼
'password' => '123456789',
// 端口
'hostport' => '3306',
]);
二、使用字符串
$Db=Db::connect("mysql://root:123456789@127.0.0.1:3306/yzmedu#utf8");
// 數據庫類型://用戶名:密碼@數據庫地址:數據庫端口/數據庫名#字符集
三、如何使用
$data=$Db->table("user")->select();
三、模型類定義
一、建立數據模型
a、命令行建立
一、切換到項目目錄
二、執行命令
php think make:model app\index\model\User
b、手動建立
一、打開數據模型目錄
C:\AppServ\www\tp5\application\index\model
二、在目錄下新建 文件 User.php
三、在文件中書寫代碼
namespace app\index\model;
use think\Model;
class User extends Model
{
//
}
二、如何設置
class User extends Model
{
// 使用數組配置連接數據庫
protected $connection=[
// 數據庫類型
'type' => 'mysql',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'yzmedu',
// 用戶名
'username' => 'root',
// 密碼
'password' => '123456789',
// 端口
'hostport' => '3306',
];
// 使用字符串配置連接數據庫
protected $connection="mysql://root:123456789@127.0.0.1:3306/yzmedu#utf8";
}
三、如何控制器中使用
$user=new \app\index\model\User();
// 查詢全部的數據
dump($user::all());
一、tp方法
// 實例化系統數據庫類
$DB=new Db;
// 查詢數據
$data=$DB::table("user")->select();
二、使用sql語句
// 實例化系統數據庫類
$DB=new Db;
// 使用sql語句
$data=$DB::query("select * from user");
一、增長
# 返回值 影響行數
$data=Db::execute("insert into user value(null,'user1','123','18')");
$data=Db::execute("insert into user value(null,?,?,?)",['user2','456','20']);
$data=Db::execute("insert into user value(null,:name,:pass,:age)",['name'=>"user3","pass"=>'678','age'=>25]);
二、修改
#返回值 影響行數
$data=Db::execute("update user set age='20' where id=9");
三、刪除
#返回值 影響行數
$data=Db::execute("delete from user where id=10");
$data=Db::execute("delete from user where id>?",[15]);
$data=Db::execute("delete from user where id>:id",["id"=>10]);
四、查看
$data=Db::query("select * from user");
$data=Db::query("select * from user where id >=? and id<=?",[5,8]);
五、獲取指定sql語句
Db::getLastSql();
六、用戶模塊
一、命令行 找到項目目錄 新建控制器
php think make:controller app\index\controller\Users
二、寫資源路由
[詳見 代碼]
一、查詢操做
一、table方法查詢數據
// 查詢全部數據
// SELECT * FROM `user`
$data=Db::table("user")->select();
// 查詢一條數據
// SELECT * FROM `user` LIMIT 1
$data=Db::table("user")->find();
二、name方法查詢數據
// 與配置文件有關
// name 會自動添加配置文件中的表前綴
$data=Db::name("user")->select();
$data=Db::name("user")->find();
三、助手函數
# SELECT * FROM `user`
$data=db("user")->select();
# SELECT * FROM `user` LIMIT 1
$data=db("user")->find();
四、where條件匹配
// SELECT * FROM `user` WHERE `id` > 25
$data=Db::table("user")->where("id",">",25)->select();
// SELECT * FROM `user` WHERE ( `id` > 25 AND `id` < 28 )
$data=Db::table("user")->where("id",">",25)->where("id","<",28)->select();
// SELECT * FROM `user` WHERE `name` LIKE '%user1%'
$data=Db::table("user")->where("name","like","%user1%")->select();
// SELECT * FROM `user` WHERE `name` = 'user3' AND `pass` = 'qwe'
$data=Db::table("user")->where("name","user3")->where("pass",'qwe')->select();
// SELECT * FROM `user` WHERE ( id > 25 and id <28 )
$data=Db::table("user")->where("id > 25 and id <28")->select();
// SELECT * FROM `user` WHERE `id` > 25 AND `name` = 'user10'
$data=Db::table("user")->where(["id"=>[">",25],"name"=>'user10'])->select();
// SELECT * FROM `user` WHERE ( `id` > 25 AND `id` < 28 )
$data=Db::table("user")->where(["id"=>[">",25]])->where(['id'=>["<",28]])->select();
五、whereOr 或者匹配
// SELECT * FROM `user` WHERE `id` <= 23 OR `id` >= 28
$data=Db::table("user")->where("id","<=",23)->whereOr("id",">=",28)->select();
// SELECT * FROM `user` WHERE `name` LIKE '%user1%' OR `name` LIKE '%user2%'
$data=Db::table("user")->where("name","like","%user1%")->whereOr("name","like","%user2%")->select();
六、limit 截取數據
// SELECT * FROM `user` LIMIT 5
$data=Db::table("user")->limit(5)->select();
// SELECT * FROM `user` LIMIT 5,5
$data=Db::table("user")->limit(5,5)->select();
七、Order 排序
// SELECT * FROM `user` ORDER BY `id`
$data=Db::table("user")->order("id")->select();
// SELECT * FROM `user` ORDER BY `id` desc
$data=Db::table("user")->order("id","desc")->select();
八、field 設置查詢字段
// 設置查詢字段
// SELECT `name`,`pass` FROM `user`
$data=Db::table("user")->field("name,pass")->select();
$data=Db::table("user")->field(['name','pass'])->select();
// 起別名
// SELECT name uname,`pass` FROM `user`
$data=Db::table("user")->field("name uname,pass")->select();
$data=Db::table("user")->field(['name'=>"uname",'pass'])->select();
// sql 的系統函數
// SELECT count(*) as tot FROM `user`
$data=Db::table("user")->field("count(*) as tot")->select();
$data=Db::table("user")->field(['count(*)'=>"tot"])->select();
// 排除字段
// SELECT `id`,`age` FROM `user`
$data=Db::table("user")->field("name,pass",true)->select();
$data=Db::table("user")->field(["name",'pass'],true)->select();
九、Page 實現分頁效果
// SELECT * FROM `user` LIMIT 5,5
$data=Db::table("user")->page("1,5")->select();
十、Group分組聚合
// SELECT `pass`,count(*) tot FROM `user` GROUP BY pass
$data=Db::table("user")->field("pass,count(*) tot")->group("pass")->select();
十一、having 過濾
// 只能結合分組使用
// SELECT `pass`,count(*) tot FROM `user` GROUP BY pass HAVING tot >=2
$data=Db::table("user")->field("pass,count(*) tot")->having("tot >=2")->group("pass")->select();
十二、多表查詢
// select goods.*,type.name tname from type,goods where goods.cid=type.id
$data=Db::query("select goods.*,type.name tname from type,goods where goods.cid=type.id");
// 內聯實現數據庫連接
// SELECT `goods`.*,type.name tname FROM `goods` INNER JOIN `type` `type` ON `goods`.`cid`=`type`.`id`
$data=Db::table("goods")->field("goods.*,type.name tname")->join("type","goods.cid=type.id")->select();
// 右連接
// SELECT `goods`.*,type.name tname FROM `goods` RIGHT JOIN `type` `type` ON `goods`.`cid`=`type`.`id`
$data=Db::table("goods")->field("goods.*,type.name tname")->join("type","goods.cid=type.id",'right')->select();
// 左連接
$data=Db::table("goods")->field("goods.*,type.name tname")->join("type","goods.cid=type.id",'left')->select();
1三、別名使用-給表起別名
// SELECT `g`.*,t.name tname FROM `goods` `g` LEFT JOIN `type` `t` ON `g`.`cid`=`t`.`id`
$data=Db::table("goods")->alias("g")->field("g.*,t.name tname")->join("type t","g.cid=t.id",'left')->select();
1四、union集合
// SELECT `name` FROM `user` UNION select name from goods
$data=Db::field("name")->table("user")->union("select name from goods")->select();
1五、參數綁定(bind) 爲了防止sql注入
# DELETE FROM `user` WHERE `id` = 25
$id=input("id");
$data=Db::table("user")->where("id",":id")->bind(["id"=>[$id,\PDO::PARAM_INT]])->delete();
1六、數據統計
// SELECT MAX(age) AS tp_max FROM `user` LIMIT 1
$data=Db::table("user")->max("age");
// SELECT MIN(age) AS tp_min FROM `user` LIMIT 1
$data=Db::table("user")->min("age");
// SELECT AVG(age) AS tp_avg FROM `user` LIMIT 1
$data=Db::table("user")->avg("age");
// SELECT SUM(age) AS tp_sum FROM `user` LIMIT 1
$data=Db::table("user")->sum("age");
// SELECT COUNT(age) AS tp_count FROM `user` LIMIT 1
$data=Db::table("user")->count("age");
1七、視圖查詢
$data=Db::view("goods","id,name,price")
->view("type",'name tname',"type.id=goods.cid")
->select();
// SELECT `goods`.`id`,`goods`.`name`,`goods`.`price`,type.name tname FROM `goods` `goods` INNER JOIN `type` `type` ON `type`.`id`=`goods`.`cid`
$data=Db::view("goods","id,name,price")
->view("type",'name tname',"type.id=goods.cid","left")
->select();
// SELECT `goods`.`id`,`goods`.`name`,`goods`.`price`,type.name tname FROM `goods` `goods` LEFT JOIN `type` `type` ON `type`.`id`=`goods`.`cid`
二、增長操做
一、插入單條數據
// 數組中的字段名 必須和數據庫中的字段名一致
$data=["name"=>"張三","pass"=>"123","age"=>18,];
$code=Db::table("user")->insert($data);
$code=db("user")->insert($data);
// INSERT INTO `user` (`name` , `pass` , `age`) VALUES ('張三' , '123' , 18)
// 返回值 影響行數
二、插入多條數據
$data=[
["name"=>"張三1","pass"=>"123","age"=>15,],
["name"=>"張三2","pass"=>"123","age"=>19,],
];
$code=Db::table("user")->insertAll($data);
$code=db("user")->insertAll($data);
// 返回值 影響行數
三、獲取最後一次插入ID
$data=["name"=>"張三","pass"=>"123","age"=>18,];
$code=Db::table("user")->insertGetId($data);
$code=db("user")->inserGetId($data);
// 返回值最後插入的id
三、更新數據
一、修改數據
$code=Db::table("user")->where("id",">",'60')->update(["pass"=>"qwe","age"=>2]);
// UPDATE `user` SET `pass`='qwe',`age`=2 WHERE `id` > 60
// 返回值 影響行數
$code=Db::table("user")->update(['age'=>52,"id"=>62]);
// UPDATE `user` SET `age`=52 WHERE `id` = 62
$code=Db::table("user")->where("id",73)->setField("pass",'abc');
// UPDATE `user` SET `pass`='abc' WHERE `id` = 73
二、設置自增
$code=Db::table("user")->where("id",63)->setInc("age");
// UPDATE `user` SET `age`=age+1 WHERE `id` = 63
$code=db("user")->where("id",66)->setInc("age");
// UPDATE `user` SET `age`=age+1 WHERE `id` = 66
三、設置自減
// UPDATE `user` SET `age`=age-1 WHERE `id` = 62
$code=Db::table("user")->where("id",62)->setDec("age");
$code=Db::table("user")->where("id",62)->setDec("age",3);
// UPDATE `user` SET `age`=age-3 WHERE `id` = 62
$code=db("user")->where("id",63)->setDec("age",3);
// UPDATE `user` SET `age`=age-3 WHERE `id` = 63
四、刪除數據
一、刪除一條數據
$code=Db::table("user")->where("id","71")->delete();
$code=Db::table("user")->delete(70);
二、刪除多條數據
$code=Db::table("user")->where("id in(51,54,55)")->delete();
$code=Db::table("user")->delete([62,63,66]);
三、刪除區間數據
$code=Db::table("user")->where("id>40 and id<45")->delete();
// DELETE FROM `user` WHERE ( id>40 and id<45 )
一、事務
張三 銀行卡 1000, 李四 銀行卡 500, 張三給李四轉帳200
1) 銀行 先扣除 張三的200
2) 銀行 將200 給了李四
二、mysql事務
mysql事務 要求 數據庫的引擎必須 InnoDB
三、使用
一、自動控制事務
Db::transaction(function(){
// 刪除一條數據
Db::table("user")->delete(40);
// 刪除數據
Db::table("user")->deletes();
});
二、手動控制事務 (***)
// 開啓事務
Db::startTrans();
// 事務
try{
// 刪除數據id 31
$a=Db::table("user")->delete(31);
// 判斷是否刪除成功
if (!$a) {
throw new \Exception("刪除id 31 數據沒有成功");
}
// 刪除不存在的數據 id 32
$b=Db::table("user")->delete(32);
// 判斷是否刪除成功
if (!$b) {
throw new \Exception("刪除id 32 數據沒有成功");
}
// 執行提交操做
Db::commit();
}catch(\Exception $e){
// 回滾事務
Db::rollback();
// 獲取提示信息
dump($e->getMessage());
}
// ==================================================================
// 開啓事務
Db::startTrans();
// 刪除數據 33
$a=Db::table("user")->delete(33);
// 刪除數據 34
$b=Db::table("user")->delete(34);
// 判斷條件
if ($a && $b) {
// 提交事務
Db::commit();
}else{
// 回滾事務
Db::rollback();
}