我正在尝试使用php连接dbf数据库。我已经尝试了几种不同的方法,没有运气。
PHP:5.3.8 文件:C:\ xampp \ htdocs \ work \ vcabdoc.dbf
创建数据源dbvfp,驱动程序C:\ Windows \ system32 \ vfpodbc.dll
使用$odbc = odbc_connect ('dbvfp', '', '') or die('Could Not Connect to ODBC Database!');
Warning: odbc_connect() [function.odbc-connect]: SQL error: [Microsoft][ODBC Visual FoxPro Driver]File c:\xampp\htdocs\work\vcabdoc.dbf is not a database., SQL state S1000 in SQLConnect in C:\xampp\htdocs\WORK\odbc.php on line 5
include('\xampp\php\PEAR\adodb\adodb.inc.php');
include_once('\xampp\php\PEAR\adodb\adodb-pager.inc.php');
session_start();
$db = ADONewConnection('vfp');
$dsn="Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=C:\\xampp\\htdocs\\work\\vcabdoc.dbf;Exclusive=No;";
$db->Connect($dsn) or die('nope');
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$query = "Select * from vcabdoc.dbf";
$rs = $db->Execute($query);
echo 'e';
while (!$rs->EOF) {
print_r($rs->fields);
$rs->MoveNext();
Notice: Trying to get property of non-object in C:\xampp\htdocs\WORK\testing.php on line 45
Notice: Trying to get property of non-object in C:\xampp\htdocs\WORK\testing.php on line 46
Fatal error: Call to a member function MoveNext() on a non-object in C:\xampp\htdocs\WORK\testing.php on line 47
$conn = new COM("ADODB.Connection");
$conn->Open('Provider=VFPOLEDB.1;Data Source="C:\\xampp\\htdocs\\work\\vcabdoc.dbf;";');
// SQL statement to build recordset.
$rs = $conn->Execute("SELECT * FROM vcabdoc");
echo "<p>List of couriers:</p><hr>";
// Display all the values in the records set
while (!$rs->EOF) {
$fv = $rs->Fields("Name");
echo $fv->value."<br>\n";
$rs->MoveNext();
}
$rs->Close();
Fatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> Microsoft OLE DB Provider for Visual FoxPro<br/><b>Description:</b> Invalid path or file name.' in C:\xampp\htdocs\WORK\testing.php:54 Stack trace: #0 C:\xampp\htdocs\WORK\testing.php(54): com->Open('Provider=VFPOLE...') #1 {main} thrown in C:\xampp\htdocs\WORK\testing.php on line 54
我是这种情况,尝试使用和不使用双斜杠(\)。
有任何帮助吗?提前谢谢。
此致
若昂
答案 0 :(得分:6)
您正在设置的数据源包含.DBF的全名...请勿这样做。数据源应该只指向表所在的物理目录....然后,当您向表发出查询时,它会在您查询的名称中查找.dbf的路径,找到它并返回...此外,您不需要明确包含.dbf,例如
从YourTable.dbf中选择*
编辑每次反馈
正在打开的“连接”有一个数据源。这告诉它应该在哪里找到数据。连接到VFP源时,您所要做的就是将源设置为表的物理路径。注意我刚刚从字符串参数中删除了“VCABDOC.DBF”。
$conn->Open('Provider=VFPOLEDB.1;Data Source="C:\\xampp\\htdocs\\work;";');
现在,您应该可以直接从位于“c:\ xampp \ htdocs \ work”文件夹中的表中进行查询。
$rs = $conn->Execute("SELECT * FROM vcabdoc");
最后,假设您的“c:\ xampp \ htdocs \ work”文件夹中有多个.dbf表。说一个简单的客户/订单输入系统,您希望获得特定人员的所有订单。只要两个表都在同一个文件夹中(即:工作),那么你可以做类似的事情
$rs = $conn->Execute(
"SELECT customer.*, orders.*
FROM customer
join orders on customer.ID = orders.customerID
order by orders.date");
注意我没有明确地向查询中引入完整路径PLUS表名。连接知道它将尝试查找表以完成查询的位置。此外,你的连接不允许你去相对路径BACKWARDS(更接近C :),但是允许你相对前进。所以,假设你有一个类似
的目录结构c:\xampp\htdocs\work\
c:\xampp\htdocs\work\SubFolder1
c:\xampp\htdocs\work\SubFolder2
并且您将连接指向“work”文件夹,如原始示例中所示。您可以查询引用查询中的子文件夹。在此查询中,我在每个表名引用后使用“别名”,因此我不必显式键入在其余查询中使用的Long表名。它使可读性更容易。
("c" is alias to customers table)
("sft1" is alias to Sub-folder first table )
("sft2" is alias to Sub-folder second table )
select
c.*,
sft1.someField,
sft2.AnotherField
from
customers c
join SubFolder1\SomeOtherTable sft1
on c.SomeCommonColumn = sft1.SameCommonColumn
join SubFolder2\SecondTable sft2
on c.ADifferentColumn =sft2.SimilarPurposeColumn
希望这有助于为您澄清一些事情。