php、odbc 和 vfp

标签 php dbf visual-foxpro dbase

我正在尝试将 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

第二种方式:

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

在这种情况下,尝试使用和不使用双斜杠 (\)。

有什么帮助吗?提前致谢。

问候,

若昂

最佳答案

您正在设置的数据源包含 .DBF 的全名...不要那样做。数据源应该只指向表所在的物理目录......然后,当您向表发出查询时,它会根据您正在查询的名称在路径中查找 .dbf,找到它并返回它...另外,您不需要显式包含 .dbf,例如

从 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 表。假设有一个简单的客户/订单输入系统,并且您想获得特定人员的所有订单。只要两个表都在同一个文件夹中(即:work),那么你就可以做类似的事情

    $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

然后您将连接指向原始示例中的“工作”文件夹。您可以查询引用查询中的子文件夹。在此查询中,我在每个表名引用后使用了一个“别名”,因此我不必在查询的其余部分使用的地方显式键入长表名。它更易于阅读。

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

希望这有助于为您澄清一些事情。

关于php、odbc 和 vfp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9740869/

相关文章:

php - Smarty/如何包含PHP函数来压缩CSS文件

python - 使用 pyodbc 读取 DBF 文件

c# - 在 Visual Fox Pro 中准确填充列表框

combobox - Foxpro 组合框获得选定的值?

mysql - 如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?

mysql - dBase 表达式 类似于 MYSQL 中没有

c# - 在 .Net 中加密 在 php 中解密

php - 你如何为每个表格行递增一个数字?

php - mysqlnd驱动只有一个api扩展(pdo_mysql)

.net - VFP OleDb 的 Sql 参数化语法错误