Results 1 to 15 of 15

Thread: Reading MS Access db

  1. #1
    Experienced user
    Join Date
    01-12-10.
    Posts
    814

    Default Reading MS Access db

    For a project at work I am building an intranet site using Contao. I need to get data from an existing MS Access database which is important for me to display inside the website. Right now I am just in a planning/orientation stage and I'd like to figure out how to best approach the problem. Just to be clear; the Contao db is MySQL, I need to get external data from the Access db.

    I see in the drivers folder that there is no existing driver. Should I write one, or are they only intended for use by the Contao website itself?

    Has anyone done this already?

    ps, Would adding an Access driver not allow Contao to be run on servers without a database? It might be an extra feature to think about? Scratch that, I did some research. Still wanting an answer to the actual question though...

  2. #2
    User
    Join Date
    07-26-09.
    Posts
    175

    Default Re: Reading MS Access db

    It would be great if you could write a new driver (I think that in early TYPOlight releases there was more drivers). I just wanted you to share a piece of code that I used in my recent project, to swap between 2 different mysql databases.

    [code=php:2h2v5r16]<span class="syntaxdefault">
    </span><span class="syntaxcomment">/**
    ***External*database*details
    ***@var*array
    **/
    </span><span class="syntaxkeyword">protected*</span><span class="syntaxdefault">$arrDatabase*</span><span class="syntaxkeyword">=*array
    (
    ****</span><span class="syntaxstring">'host'*****</span><span class="syntaxkeyword">=>*</span><span class="syntaxstring">''</span><span class="syntaxkeyword">,
    ****</span><span class="syntaxstring">'user'*****</span><span class="syntaxkeyword">=>*</span><span class="syntaxstring">''</span><span class="syntaxkeyword">,
    ****</span><span class="syntaxstring">'password'*</span><span class="syntaxkeyword">=>*</span><span class="syntaxstring">''</span><span class="syntaxkeyword">,
    ****</span><span class="syntaxstring">'database'*</span><span class="syntaxkeyword">=>*</span><span class="syntaxstring">''</span><span class="syntaxkeyword">,
    ****</span><span class="syntaxstring">'port'*****</span><span class="syntaxkeyword">=>*</span><span class="syntaxstring">''
    </span><span class="syntaxkeyword">);

    </span><span class="syntaxcomment">/**
    ***Change*database*to*external
    ***@param*boolean
    **/
    </span><span class="syntaxkeyword">public*function*</span><span class="syntaxdefault">changeDatabase</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$blnReverse*</span><span class="syntaxkeyword">=*</span><span class="syntaxdefault">false</span><span class="syntaxkeyword">)
    {
    ****if*(</span><span class="syntaxdefault">$blnReverse</span><span class="syntaxkeyword">)
    ****{****
    ********</span><span class="syntaxcomment">//*Load*default*configuration
    ********</span><span class="syntaxkeyword">include(</span><span class="syntaxdefault">TL_ROOT*</span><span class="syntaxkeyword">.*</span><span class="syntaxstring">'/system/config/localconfig.php'</span><span class="syntaxkeyword">);
    ****
    ********</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setDatabase</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbDatabase'</span><span class="syntaxkeyword">]);
    ********
    ********return;
    ****}
    ****
    ****</span><span class="syntaxdefault">$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbHost'</span><span class="syntaxkeyword">]*=*</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'host'</span><span class="syntaxkeyword">];****
    ****</span><span class="syntaxdefault">$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbUser'</span><span class="syntaxkeyword">]*=*</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'user'</span><span class="syntaxkeyword">];
    ****</span><span class="syntaxdefault">$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbPass'</span><span class="syntaxkeyword">]*=*</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'password'</span><span class="syntaxkeyword">];
    ****</span><span class="syntaxdefault">$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbPort'</span><span class="syntaxkeyword">]*=*</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'port'</span><span class="syntaxkeyword">];

    ****</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setDatabase</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'database'</span><span class="syntaxkeyword">]);
    }
    *</span><span class="syntaxdefault"></span>[/code:2h2v5r16]

    And in code you use it like this
    [code=php:2h2v5r16]<span class="syntaxdefault">
    </span><span class="syntaxcomment">//*Change*database*to*external
    </span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">changeDatabase</span><span class="syntaxkeyword">();

    </span><span class="syntaxcomment">//*Do*some*stuff
    </span><span class="syntaxdefault">$objAsd*</span><span class="syntaxkeyword">=*</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">execute</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"..."</span><span class="syntaxkeyword">);

    </span><span class="syntaxcomment">//*Change*database*back*to*Contao
    </span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">changeDatabase</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">true</span><span class="syntaxkeyword">);
    *</span><span class="syntaxdefault"></span>[/code:2h2v5r16]
    You could also improve this function e.g. by recognizing current database like
    [code=php:2h2v5r16]<span class="syntaxdefault">
    </span><span class="syntaxkeyword">if*(</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">tableExists</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'tl_page'</span><span class="syntaxkeyword">))
    {
    ***</span><span class="syntaxcomment">//*swap...
    </span><span class="syntaxkeyword">}
    *</span><span class="syntaxdefault"></span>[/code:2h2v5r16]
    and then no parameter is needed.

  3. #3
    Experienced user
    Join Date
    06-10-09.
    Location
    Cape Town, South Africa
    Posts
    1,387

    Default Re: Reading MS Access db

    A great way is to write a XML generator (or JSON) on the remote server to query your database and return it as XML/JSON over http. Then there is a function in PHP which simply converts that into a PHP array, allowing you to parse it easily. This is particularly helpful in your case, when there is multiple types of technologies, and if the SQL doesn't work either. You can even make the query have a parameter, block it from using only your IP or domainname, etc.

  4. #4
    Experienced user
    Join Date
    01-12-10.
    Posts
    814

    Default Re: Reading MS Access db

    Thyon, the file is on the same physical server, I can access it directly if needed. I would prefer that rather then calling another process, then converting the results.

    Tru, using that code the two databases should be using the same driver, right? Could I not add a second db object and get an instance of that instead?

  5. #5
    User
    Join Date
    07-26-09.
    Posts
    175

    Default Re: Reading MS Access db

    In addition to my code, here is corrected version:
    [code=php:2zkexirl]<span class="syntaxdefault">
    </span><span class="syntaxcomment">/**
    ***Change*database*to*external
    ***@param*boolean
    **/
    </span><span class="syntaxdefault">public*function*changeData base</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$blnReverse*</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">*false</span><span class="syntaxkeyword">)
    {
    </span><span class="syntaxdefault">****if*</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$blnReverse</span><span class="syntaxkeyword">)
    </span><span class="syntaxdefault">****</span><span class="syntaxkeyword">{</span><span class="syntaxdefault">****
    ********</span><span class="syntaxcomment">//*Load*default*configuration
    </span><span class="syntaxdefault">********include</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">TL_ROOT*</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">*</span><span class="syntaxstring">'/system/config/localconfig.php'</span><span class="syntaxkeyword">);

    </span><span class="syntaxdefault">********$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">execute</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SET*NAMES*'utf8'"</span><span class="syntaxkeyword">);</span><span class="syntaxdefault">****
    ********$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setDatabase</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbDatabase'</span><span class="syntaxkeyword">]);
    </span><span class="syntaxdefault">********
    ********return</span><span class="syntaxkeyword">;
    </span><span class="syntaxdefault">****</span><span class="syntaxkeyword">}
    </span><span class="syntaxdefault">****
    ****$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbHost'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">*</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">*$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'host'</span><span class="syntaxkeyword">];</span><span class="syntaxdefault">****
    ****$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbUser'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">*</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">*$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'user'</span><span class="syntaxkeyword">];
    </span><span class="syntaxdefault">****$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbPass'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">*</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">*$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'password'</span><span class="syntaxkeyword">];
    </span><span class="syntaxdefault">****$GLOBALS</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'TL_CONFIG'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'dbPort'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">*</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">*$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'port'</span><span class="syntaxkeyword">];

    </span><span class="syntaxdefault">****$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setDatabase</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">arrDatabase</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'database'</span><span class="syntaxkeyword">]);
    </span><span class="syntaxdefault">****$this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Database</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">execute</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SET*NAMES*'utf8'"</span><span class="syntaxkeyword">);
    }
    </span><span class="syntaxdefault">*</span>[/code:2zkexirl]
    That awful hack is because set_database() creates a new mysql/mysqli object but does not set the charset... Either Leo missed this or it is another "necessary feature"...

    @Ruud
    Well I think it is possible to have two drivers, since Databse library is a Factory pattern. I did not investigate the code enough to be sure, though.
    And yes, that code is used for the same drivers.

    ## EDIT
    Here is improved version of above function http://pstbn.com/felQzb
    If you leave empty values in array, then default (localconfig.php) will be used.

  6. #6
    User
    Join Date
    06-29-09.
    Posts
    271

    Default Re: Reading MS Access db

    I tried looking up older versions of Contao and the oldest I could find was 2.6. It does not include drivers for Access. So I probably need to figure out how to make a proper connection, then build the driver. But again, why would I use a switching function? What would be the advantage?

  7. #7
    User taca's Avatar
    Join Date
    06-20-09.
    Location
    Kyoto, Japan
    Posts
    111

    Default Re: Reading MS Access db

    Quote Originally Posted by Vera
    I tried looking up older versions of Contao and the oldest I could find was 2.6. It does not include drivers for Access.
    2.9.3 also dosen't include drivers for Access but MS SQL.
    --
    Takahiro Kambe

  8. #8
    User
    Join Date
    06-29-09.
    Posts
    271

    Default Re: Reading MS Access db

    MS Sql is a completely different database altogether, isn't it?

    ps, I forgot to mention I work together on this one with Ruud... :P

  9. #9
    User
    Join Date
    07-26-09.
    Posts
    175

    Default Re: Reading MS Access db

    Quote Originally Posted by Vera
    But again, why would I use a switching function? What would be the advantage?
    How would you change the database other way?

    Quote Originally Posted by Ruud
    Just to be clear; the Contao db is MySQL, I need to get external data from the Access db.

  10. #10
    Experienced user
    Join Date
    01-12-10.
    Posts
    814

    Default Re: Reading MS Access db

    Am I right when I assume you just change the database in such a way that if you wouldn't change it back the entire system would be using the wrong db? In that case that solution is not what I want, it seems like a hack. Can I not add a database object to whatever global place Contao uses for it's normal database object instance? Then I can just call that new instance whenever I need it. I guess that's the way to go, right?

  11. #11
    User
    Join Date
    07-26-09.
    Posts
    175

    Default Re: Reading MS Access db

    Hi Ruud

    Please check the link from my previous post http://pstbn.com/felQzb. There is also a usage example at the bottom of it.

    I don't think that creating another database instance is possible and simple, but if you manage to do that - share with me I used that code and worked for me very well. What you gonna do - your choice of course.

  12. #12
    User
    Join Date
    06-19-09.
    Posts
    328

    Default Re: Reading MS Access db

    Quote Originally Posted by Vera
    I tried looking up older versions of Contao and the oldest I could find was 2.6. It does not include drivers for Access. So I probably need to figure out how to make a proper connection, then build the driver. But again, why would I use a switching function? What would be the advantage?
    AFAIK the only way to connect to a MS Access database from php is using ODBC

    You must setup a ODBC connection on your windows installation (define it as system and not as user)

    Then you can write a ODBC driver that uses the odbc_* functions http://it.php.net/odbc
    Consulenza Contao CMS https://www.intco.it

  13. #13
    Experienced user
    Join Date
    01-12-10.
    Posts
    814

    Default Re: Reading MS Access db

    The access db is on a linux/apache server. So I'd need to see if an equivalent is available...

  14. #14
    User
    Join Date
    06-19-09.
    Posts
    328

    Default Re: Reading MS Access db

    Quote Originally Posted by Ruud
    The access db is on a linux/apache server. So I'd need to see if an equivalent is available...
    If this is a legacy database (that will not be updated any more) I suggest you to migrate the data to mysql

    I really do not like the idea of a ms access database on a linux server
    Consulenza Contao CMS https://www.intco.it

  15. #15
    Experienced user
    Join Date
    01-12-10.
    Posts
    814

    Default Re: Reading MS Access db

    I am, in fact, able to change the db to a MSSQL db. But we made that switch ones before and that gave us more trouble then it was worth. The software is kind of lame... Changing to MSSQL is something I'd have to discuss and will take longer then using an Access method if it exists for Linux/Apache.

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •