PHP下CodeIgniter框架鏈接讀取MS Access數據庫文件

cI用的是3.0版本,測試用的access爲.mdb文件,php要讀取Access數據庫有兩種驅動,一種的odbc,一種是pdo_odbc,兩種均可以連接,可是通常會更推薦pdo_odbc,php

要想php中能使用odbc,則必須安裝相關驅動,能夠在phpinfo中查看:html

一、odbcmysql

二、pdo_odbclinux

若是沒有,請自行搜索安裝,win下比較簡單,linux下就比較麻煩了,lanmp3.1集成環境下能夠看寫的這篇文章。如下內容只適用用windows場景下,由於後來才知道linux下只有pdo_odbc是不行的,還須要access相關的驅動。git

CI框架中加載另外一中數據庫的方法有兩種,參考手冊中的介紹,因此下面也說下兩種方式:github

一、配置文件中靜態加載:sql

//config/database.php文件中
//默認的mysql數據庫
$db['default'] = array(
    'dsn' => '',
    'hostname' => '127.0.0.1',
    'username' => 'xxx',
    'password' => 'xxx',
//    'hostname' => 'localhost',
//    'username' => 'root',
//    'password' => 'admin',
    'database' => 'xxx',
    'dbdriver' => 'mysqli',
    'dbprefix' => 'ecs_',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);
//access數據庫(這個是用的odbc驅動)
$db['access']['hostname'] = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=D:/public/Database1.mdb";//你本身的數據庫路徑
//$db['access']['hostname'] = "pdo:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=D:/public/Database1.mdb";//這裏用odbc而不是pdo_odbc驅動,
$db['access']['username'] = "";
$db['access']['password'] = "";
//$db['access']['database'] = "D:/public/Database1.mdb";//測試有沒有都沒有影響
$db['access']['dbdriver'] = "odbc";
//$db['access']['dbdriver'] = "pdo";//這裏用odbc而不是pdo_odbc驅動,
$db['access']['dbprefix'] = "";
$db['access']['pconnect'] = TRUE;
$db['access']['db_debug'] = TRUE;
$db['access']['cache_on'] = FALSE;
$db['access']['cachedir'] = "";
$db['access']['char_set'] = "utf8";
$db['access']['dbcollat'] = "utf8_general_ci";
$db['access']['swap_pre'] = '';
$db['access']['autoinit'] = TRUE;
$db['access']['stricton'] = FALSE;

使用時:數據庫

//讀取access中數據
$access_db = $this->load->database('access', TRUE);
$access_db->select('*')->get('user')->result_array();
//讀取mysql中的數據
$mysql_db = $this->load->database('default', TRUE);
$mysql_db->select('*')->get('user')->result_array();
//或者仍是原先的mysql查詢
$this->db->select('*')->get('user')->result_array();

二、動態加載配置,因爲access文件數據庫名稱可能隨時變更,因此放在config/database.php文件中就不合適了因此須要隨時加載切換windows

//直接在controller中(這個是用的pdo_odbc驅動)
$dbname = 'D:/public/Database1.mdb';//名稱隨時能夠改變
$access['hostname'] = "odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ={$dbname}";
//$access['hostname'] = "DRIVER={Microsoft Access Driver (*.mdb)}; //這裏不用odbc而是用pdo_odbcDBQ={$dbname}";
$access['username'] = "";
$access['password'] = "";
$access['database'] = $dbname;//測試有沒有都沒影響
$access['dbdriver'] = "pdo";
//$access['dbdriver'] = "odbc";//這裏不用odbc而是用pdo_odbc
$access['dbprefix'] = "";
$access['pconnect'] = TRUE;
$access['db_debug'] = TRUE;
$access['cache_on'] = FALSE;
$access['cachedir'] = "";
$access['char_set'] = "utf8";
$access['dbcollat'] = "utf8_general_ci";
$access['swap_pre'] = '';
$access['autoinit'] = TRUE;
$access['stricton'] = FALSE;
//加載
$access_db = $this->load->database($access, true);
//讀取access數據
$access_db->select('*')->get('user')->result_array();
//而mysql數據庫仍然能夠這樣:
$this->db->select('*')->get('user')->result_array();

上面例子中雖然用的結構化查詢,後面簡稱AR查詢,可是實際上測試用AR來查詢access數據庫有不少的限制,以及與mysql語法的不少區別:數組

一、AR查詢可使用,可是有數組形式的都無效,value值爲字符串的都識別爲空字符串,包含insert,update方法,以及where的數組形式(where的字符串等其它形式可使用)
二、AR查詢中的like()方法不支持,用sql查詢能夠,但須要注意的是access原生語句是用*來匹配,但因爲php用的pdo或odbc來連接,因此仍是用%來匹配
三、AR查詢中的select_sum()、select_svg()等方法都不能用,主要緣由access中別名不能是本來名稱,可是能夠select('sum(id) as abc'),一樣別名不要和原有名稱一致
四、順便發現row_array()或者result_array()的一個問題,即別名與另外一個想獲取的字段重名時,此方法只能取出一個字段,而真正的mysql,access語句會產生兩個同名字段,因此別名必定不要與要查詢的其它字段名相同
五、access不支持limit語句,能夠在select中用top n的形式獲取
六、insert若是用原生access sql語句,必須加上into,即"insert into ..."
七、查詢和寫入中文時須要轉碼mb_convert_encoding($v,'utf-8','gbk')或者iconv('gbk', 'utf-8', $v),推薦第一種,但確保mb函數有按照

暫時發現上方的不一樣,其他join、group by,order_by等方法都與mysql一致。

可是AR這麼多限制,還不如直接用原生sql語句來寫。可是原生sql語句中防注入等須要注意(CI中的$this->db->escape($title)方法測試不起做用),因此建議用pdo_odbc驅動,用pdo中的方法:

//PDO查詢
$sql="SELECT * FROM user WHERE user_name=:user_name";
$pdoStatement=$access_db->conn_id->prepare($sql);//注意conn_id
$user_name='abc';
$pdoStatement->bindValue(':user_name',$user_name);
$pdoStatement->execute();
$result=$pdoStatement->fetchAll(PDO::FETCH_ASSOC);

能夠封裝成相關的類來方便訪問,github上搜下會不少,參照寫就能夠(也能夠參照原先本身寫的這個,這個是讀取mysql數據庫的,並且很不完善)。

既然上方用pdo的原生語法,本身封裝類,那其實也能夠不用CI的數據庫配置導入等,直接用原生php方法鏈接便可:

$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$dbName; Uid=; Pwd=;");

能夠參照這篇文章

以上就是PHP鏈接Access數據庫相關,剛接觸,應該還有不少坑在前方。

相關文章
相關標籤/搜索