Reputation: 3684
I have been digging internet for couple days, reading very old information, that leads to very old and nonexisting sites, still, I understood, what is needed to achieve my goal.
Correct me, if I'm mistaken and please give me more advice, how to achieve such a connection.
Upvotes: 6
Views: 14989
Reputation: 1
Use PDO with MDBTools:
install:
apt-get install libodbc1
apt-get install libmdbodbc1
apt-get install php5-odbc
(restart apache)
Sample:
$query = 'SELECT * FROM Table';
$mdb_file = 'file.mdb';
$driver = 'MDBTools';
$dataSourceName = "odbc:Driver=$driver;DBQ=$mdb_file;Uid=user;Pwd=pass;";
$connection = new \PDO($dataSourceName);
$result = $connection->query($query)->fetchAll(\PDO::FETCH_ASSOC);
print_r($result);
Upvotes: 0
Reputation: 1143
Its commercial, so possibly not of interest, but Easysoft have an ODBC driver for Access that's available on Most *nix's. No bridge required. There isn't a build on FreeBSD at the moment, but I could get one built for you on Monday if it's of any interest.
There is the open source MDB tools that may have enough for what you want, but it is lacking in quite a lot of functionality.
Upvotes: 0
Reputation: 3684
Finally, I found solution.
Mount Win server directory with .mdb files
sshfs {user}@:/ {unix mount point} -o workaround=rename,allow_other
Set up on unix server mdbtools
So, I used default PHP code from docs and write this PHP script:
$rows = $cols = array();
if (($handle = popen('/usr/bin/mdb-export {unix mount point}/{file}.mdb {table} 2>&1', 'r')) !== FALSE) {
while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {
$num = count($data);
if ($row == 1) { for ($c=0; $c < $num; $c++) { $cols[] = $data[$c]; } }
else { for ($c=0; $c < $num; $c++) { $rows[$row][$cols[$c]] = $data[$c]; } }
$row++;
}
pclose($handle);
}
print_r($rows);
find / -name "mdb-export"
, if you can't find yours).mdb-tables {unix mount point}/<file>.mdb
There is no need for drivers, configuration or other stuff, just plain mdbtools and access to file, in this case, achieved with remote connection through ssh. In you want, you can install fuse package, to autmatically mount remote directory, but that is another question.
Hope someone this helps.
Upvotes: 4
Reputation: 279
You are correct insomuch that you require an ODBC to ODBC Bridge.
At OpenLInk we refer to a Multi-tier ODBC to ODBC Bridge...
This is Multi-tier in the sense that it has a client/server architecture as follows --
Linux Client -- ODBC Application OpenLink Generic ODBC Driver
Windows Server -- 32bit OpenLink request Broker 32bit OpenLink ODBC Agent 32bit Microsoft Access ODBC Driver (with pre configured DSN) Microsoft Access Database file.
Upvotes: 1
Reputation: 360702
You don't connect to a "server dsn". DSN's are a local thing only. They're not exposed for remote connections at all. If you want a machine to connect to a database, you need to have a DSN configured on that machine - you won't be able to use a DSN specified elsewhere.
For PHP ODBC, that'd be
$connection = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=/network/path/to/your/access/database.mdb", $user, $password);
Upvotes: 1