• 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数据库相关,刚接触,应该还有很多坑在前方。

  • 相关阅读:
    HDU 2544 最短路
    Codeforces Round #358 (Div. 2) Alyona and Strings
    Codeforces Round #358 (Div. 2) Alyona and the Tree
    Codeforces Round #357 (Div. 2) Runaway to a Shadow
    pycharm快捷键和一些常用的设置
    Python不同功能的函数
    面向对象技术简介
    数据结构
    python学习笔记
    ORACLE基本语法
  • 原文地址:https://www.cnblogs.com/vishun/p/6526456.html
Copyright © 2020-2023  润新知