數(shù)據(jù)庫引擎

2018-02-05 10:54 更新

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ù)庫引擎
跟模板引擎是一樣的只要繼承controller 類即可,后續(xù)會(huì)講到如何在模型model里啟用數(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ù)庫操作
說明:框架默認(rèn)$this->db為統(tǒng)一數(shù)據(jù)庫操作對(duì)象,提供的連貫操作方法(也有些框架稱之為鏈?zhǔn)讲僮鳎梢杂行У奶岣邤?shù)據(jù)存取的代碼清晰度和開發(fā)效率,并且支持所有的CURD操作。

表名
統(tǒng)一說明:以下操作中的表名,如果配置文件里有統(tǒng)一前綴設(shè)置過,那么這里的表名就不用包含前綴了
如果要忽略前綴 $this->db->table('表名',true)-> 將不添加前綴

條件語句(防SQL注入特別說明)
特別說明: ->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('表名')->insert($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)->update($data);
$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ù)使用方法:$this->db->table('表名')->where($condition)->delete();
$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ù)條數(shù)使用方法:$this->db->table('表名')->where($condition)->count();成功返回一個(gè)整數(shù),否則返回false另種寫法$this->db->table('表名')->field('count(*) as 別名')->where($condition)->get();判斷數(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 ;其他連貫操作方法
正常情況下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ù)庫信息
執(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è)置無效添加表前綴$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ù)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)