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數據庫相關,剛接觸,應該還有不少坑在前方。