Php, odbc & vfp

Я пытаюсь подключить базу данных dbf с php. Я пробовал несколько разных способов, без везения.

PHP: 5.3.8 Файл: C: \ xampp \ htdocs \ work \ vcabdoc.dbf

1-й путь:

созданный источник данных 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 в 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 

Я в этом случае пытался с и без двойных слэшей (\).

Любая помощь? Заранее спасибо.

С Уважением,

Joao

Источник данных, который вы задаете, включает полное имя .DBF … Не делайте этого. Источник данных должен просто указывать на физический каталог WHERE table. Затем, когда вы выдаете запрос в таблицу, он ищет путь для .dbf по имени, которое вы запрашиваете, находит и возвращает это … Кроме того, вам не нужно явно включать .dbf, например

выберите * 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"); 

Наконец, скажем, у вас более одной таблицы .dbf в папке «c: \ xampp \ htdocs \ work». Скажите простую систему ввода заказов и заказов, и вы хотите получить все заказы для конкретного человека. Пока обе таблицы находятся в одной папке (то есть: работают), тогда вы можете сделать что-то вроде

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

Заметьте, что я явно не бросаю в запрос полное имя таблицы PLUS пути. Соединение знает, где он попытается найти таблицы для завершения запроса. Кроме того, ваше соединение НЕ позволяет вам относиться к пути BACKWARDS (ближе к C :), но DOES позволяет вам идти относительно ВПЕРЕД. Итак, скажем, у вас есть структура каталогов что-то вроде

 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 

Надеюсь, это поможет прояснить некоторые вещи для вас.