Php, odbc & vfp - PullRequest
       55

Php, odbc & vfp

2 голосов
/ 16 марта 2012

Я пытаюсь соединить базу данных 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

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

Я в этом случае пробовал с двойной косой чертой и без нее (\).

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

С уважением,

Жуан

1 Ответ

6 голосов
/ 17 марта 2012

Источник данных, который вы устанавливаете, включает полное имя .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");

Наконец, допустим, у вас есть более одной таблицы .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.Соединение знает, где оно будет пытаться найти таблицы для завершения запроса.Кроме того, ваше соединение НЕ позволяет вам идти относительно пути назад (ближе к C :), но позволяет вам идти относительно вперед.Итак, скажем, у вас есть структура каталогов, похожая на

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

, и вы устанавливаете точку подключения к папке «работа», как в исходном примере.Вы МОЖЕТЕ запросить ссылку на подпапки в вашем запросе.В этом запросе я использую «псевдоним» после каждой ссылки на имя таблицы, поэтому мне не нужно явно вводить длинное имя таблицы там, где оно используется в остальной части запроса.Это облегчает чтение.

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

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

...