2012-03-16 58 views
2

我試圖用php連接dbf數據庫。我嘗試了幾種不同的方式,沒有運氣。Php,odbc&vfp

PHP:5.3.8 文件:C:\ XAMPP \ htdocs中\工作\ vcabdoc.dbf

1RST方式:

創建數據源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 

我這種情況下,試着用和不用雙斜線(\)。

任何幫助?提前致謝。

問候,

若昂

回答

6

要設置數據源是包容的.DBF的全名的...不要那樣做。數據源應該只指向物理目錄WHERE表... ....然後,當您向表發出查詢時,它將按照查詢的名稱查找.dbf的路徑,找到它並返回......還有,你不需要明確包括的.dbf,如

SELECT * FROM YourTable.dbf

編輯每一次反饋

正在打開你的「連接」有一個數據源。這是告訴它應該在哪裏找到數據。連接到VFP源時,您只需將源設置爲表的物理路徑即可。注意我剛剛從字符串參數中刪除了「VCABDOC.DBF」。

$conn->Open('Provider=VFPOLEDB.1;Data Source="C:\\xampp\\htdocs\\work;";'); 

現在,你應該能夠只是直接從位於表查詢「C:\ XAMPP \ htdocs中\工作」文件夾中。

$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 

而你讓你的連接點的「工作」文件夾中的原始樣本。您可以查詢引用查詢中的子文件夾。在這個查詢中,我在每個表名稱引用之後使用「別名」,所以我不必在查詢的其餘部分顯式地鍵入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 

希望這有助於爲您澄清一些事情。

+0

我不太明白你在說什麼,你看,我只有16歲,我試圖爲我的實習做到這一點,如果你可以請更好地向我解釋這一點,在此先感謝和對於我缺乏經驗感到抱歉。 – 2012-03-19 09:34:34

+0

@ user1274469,請參閱修訂答案以進行說明 – DRapp 2012-03-19 11:02:22