2

dbf データベースを php に接続しようとしています。私はいくつかの異なる方法を試しましたが、うまくいきませんでした。

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

2 番目の方法:

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

3 番目の方法:

$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

この場合、二重スラッシュ (\) の有無にかかわらず試してみました。

何か助けはありますか?前もって感謝します。

よろしく、

ジョアン

4

1 に答える 1

6

設定しているデータ ソースには、.DBF の完全な名前が含まれています...そうしないでください。データ ソースは、テーブルが存在する物理ディレクトリを指している必要があります。次に、テーブルにクエリを発行すると、クエリしている名前で .dbf のパスを検索し、それを見つけて返します。 ... また、次のように .dbf を明示的に含める必要はありません。

select * from 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");

完全なパスとテーブル名を明示的にクエリに投入していないことに注意してください。接続は、クエリを完了するためにテーブルを見つけようとする場所を認識しています。また、あなたの接続では、相対パスを後方 (C: に近い) に移動することはできませんが、相対的に前方に移動することはできます。したがって、次のようなディレクトリ構造があるとします

c:\xampp\htdocs\work\
c:\xampp\htdocs\work\SubFolder1
c:\xampp\htdocs\work\SubFolder2

そして、元のサンプルのように「work」フォルダーへの接続ポイントを作成します。クエリでサブフォルダーを参照してクエリを実行できます。このクエリでは、各テーブル名参照の後に「エイリアス」を使用しているため、残りのクエリで使用される長いテーブル名を明示的に入力する必要はありません。読みやすくなります。

("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

これがいくつかのことを明確にするのに役立つことを願っています。

于 2012-03-16T20:29:38.260 に答える