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

Posted 漫游云巅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数据库相关,刚接触,应该还有很多坑在前方。

以上是关于CodeIgniter框架连接读取MS Access数据库文件的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP tp Codeigniter ci 微信开发 控制器代码 示例 实例 模拟http请求 获取acces_token 创建自定义菜单 点击事件 转多客服

Codeigniter 框架的 XAMPP 数据库连接问题

mysql vs ms-access DB上的sql查询左连接

将日期插入数据库时​​出现 SQL 语法错误(框架:codeigniter)

是否有任何 PHP 框架(例如 CodeIgniter)支持基于每个用户帐户的数据库连接,以便在多租户数据库中使用?

Codeigniter MSSQL/SQLSRV 连接