2012-03-16 12 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 

を使用しました

第三の方法:

$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の完全な名前が含まれておりは...それをしないでください。データソースは、テーブルが....の物理ディレクトリを指し示すだけです。次に、テーブルにクエリを発行すると、クエリ中の名前で.dbfのパスが検索され、 ...また、あなたは明示的に*がある開かれているFEEDBACK PER EDIT

あなたの "接続"

YourTable.dbf

からを選択し、そのような

として.DBFを含める必要はありませんデータソース。それはデータをどこに見つけるべきかを示しています。 VFPソースに接続するときは、ソースをテーブルの物理パスに設定するだけです。私はちょうど文字列パラメータから "VCABDOC.DBF"を取り除いたことに注意してください。 NOW

$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テーブルがあるとします。シンプルな顧客/注文入力システムと言うと、特定の人物のすべての注文を取得する。限り、両方のテーブルが同じフォルダ(例:仕事)であるとして、あなたは私が明示的にクエリにフルパスPLUSテーブル名を投げていないよ

$rs = $conn->Execute(
"SELECT customer.*, orders.* 
    FROM customer 
     join orders on customer.ID = orders.customerID 
     order by orders.date"); 

お知らせのような何かを行うことができます。接続は、クエリを完了するためにテーブルを検索しようとする場所を知っています。また、あなたの接続は、あなたが相対パス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歳で、私は私のインターンシップのためにこれをやろうとしています。あなたが私にそれをもっと良く説明してくれれば、前もって感謝しています。私の経験不足のために申し訳ありません。 –

+0

@ user1274469、解説を参照してください – DRapp