2012-04-10 6 views
8

Próbuję odczytać z bazy danych Access przy użyciu sterowników MDBTools, aby wykonać odbc_connect na Ubuntu 11.10. Działa dobrze, gdy używa się konfiguracji DSN w /etc/odbc.ini.Połączenie bez DSN z PHP ODBC przy użyciu sterownika MDBTools

Poniżej znajduje się treść /etc/odbc.ini:

[logindb] 
Description = Microsoft Access Try DB 
Driver = MDBToolsODBC 
Database = /home/folder1/TestDb.mdb 
Servername = localhost 

Atrybut kierowcy w odbc.ini odniesień MDBToolsODBC, tak, tutaj jest moja konfiguracja ODBC w /etc/odbcinst.ini:

[MDBToolsODBC] 
Description = MDB Tools ODBC 
Driver = /usr/lib/libmdbodbc.so.0 
Setup = 
FileUsage = 
CPTimeout = 
CPReuse = 

Mój problem jest, gdy za pomocą $conn = odbc_connect('logindb','',''); , Muszę użyć zakodowanej wartości dla lokalizacji bazy danych. Idealnie, chciałbym określić pierwszy parametr odbc_connect przy użyciu połączenia bez DSN, więc mój plik bazy danych może być zmienną (będzie czytać z różnych baz danych). Coś jak:

if ($cond1) { 
    $db = "/home/folder1/TestDb.mdb"; 
} else { 
    $db = "/home/folder1/TestDb2.mdb"; 
} 

$conn = odbc_connect("odbc:Driver={MDBToolsODBC};Dbq=$db",'',''); 

Próbowałem również bez prefiksu odbc:, ale to nie zadziałało. Czy ktoś może mi powiedzieć, dlaczego określenie DSN działa, ale kiedy próbuje określić go w locie za pomocą tego, co wygląda jak te same atrybuty, to nie działa? Myślę, że ma to związek z parametrami i zawartością pierwszego parametru w połączeniu bez DSN. Jak zawsze, każda pomoc jest bardzo doceniana.

+0

@Rocket: Następujące nazwy zmiennych w '/etc/odbc.ini ', czy nie powinno to być' Database = $ db'? – eggyal

+0

@eggyal: To też nie pomogło. Nadal jest napisane: "Błąd SQL: [unixODBC] [Driver Manager] Nie znaleziono nazwy źródła danych i nie określono domyślnego sterownika". –

+0

@Rocket: A jeśli jawnie określisz 'Driver =/usr/lib/libmdbodbc.so.0'? – eggyal

Odpowiedz

7

Myślę, że może nie obsługiwać tego. Idąc ze źródła rzeczywistego sterownika widzisz, że ładuje on paramy, które musi sprawdzić, sprawdza, czy został mu podany ciąg DNS, sprawdza pliki ini, a jeśli nie został zmyty, ustawia parametry.

odsyłające od odbc.c najnowszych mdbtools (mdbtools-0.6pre1)

SQLRETURN SQL_API SQLDriverConnect(
SQLHDBC   hdbc, 
SQLHWND   hwnd, 
SQLCHAR FAR  *szConnStrIn, 
SQLSMALLINT  cbConnStrIn, 
SQLCHAR FAR  *szConnStrOut, 
SQLSMALLINT  cbConnStrOutMax, 
SQLSMALLINT FAR *pcbConnStrOut, 
SQLUSMALLINT  fDriverCompletion) 
{ 
SQLCHAR FAR* dsn = NULL; 
SQLCHAR FAR* database = NULL; 
ConnectParams* params; 
SQLRETURN ret; 

TRACE("DriverConnect"); 

strcpy (lastError, ""); 

params = ((ODBCConnection*) hdbc)->params; 

if (!(dsn = ExtractDSN (params, szConnStrIn))) 
{ 
    LogError ("Could not find DSN in connect string"); 
    return SQL_ERROR; 
} 
else if (!LookupDSN (params, dsn)) 
{ 
    LogError ("Could not find DSN in odbc.ini"); 
    return SQL_ERROR; 
} 
else 
{ 
    SetConnectString (params, szConnStrIn); 

    if (!(database = GetConnectParam (params, "Database"))) 
    { 
LogError ("Could not find Database parameter"); 
return SQL_ERROR; 
    } 
} 
ret = do_connect (hdbc, database); 
return ret; 

wtedy kiedy sprawdzić w connectparams.c, ExtractDSN specjalnie szuka DSN = łańcuch

gchar* ExtractDSN (ConnectParams* params, const gchar* connectString) 
{ 
    char *p, *q, *s; 

    if (!params) 
    return NULL; 
    /* 
    * Position ourselves to the beginning of "DSN" 
    */ 
    p = strstr (connectString, "DSN"); 
if (!p) return NULL; 
/* 
    * Position ourselves to the "=" 
    */ 
q = strchr (p, '='); 
if (!q) return NULL; 

LookupDSN szuka inifiles lub natychmiast zwraca z TRUE, w zależności od ustawienia prekompilatora HAVE_SQLGETPRIVATEPROFILESTRING.

Więc skoro

SetConnectString (params, szConnStrIn); 

działa tylko na danych, które dostał od 2 poprzednich funkcji, myślę, że nie obsługuje DSN-mniej. Tylko właściwy DSN = ciąg znaków lub pliki ini.

1

Jest obsługiwany w wersji 0.7.1. Można go pobrać z github:

https://github.com/brianb/mdbtools

chodzi ciągu połączenia, to działa na mnie:

"Driver=Microsoft Access Driver (*.mdb);DBQ=///file.mdb;UID=;PWD=;" 
0
$driver = "MDBTools"; -- Driver name from /etc/odbcinst.ini 
$dbName = "/path/to/database.mdb"; -- Full path of your MDB file 
$db = new PDO("odbc:Driver=$driver;DBQ=$dbName", "", "");