2012-04-10 4 views
8

Ich versuche, von einer Access-Datenbank zu lesen, die MDBTools Treiber verwendet, um eine odbc_connect auf Ubuntu 11.10 auszuführen. Es funktioniert gut, wenn Sie das DSN-Setup in /etc/odbc.ini verwenden.DSN-lose Verbindung mit PHP ODBC mit MDBTools Treiber

Im Folgenden sind die Inhalte von /etc/odbc.ini:

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

Das Treiber Attribut in odbc.ini Referenzen MDBToolsODBC, so, hier ist mein ODBC-Setup in /etc/odbcinst.ini:

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

Mein Problem ist, wenn $conn = odbc_connect('logindb','',''); mit , Ich muss den Hardcoded Wert für den Speicherort der Datenbank verwenden. Idealerweise möchte ich den ersten Parameter odbc_connect mit einer DSN-less-Verbindung angeben, so dass meine Datenbankdatei eine Variable sein kann (liest von verschiedenen dbs). Etwas wie:

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

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

habe ich auch versucht, es ohne die odbc: Präfix, aber es hat nicht funktioniert. Kann mir jemand sagen, warum die Angabe des DSN funktioniert, aber wenn ich versuche, es im Handumdrehen unter Verwendung von ähnlichen Attributen zu spezifizieren, funktioniert es nicht? Ich denke, dass es mit den Parametern und dem Inhalt des ersten Parameters in der DSN-losen Verbindung zu tun hat. Wie immer wird jede Hilfe sehr geschätzt.

+0

@Rocket: die Variablennamen in '/etc/odbc.ini Nach ', sollte es nicht' Database = $ db' sein? – eggyal

+0

@eggyal: Das hat auch nicht geholfen. Es heißt immer noch: 'SQL error: [unixODBC] [Treiber-Manager] Datenquellenname nicht gefunden und kein Standardtreiber angegeben. –

+0

@Rocket: Und wenn Sie 'Driver =/usr/lib/libmdbodbc.so.0' explizit angeben? – eggyal

Antwort

7

Ich denke, es könnte es nicht unterstützen. Ausgehend von der Quelle des eigentlichen Treibers sehen Sie, dass es die zu überprüfenden Parameter lädt, prüft, ob ihm eine DNS-Zeichenfolge übergeben wurde, prüft die INI-Dateien als nächstes und wenn es nicht fehlerhaft ist, werden die Parameter festgelegt.

Referenz von odbc.c neuesten 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; 

dann, wenn Sie in connectparams.c überprüfen, ExtractDSN sieht speziell für den DSN = string

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; 

Und LookupDSN sucht nach Inifiles oder kehrt sofort mit TRUE zurück, abhängig von der Precompilereinstellung HAVE_SQLGETPRIVATEPROFILESTRING.

So gegeben, dass

SetConnectString (params, szConnStrIn); 

nur auf die Daten funktioniert es von den zwei vorherigen Funktionen bekam, ich glaube es nicht DSN-less nicht unterstützt. Nur entweder ein richtiger DSN = String oder Ini-Dateien.

1

Es wird in 0.7.1 unterstützt. Sie können es von Github erhalten:

https://github.com/brianb/mdbtools

In Bezug auf die Verbindungszeichenfolge, das funktioniert für mich:

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