PHP 數(shù)據(jù)對(duì)象(PDO)擴(kuò)展是PHP統(tǒng)一訪問數(shù)據(jù)庫的輕量級(jí)接口,本數(shù)據(jù)庫引擎就是采用PDO拓展,因此支持各種數(shù)據(jù)庫如MySQL, MSSQL, SQLite, MariaDB, Oracle, Sybase, PostgreSQL等等,同時(shí)支持?jǐn)?shù)據(jù)庫多聯(lián)。
數(shù)據(jù)庫配置
說明:跟模板配置一樣,可以在根目錄里config.php文件中可配置,也可以在對(duì)應(yīng)應(yīng)用根目錄里新建個(gè)config.php文件配置。
/單個(gè)數(shù)據(jù)庫配置代碼如下:
<?php
$config['DB']['DB_TYPE']='mysql';//數(shù)據(jù)庫類型 mysql mssql sqlite mariadb oracle sybase postgresql
$config['DB']['DB_HOST']='localhost';//數(shù)據(jù)庫主機(jī),一般不需要修改
$config['DB']['DB_USER']='root';//數(shù)據(jù)庫用戶名
$config['DB']['DB_PSWD']='123456';//數(shù)據(jù)庫密碼
$config['DB']['DB_PORT']=3306;//數(shù)據(jù)庫端口,mysql默認(rèn)是3306,一般不需要修改
$config['DB']['DB_NAME']='finch';//數(shù)據(jù)庫名
$config['DB']['DB_PREFIX']='finch_';//數(shù)據(jù)庫表前綴
$config['DB']['DB_CHARSET']='utf8';//數(shù)據(jù)庫編碼,一般不需要修改
$config['DB']['DB_OPTION']='';//PDO 連接選項(xiàng)
//默認(rèn)這個(gè)不是長連接,如果需要數(shù)據(jù)庫長連接,array(PDO::ATTR_PERSISTENT => true)
?>
//多個(gè)數(shù)據(jù)庫配置代碼如下:
<?php
$config['DB'][0] = array(//0號(hào) 為主數(shù)據(jù)庫 既默認(rèn)連接數(shù)據(jù)庫
'DB_TYPE'=>'mysql',//數(shù)據(jù)庫類型 mysql mssql sqlite mariadb oracle sybase postgresql
'DB_HOST'=>'localhost',//數(shù)據(jù)庫主機(jī),一般不需要修改
'DB_USER'=>'root',//數(shù)據(jù)庫用戶名
'DB_PSWD'=>'123456',//數(shù)據(jù)庫密碼
'DB_PORT'=>3306,//數(shù)據(jù)庫端口,mysql默認(rèn)是3306,一般不需要修改
'DB_NAME'=>'finch',//數(shù)據(jù)庫名
'DB_PREFIX'=>'finch_',//數(shù)據(jù)庫表前綴
'DB_CHARSET'=>'utf8',//數(shù)據(jù)庫編碼,一般不需要修改
);
$config['DB'][1] = array(//1號(hào) 為sqlite 數(shù)據(jù)庫
'DB_TYPE'=>'sqlite',//數(shù)據(jù)庫類型
'DB_PATH'=>'base', //數(shù)據(jù)庫文件起始路徑 空或base=系統(tǒng)根目錄,值app=當(dāng)前應(yīng)用目錄且本數(shù)據(jù)庫只能在本應(yīng)用下訪問。
'DB_SPACE' =>'data', //放置數(shù)據(jù)庫文件的文件夾名 如果為空 默認(rèn) 文件夾名為sqlite
'DB_FILE' =>'finch.db',//數(shù)據(jù)庫文件名
'DB_PREFIX'=>'finch_',//數(shù)據(jù)庫表前綴
);
?>
啟用數(shù)據(jù)庫引擎//index_controller.php文件 只要修改成
<?php
class index_controller extends controller{//只要這里繼承下controller 類既可加載模板引擎 數(shù)據(jù)庫引擎
public function index(){
$data = $this->db->table('表名')->where('條件語句')->get();
print_r($data);
echo 'Hello World!';
}
}
?>
數(shù)據(jù)庫操作表名 統(tǒng)一說明:以下操作中的表名,如果配置文件里有統(tǒng)一前綴設(shè)置過,那么這里的表名就不用包含前綴了 如果要忽略前綴 $this->db->table('表名',true)-> 將不添加前綴 條件語句(防SQL注入特別說明)
插入數(shù)據(jù)使用方法:$this->db->table('表名')->insert($data);特別說明: ->where(sql語句(字符串類型),占位符綁定值(數(shù)組結(jié)構(gòu))) ,有三種條件語句寫法 $this->db->table('表名')->where('id=1')-> 直接填寫條件語句,用于條件語句的值非文本框類輸入的值 而采用以下兩種占位符傳值,可以有效預(yù)防SQL注入問題。 $this->db->table('表名')->where('id=?',array(1))-> 使用問號(hào)占位符,后面對(duì)應(yīng)占位符值數(shù)組 值對(duì)應(yīng)占位符位置 $this->db->table('表名')->where('id=:id',array(':id'=>1))-> 使用命名占位符一 $this->db->table('表名')->where('id=:id',array('id'=>1))-> 使用命名占位符二 更新數(shù)據(jù) update 替換數(shù)據(jù) replace 只能使用問號(hào)占位符,不能使用命名占位符, 因?yàn)樘峤坏臄?shù)據(jù)統(tǒng)一已經(jīng)用?綁定 而在 SQL 語句中同時(shí)包含命名(:name)或問號(hào)(?)參數(shù)占位符,只能選擇其中一種風(fēng)格
更新數(shù)據(jù)使用方法:$this->db->table('表名')->where($condition)->update($data);$data為數(shù)據(jù)數(shù)組 如 $data['name']='admin'; $data['email']='352772@q.com'; 數(shù)組里的鍵名對(duì)應(yīng)數(shù)據(jù)庫的字段名 插入成功返回插入數(shù)據(jù)的id,否則返回false
刪除數(shù)據(jù)使用方法:$this->db->table('表名')->where($condition)->delete();$data為數(shù)據(jù)數(shù)組 如 $data['name']='admin'; $data['email']='352772@q.com'; $condition為查詢條件,比如:$condition = "id=1 and type=2"; 注意:等條件語句$condition為空的時(shí)候,不會(huì)更新數(shù)據(jù)返回false 更新成功返回影響的數(shù)據(jù)行數(shù),否則返回false
查詢數(shù)據(jù)條數(shù)使用方法:$this->db->table('表名')->where($condition)->count();成功返回一個(gè)整數(shù),否則返回false另種寫法$this->db->table('表名')->field('count(*) as 別名')->where($condition)->get();$condition為查詢條件,比如:$condition = "id=1 and type=2"; 刪除成功返回影響的數(shù)據(jù)行數(shù),否則返回false ; 注意:當(dāng)$condition為空時(shí),不會(huì)刪除數(shù)據(jù)。防止不小心把整個(gè)表的數(shù)據(jù)給刪除了; 查詢數(shù)據(jù) 1、查詢一條數(shù)據(jù): $data=$this->db->table('表名')->where($condition)->get(); 成功返回一維數(shù)組,否則返回false 2、查詢單個(gè)字段單條數(shù)據(jù): $data=$this->db->table('表名')->where($condition)->getval('字段名'); 成功返回字段對(duì)應(yīng)數(shù)據(jù) 3、查詢多條數(shù)據(jù): $list=$this->db->table('表名')->where($condition)->getlist(); 成功返回二維數(shù)組,否則返回false
判斷數(shù)據(jù)是否存在使用方法:$this->db->table('表名')->where($condition)->has();返回 1 或者 0, 1存在 0不存在數(shù)據(jù)最大值、最小值、平均值、合計(jì)值最大值:$this->db->table('表名')->where($condition)->max('字段名');最小值:$this->db->table('表名')->where($condition)->min('字段名');平均值:$this->db->table('表名')->where($condition)->avg('字段名');合計(jì)值:$this->db->table('表名')->where($condition)->sum('字段名');另種寫法最大值:$this->db->table('表名')->field('max(字段名) as 別名')->where($condition)->get();最小值:$this->db->table('表名')->field('min(字段名) as 別名')->where($condition)->get();平均值:$this->db->table('表名')->field('avg(字段名) as 別名')->where($condition)->get();合計(jì)值:$this->db->table('表名')->field('sum(字段名) as 別名')->where($condition)->get();
替換數(shù)據(jù)使用方法:$this->db->table('表名')->where($condition)->replace($data);$data = array( '字段名'=>array( '查找關(guān)鍵字'=>'替換用字符', ),);替換成功返回影響的數(shù)據(jù)行數(shù),否則返回false ;
其他連貫操作方法
執(zhí)行原生sql代碼$this->db->query($sql); $this->db->query($sql,$bind); //$bind 占位符綁定數(shù)據(jù)$this->db->cache(緩存時(shí)間)->query($sql);$this->db->debug()->query($sql); //調(diào)試模式一樣有效如果sql不是查詢條件語句,緩存設(shè)置無效正常情況下limit(),order(),cache(),where() 沒有先后順序之分1、多聯(lián)數(shù)據(jù)庫選擇 os: 很多項(xiàng)目經(jīng)常涉及到多個(gè)數(shù)據(jù)庫同時(shí)訪問的情況, 所以我特別設(shè)計(jì)了這個(gè)多聯(lián)結(jié)構(gòu)。 比如需要操控配置文件里一號(hào)數(shù)據(jù)庫 $list=$this->db->os(1)->table('表名')->where($condition)->getlist(); 注意:os()方法必須排在第一位,在table前面,否則無效,默認(rèn)數(shù)據(jù)庫則無需此方法。 2、限制字段 field: $data=$this->db->table('表名')->field('id,title')->where($condition)->get(); 3、排序 order: $list=$this->db->table('表名')->where($condition)->order('add_tiem desc,id desc')->getlist(); 4、限制條數(shù) limit: $list=$this->db->table('表名')->where($condition)->order('id desc')->limit(10)->getlist(); $list=$this->db->table('表名')->where($condition)->order('id desc')->limit('1,10')->getlist(); 5、緩存 cache: $list=$this->db->table('表名')->where($condition)->order('id desc')->cache(3600)->getlist(); cache($time) $time>0,數(shù)據(jù)緩存時(shí)間,$time=0,不緩存 緩存單位 秒 6、聚合函數(shù) group: $list=$this->db->table('表名')->where($condition)->group('字段名')->getlist(); 7、子句 having: $list=$this->db->table('表名')->where($condition)->having('子句')->getlist(); 8、調(diào)試模式 debug: 開啟調(diào)試 $list=$this->db->table('表名')->where($condition)->debug()->getlist(); $list=$this->db->table('表名')->where($condition)->debug(1)->getlist(); 取消調(diào)試 $list=$this->db->table('表名')->where($condition)->debug(0)->getlist(); 作用:輸出當(dāng)前SQL 語句,用來查看生成的sql語句 是否正確 注意:如果開啟調(diào)試模式就暫時(shí)取消緩存功能,同時(shí)debug放在cache后面才生效 9、日志 log: $this->db->log(); 作用:輸出當(dāng)頁所有執(zhí)行過的SQL 語句 10、日志 last_query: $this->db->last_query(); 作用:輸出當(dāng)頁最后一條SQL 語句 11、數(shù)據(jù)庫信息 info: $this->db->info(); 作用:輸出數(shù)據(jù)庫信息
添加表前綴$this->db->pre('表名'); 如:$sql = "UPDATE ".$this->db->pre('book')." SET name = 'Zhongshan' WHERE id = 8"; $this->db->debug(0)->query($sql);
數(shù)據(jù)庫事務(wù)數(shù)據(jù)庫事務(wù)(Database Transaction) ,是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。注意:事務(wù)操作只對(duì)支持事務(wù)的數(shù)據(jù)庫,并且設(shè)置了數(shù)據(jù)表為事務(wù)類型才有效,在Mysql數(shù)據(jù)庫中請(qǐng)?jiān)O(shè)置表類型為InnoDB。$db = $this->db;$this->db->action(function($db) { $db->調(diào)用數(shù)據(jù)庫操控 //數(shù)據(jù)庫操作});不是每個(gè)數(shù)據(jù)庫引擎都支持事務(wù)。你必須在使用前檢查。如果返回false,則回滾事務(wù)。
更多建議: