PHP和MS Access
时间:2020-03-06 14:32:27 来源:igfitidea点击:
如何将PHP脚本连接到MS Access(.mdb)文件?
我尝试通过包含以下PHP代码进行尝试:
$db_path = $_SERVER['DOCUMENT_ROOT'] . '\WebUpdate\' . $file_name . '.mdb'; $cfg_dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" . $db_path; $odbcconnect = odbc_connect($cfg_dsn, '', '');
但是它失败了,我收到以下错误消息:
Warning: odbc_connect() [function.odbc-connect]: SQL error: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified, SQL state IM002 in SQLConnect in C:\web\WebUpdate\index.php on line 41
解决方案
这是连接和简单选择的示例...
<?php $db_conn = new COM("ADODB.Connection"); $connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath("./Northwind.mdb").";"; $db_conn->open($connstr); $rS = $db_conn->execute("SELECT * FROM Employees"); $f1 = $rS->Fields(0); $f2 = $rS->Fields(1); while (!$rS->EOF) { print $f1->value." ".$f2->value."<br />\n"; $rS->MoveNext(); } $rS->Close(); $db_conn->Close(); ?>
在文件名中,我正在查看" \ WebUpdate ",看起来我们在开头有一个反斜杠,在结尾有两个反斜杠。我们可能在一开始就缺少反斜杠了吗?
$db_path = $_SERVER['DOCUMENT_ROOT'] . '\WebUpdate\' . $file_name . '.mdb';
用反斜杠代替反斜杠。 '/ WebUpdate /'。
似乎是路径分隔符的问题。 ISTR,我们必须通过反斜杠而不是正斜杠
以下内容适用于Webroot中名为db4的MDB文件
$defdir = str_replace("/", "\", $_SERVER["DOCUMENT_ROOT"]); $dbq = $defdir . "\db4.mdb"; if (!file_exists($dbq)) { die("Database file $dbq does not exist"); } $dsn = "DRIVER=Microsoft Access Driver (*.mdb);UID=admin;UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;FIL=MS Access;DriverId=25;DefaultDir=$defdir;DBQ=$dbq"; $odbc_conn = odbc_connect($dsn,"","") or die("Could not connect to Access database $dsn");
我不确定这是否违反最佳做法或者安全性,但我想提出以下建议:
设置ODBC连接,并将数据库的密码包含在odbc高级设置中。
给odbc conn一个DSN名称,然后保存。
在代码中,只需建立如下连接:
try { $conn = @odbc_connect("DSNName", "", "", "SQL_CUR_USE_ODBC"); // un and pw parameters are passed as empty strings since the DSN // has knowledge of the password already. // 4th parameter is optional $exec = @odbc_exec($conn, $insert) or die ("exec error"); echo "success!"; } catch (Exception $e) { echo $e->getMessage(); } // end try catch