PHP下CodeIgniter框架连接读取MS Access数据库文件
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数据库文件的更多相关文章
- Java 连接MS Access数据库
java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来 ...
- 64位系统使用Access 数据库文件的彻底解决方法
最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没 ...
- 如何连接并处理 sdf 数据库文件(便捷数据库处理)
如何连接并处理 sdf 数据库文件 SqlCeConnection cc = new SqlCeConnection(); DataTable dt = new DataTable(); ...
- CodeIgniter框架——源码分析之入口文件index.php
CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 在index.php中,CI首先做的事情就是设置PHP的错误报告, ...
- linux下程序JDBC连接不到mysql数据库
今天在linux下部署一个 JavaEE项目的时候总是连接不到Mysql数据库,检查之后发现连接池的配置确定是对的,进入linux服务器之后以mysql -uname -ppassword连接总是报A ...
- 64位系统中连接Access数据库文件的一个问题
近日在windows 7 64位系统中编译以前写的程序,发现在连接Access数据库时总是出现异常,提示“Microsoft.Jet.OLEDB.4.0”未在本机注册,同样的代码在32位的xp系统中却 ...
- 给Access数据库文件减肥
原理:数据文件和普通文件在硬盘上的存放方式不一样,你清空了表里的数据,但数据库里数据没了,但该数据的位置还在.就好比一个班里的学生都离开了教室,教室没有人了,但学生的座位还在一样(哈哈,这个比喻不是很 ...
- Windows下命令行连接mysql及导入sql文件
嗯,今天要把phpcms的模板放到服务器上,,,呃,phpMyAdmin死活连接不上数据库,这又是个神马情况无奈,又想到命令行了,好吧,最近喜欢上命令行了,不过这果然还是命令行强大啊,啊哈哈下面呢,我 ...
- win下apache的error.log和access.log文件过大
在httpd.conf中修改ErrorLog和CustomLog的配置 ErrorLog "|E:/apache2.2/bin/rotatelogs.exe E:/apache2.2/log ...
随机推荐
- .Net 事件总线之Autofac解耦
事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线基础知识,核心点放置使用Aut ...
- 在编写Arcgis Engine 过程中对于接口引用和实现过程过产生的感悟
Engine10.2版本 在vs里面新建类GeoMaoAO,并定义接口,在class中定义并实现,如下代码 以平时练习为例,我定义了一个接口,在里面定义了许多的控件,并在类中想要实现这一接口.如果在v ...
- 总结微信公众平台网页开发中遇到的ios的兼容问题
1. ios中音频不自动播放: 原因:出于节省流量的初衷,ios系统禁止音视频自动播放. 解决方案:使用微信的JS-SDK. DEMO: 先引入微信的JS-SDK, <script src=&q ...
- ArcGIS API for JavaScript 4.x 本地部署之跨域问题解决法:CORS
众所周知,在离线部署ArcGIS API for JavaScript时,有时候会产生微件上的字体.符号变成方框的问题.这是遇到了跨域,只需要对所在服务器进行配置即可. 本篇使用的环境是:API配置在 ...
- 3.App Inventor 2项目导入与导出
首先熟悉导入.导出项目是为了养成良好的备份习惯. 一.登陆App Inventor 2编程界面都大同小异,在项目菜单下面有导入项目和导出项目菜单. 二.打开导入项目界面,选择要导入的aia文件. 三. ...
- 阿里云或本地部署服务器(一)---nginx本地和服务器代理
具体步骤: 1.nginx下载 2.在G:\nginx-1.15.8\conf/nginx.conf改三处路径:nginx.conf 文件中配置的路径和端口要映射到vue项目工程 a.改 映射端口: ...
- getopt与getopt_long
如何通过命令行,为程序传入参数,可以使用函数getopt与getopt_long. 函数的声明如下: #include <unistd.h> int getopt(int argc, ch ...
- Window10 输入法不能删除问题解决
有时候我们想删除一个输入法,却发现输入法Remove 按钮是Disalbe 的,这时可以使用下面方法回避这个问题. 1.使用 Administrator 运行 Windows powerSheell. ...
- July 01st. 2018, Week 27th. Sunday
Empty your cup so that it may be filled. 清空杯子,方能再次装满. From Bruce Lee. We can't learn anything new if ...
- Video/Audio禁止快进(退)
首先接着上个随笔.上个随笔主要介绍了视频音频的相关操作.属性和方法.这里主要记录一个应用:禁止快进(快退同理). 思路:监听快进事件(此处是监听播放时间更新),利用一个缓存的时间和播放到的时间进行对比 ...