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

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

1、odbc

2、pdo_odbc

如果没有,请自行搜索安装,win下比较简单,linux下就比较麻烦了,lanmp3.1集成环境下可以看写的这篇文章。以下内容只适用用windows场景下,因为后来才知道linux下只有pdo_odbc是不行的,还需要access相关的驱动。

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数据库有很多的限制,以及与mysql语法的很多区别:

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,access语句会产生两个同名字段,所以别名一定不要与要查询的其它字段名相同
5、access不支持limit语句,可以在select中用top n的形式获取
6、insert如果用原生access sql语句,必须加上into,即"insert into ..."
7、查询和写入中文时需要转码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数据库相关,刚接触,应该还有很多坑在前方。

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

  1. Java 连接MS Access数据库

    java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来 ...

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

    最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没 ...

  3. 如何连接并处理 sdf 数据库文件(便捷数据库处理)

    如何连接并处理 sdf 数据库文件 SqlCeConnection cc = new SqlCeConnection();        DataTable dt = new DataTable(); ...

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

    CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php.   在index.php中,CI首先做的事情就是设置PHP的错误报告, ...

  5. linux下程序JDBC连接不到mysql数据库

    今天在linux下部署一个 JavaEE项目的时候总是连接不到Mysql数据库,检查之后发现连接池的配置确定是对的,进入linux服务器之后以mysql -uname -ppassword连接总是报A ...

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

    近日在windows 7 64位系统中编译以前写的程序,发现在连接Access数据库时总是出现异常,提示“Microsoft.Jet.OLEDB.4.0”未在本机注册,同样的代码在32位的xp系统中却 ...

  7. 给Access数据库文件减肥

    原理:数据文件和普通文件在硬盘上的存放方式不一样,你清空了表里的数据,但数据库里数据没了,但该数据的位置还在.就好比一个班里的学生都离开了教室,教室没有人了,但学生的座位还在一样(哈哈,这个比喻不是很 ...

  8. Windows下命令行连接mysql及导入sql文件

    嗯,今天要把phpcms的模板放到服务器上,,,呃,phpMyAdmin死活连接不上数据库,这又是个神马情况无奈,又想到命令行了,好吧,最近喜欢上命令行了,不过这果然还是命令行强大啊,啊哈哈下面呢,我 ...

  9. win下apache的error.log和access.log文件过大

    在httpd.conf中修改ErrorLog和CustomLog的配置 ErrorLog "|E:/apache2.2/bin/rotatelogs.exe E:/apache2.2/log ...

随机推荐

  1. EFCore中 join on的不同

    当 多条件 left join on 时 LEFT OUTER JOIN on new { u.UserId, ue.ExamId } equals new { sac.UserId, sac.Exa ...

  2. Git:四、连接GitHub远程仓库

    1.拥有一个GitHub网站的账号 2.创建SSH Key 打开终端(Windows打开Git Bash),输入: ssh-keygen -t rsa -C "youremail@??.co ...

  3. (一)初识Redis

    1.redis简介 Redis是一个速度非常快的key-value非关系型存储数据库,可以存储5种形态的键值对,可以将存储在内存中的键值对持久化到硬盘,可以使用复制特性扩展读性能,还可以使用客户端分片 ...

  4. July 04th. 2018, Week 27th. Wednesday

    And if you really want to see what people are, all you have to do is to look. 想真正了解他人,只需要用心看. From W ...

  5. cglib根据数据动态生成对象

    最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import jav ...

  6. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  7. Docker & ASP.NET Core (2):定制Docker镜像

    上一篇文章:把代码连接到容器 Dockerfile 在Docker的世界里,我们可以通过一个叫Dockerfile的文件来创建Docker镜像,随后可以运行容器. Dockerfile就是一个文本文件 ...

  8. 【机器学习】--主成分分析PCA降维从初识到应用

    一.前述 主成分分析(Principal Component Analysis,PCA), 是一种统计方法.通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分. ...

  9. WebPack引用Bootstrap 无法使用图标的结局方案

    npm i https://github.com/iconic/open-iconic.git -D  因为boostrap的css里删除了图标 分开了 我们在引入个呵呵. 下载:npm i boot ...

  10. 【Android Studio安装部署系列】十三、Android studio添加和删除Module

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 新建.导入.删除Module是常见的操作,这里简单介绍下. 新建Module File——New——New Module... 选中 ...