2012-04-10 14 views
8

Sto tentando di leggere da un database di Access utilizzando i driver MDBTools per eseguire un odbc_connect su Ubuntu 11.10. Funziona correttamente quando si utilizza l'impostazione DSN in /etc/odbc.ini.Connessione DSN-less con PHP ODBC utilizzando il driver MDBTools

Qui di seguito sono i contenuti di /etc/odbc.ini:

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

L'attributo driver in odbc.ini riferimenti MDBToolsODBC, così, qui è il mio setup ODBC in /etc/odbcinst.ini:

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

Il mio problema è, quando si utilizza $conn = odbc_connect('logindb','',''); , Devo usare il valore hardcoded per la posizione del database. Idealmente, vorrei specificare il primo parametro di odbc_connect usando una connessione senza DSN, in modo che il mio file di database possa essere una variabile (leggerà da diversi dbs). Qualcosa di simile:

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

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

Ho anche provato senza l'ODBC: prefisso, ma non ha funzionato. Qualcuno può dirmi perché funzioni il DSN, ma quando provi a specificarlo al volo usando quelli che sembrano gli stessi attributi, non funziona? Penso che abbia a che fare con i parametri e i contenuti del primo parametro nella connessione senza DSN. Come sempre, ogni aiuto è molto apprezzato.

+0

@Rocket: Dopo i nomi delle variabili in '/etc/odbc.ini ', non dovrebbe essere' Database = $ db'? – eggyal

+0

@eggyal: Anche questo non è stato d'aiuto. Dice ancora: 'Errore SQL: [unixODBC] [Driver Manager] Nome origine dati non trovato, e nessun driver predefinito specificato'. –

+0

@Rocket: E se si specifica esplicitamente 'Driver =/usr/lib/libmdbodbc.so.0'? – eggyal

risposta

7

Penso che potrebbe non supportarlo. Partendo dalla fonte del driver attuale si vede che carica i parametri che deve controllare, controlla se è stata data una stringa DNS, controlla i file ini e se non ha errato imposta i parametri.

per riferimento da odbc.c ultimi 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; 

poi quando si verifica in connectparams.c, ExtractDSN sembra appositamente per il DSN = stringa

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; 

E LookupDSN cerca le inifile o restituisce immediatamente con TRUE, a seconda dell'impostazione del precompilatore HAVE_SQLGETPRIVATEPROFILESTRING.

Quindi, dato che

SetConnectString (params, szConnStrIn); 

funziona solo sui dati ha ottenuto dai 2 precedenti funzioni, penso che non supporta DSN. Solo un DSN appropriato = stringa o file ini.

1

È supportato in 0.7.1. È possibile ottenere da github:

https://github.com/brianb/mdbtools

Per quanto riguarda la stringa di connessione, questo funziona per me:

"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", "", "");