2012-04-10 13 views
8

Tôi đang cố gắng đọc từ cơ sở dữ liệu Access bằng cách sử dụng các trình điều khiển MDBTools để thực thi odbc_connect trên Ubuntu 11.10. Nó hoạt động tốt khi sử dụng thiết lập DSN trong /etc/odbc.ini.Kết nối DSN-less với ODBC PHP bằng MDBTools Driver

Dưới đây là nội dung của /etc/odbc.ini:

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

Thuộc tính điều khiển trong tài liệu tham khảo odbc.iniMDBToolsODBC, vì vậy, đây là thiết lập của tôi odbc trong /etc/odbcinst.ini:

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

Vấn đề của tôi là, khi sử dụng $conn = odbc_connect('logindb','',''); , Tôi phải sử dụng giá trị hardcoded cho vị trí cơ sở dữ liệu. Lý tưởng nhất, tôi muốn chỉ định tham số đầu tiên của odbc_connect sử dụng kết nối DSN-less, do đó tệp cơ sở dữ liệu của tôi có thể là một biến (sẽ được đọc từ các dbs khác nhau). Một cái gì đó như:

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

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

Tôi cũng đã thử nó mà không có tiền tố odbc: nhưng nó không hoạt động. Bất cứ ai có thể cho tôi biết lý do tại sao chỉ định DSN hoạt động, nhưng khi cố gắng xác định nó trên bay bằng cách sử dụng những gì trông giống như các thuộc tính tương tự, nó không hoạt động? Tôi nghĩ rằng nó đã làm với các tham số và nội dung của tham số đầu tiên trong kết nối DSN-ít hơn. Như mọi khi, bất kỳ trợ giúp nào cũng được đánh giá cao.

+0

@Rocket: Sau khi tên biến trong '/etc/odbc.ini ', không phải là 'Cơ sở dữ liệu = $ db'? – eggyal

+0

@eggyal: Điều đó cũng không giúp được gì. Nó vẫn nói: 'Lỗi SQL: [unixODBC] [Trình quản lý trình điều khiển] Không tìm thấy tên nguồn dữ liệu và không có trình điều khiển mặc định nào được chỉ định'. –

+0

@Rocket: Và nếu bạn chỉ định rõ ràng 'Driver =/usr/lib/libmdbodbc.so.0'? – eggyal

Trả lời

7

Tôi nghĩ rằng nó có thể không hỗ trợ nó. Đi từ nguồn của trình điều khiển thực tế bạn thấy rằng nó tải các params nó cần phải kiểm tra, kiểm tra wether nó đã được đưa ra một chuỗi DNS, kiểm tra các tập tin ini tiếp theo và nếu nó đã không errored ra nó đặt params.

để tham khảo từ odbc.c mdbtools mới nhất (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; 

sau đó khi bạn xác minh trong connectparams.c, ExtractDSN đặc biệt trông cho DSN = chuỗi

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; 

Và LookupDSN tìm kiếm các dấu thăng hoa hoặc trả về ngay lập tức với TRUE, tùy thuộc vào cài đặt trình biên dịch trước HAVE_SQLGETPRIVATEPROFILESTRING.

Vì vậy, cho rằng

SetConnectString (params, szConnStrIn); 

chỉ hoạt động trên các dữ liệu mà nó nhận được từ 2 chức năng trước đó, tôi nghĩ rằng nó không hỗ trợ DSN-ít. Chỉ có một tệp DSN = chuỗi hoặc ini thích hợp.

1

Nó được hỗ trợ trong 0.7.1. Bạn có thể lấy nó từ github:

https://github.com/brianb/mdbtools

Về chuỗi kết nối, điều này làm việc cho tôi:

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