CodeIgniter框架连接读取MS Access数据库文件

cI用的是3.0版本,php要读取Access数据库有两种驱动,一种的odbc,一种是pdo_odbc,两种都可以链接,但是一般会更推荐pdo_odbc,

要想php中能使用odbc,则必须安装相关驱动,可以在phpinfo中查看:

1、odbc

2、pdo_odbc

如果没有,请自行搜索安装,win下比较简单,linux下就比较麻烦了,lanmp3.1集成环境下可以看写的这篇文章

CI框架中加载另一中数据库的方法有两种,参考手册中的介绍,所以下面也说下两种方式:

1、配置文件中静态加载:

//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();

2、动态加载配置,由于access文件数据库名称可能随时变动,所以放在config/database.php文件中就不合适了所以需要随时加载切换

//直接在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数据库有很多的限制:

1、AR查询可以使用,但是有数组形式的都无效,value值为字符串的都识别为空字符串,包含insert,update方法,以及where的数组形式(where的字符串等其它形式可以使用)
2、AR查询中的like()方法不支持,用sql查询可以,但需要注意的是access原生语句是用*来匹配,但由于php用的pdo或odbc来链接,所以还是用%来匹配
3、AR查询中的select_sum()、select_svg()等方法都不能用,主要原因access中别名不能是原本名称,但是可以select(‘sum(id) as abc‘),同样别名不要和原有名称一致
4、顺便发现row_array()或者result_array()的一个问题,即别名与另一个想获取的字段重名时,此方法只能取出一个字段,而真正的mysql,accdess语句会产生两个同名字段,所以别名一定不要与要查询的其它字段名相同
5、access不支持limit语句,可以在select中用top n的形式获取
6、insert如果用原生access sql语句,必须加上into,即"insert into ..."

暂时发现上方的不同,其余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数据库的,而且很不完善)。

时间: 2024-10-12 14:23:54

CodeIgniter框架连接读取MS Access数据库文件的相关文章

Java 连接MS Access数据库

java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来程序部署的每个机器上都要进行设置不方面.所以现在不会使用啦. 2.JDBC java也可以和连接其他数据库一样连接MS Access,导入数据库相应的jar包,进行连接. java Access JDBC jar包:Access_JDBC30.jar 具体连接,参考下面代码: 复制代码 1 try { 2

64位系统使用Access 数据库文件的彻底解决方法

最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没有问题的,但是直接使用编译好的.NET程序访问Access,就出问题了,报: 未在本地计算机上注册“Microsoft.Jet.Oledb.4.0”提供程序. 于是,又在公司的电脑上(Win7 64位)做了实验,发现跟家里面的Win8.1 64位 问题一样,上网搜索了一下,大部分都建议将.NET程序

CodeIgniter框架——源码分析之入口文件index.php

CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 源码分析如下: <?php //这个文件是入口,后期所有的文件都要在这里执行. /*----------------------------------------------- * 系统环境配置常量 * 能够配置错误显示级别 * ----------------------------------------------- * 默认情况下: * developmen

64位系统中连接Access数据库文件的一个问题

近日在windows 7 64位系统中编译以前写的程序,发现在连接Access数据库时总是出现异常,提示“Microsoft.Jet.OLEDB.4.0”未在本机注册,同样的代码在32位的xp系统中却没有问题,经过一番搜索后找到一个比较简便的处理办法,特在此做一下记录. 原因估计:数据库文件使用Access2003格式的*.mdb文件,其对应的OLEDB 4.0在win7 64位系统中支持不是很好. 处理办法:将数据库文件升级为Access2007格式的*.accdb文件,按如下修改连接字符串,

c# 连接本地的sdf数据库文件

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.SqlServerCe; //SDF  是ce版本,要使用该驱动才行 namespace testc{    p

DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法

1 string strSql = 2 "insert into GongCheng (GCSY,GCBH,GCBHOLD,GCMC,GCKCJD,GCJSDW,GCSJDW,GCKCDW,GCSGDW,GCDD,GCX,GCY,GCBG,GCQSLC,GCJSLC,GCZXDH,GCZXLC,GCZXLX,GCZXSM,GCYX,GCZBZ,GCBLC,GCBZ,PZFA,BZ,GCSJ,DTABLE,ZGSW,DZJL,DZLD,JCMS,JQBS,FGCH,TLX,CDLB,YHZS,GC

C#连接Access数据库(详解)

做一个用VS2012的C#连接Access数据库的备忘, SQL数据库固然强大,有大微软的强力技术支持,LINQ的方便操作,但是如果写一个小程序对数据库方面没有什么大的要求的话,将来在数据库方面就可以选择使用access数据库,这样就能省去一定的开支. 首先,我们建一个数据库,因为大家使用的office版本不同,有用2000的有用2003的还有用 2007或者2010的.我用的是2007,但是无论用哪个版本请把建的数据库建为.mdb结尾的2003版本的不要建 .accdb结尾的. 建一个表,请先

Clementine读取数据库文件

看了一些网上写的资料,不太熟悉数据库和ODBC,只是总结下如何读取. Clementine读取数据库文件,该数据库文件时Access数据库文件. 第一步,建立数据源 win7系统下,win+R后输入odbcad32,出现ODBC数据管理器,在系统DSN中选择添加 打开数据源配置,发现只有SQLServer的驱动,其他的都没有了. 解决方法是: C:\Windows\SysWOW64 在这个目录下找到: odbcad32.exe 这个文件,双击打开.在网上看到的,没有试验. 输入数据源名,在数据库

在VS2013平台下,用VB.net 连接Access数据库

从开始学习计算机,我们使用的一直是SQL数据库.这次接触了Access数据库,我将从Access创建到连接向大家分享一下我在Access数据库中的收获. SQL数据库和Access数据库的区别:(来自百度) 那么如何用Vb.net 链接Access数据库呢? 第一,建立Access数据库文件 我的是WIN8.1的系统,直接在桌面的角上滑动一下,在搜索栏里搜索Access,就直接打开了Office自带的Access,如果你的电脑上没有安装Office,也想要用Access也不用担心,可以直接到去网