dBase 函数

示例

本参考中的许多示例都需要一个 dBase 数据库。我们将使用 /tmp/test.dbf,它将在 dbase_create() 的示例中创建。

目录

添加笔记

用户贡献的笔记 2 笔记

9
bi.idan AT gmail.com
17 年前
我知道很多人不使用 dbase,但我创建了一个类来帮助那些使用的人。
(抱歉,英语不好)

- dbase.php

<?php

set_time_limit
(0);
// site_path 由父级定义
require_once (SITE_PATH. '/server/php/libs/dbase/handler.php');

/* DBase (dbf)
* 管理 dbf 文件,导出和搜索功能
* 具有内置优化器以实现快速性能
*/

class DBase
{
private
$handler = false;
private
$searchopt = array (); // 搜索优化器

private function unload ()
{
if (
$this-> handler !== false)
unset (
$this-> handler);
}

public function
__construct ($file = false)
{
if (
$file !== false)
$this-> load ($file);
}

public function
__destruct ()
{
$this-> unload ();
}

public function
load ($file)
{
$resource = dbase_open ($file, 0);
$this-> handler = new DBase_Handler ($resource);

return
$this-> handler;
}

/* 搜索
* 在头文件中搜索字符串
* 返回记录号
* 如果未找到或发生错误,则返回 false
* limit_results 获取 int 或 false,limit_results 等于 1 将搜索结果限制为一个结果,false 表示无限制
*/
public function search ($headerText, $string, $limit_results = false, $handler = false)
{
if (
$handler === false)
$handler = $this-> handler;

if (
$this-> searchopt [$headerText][$string])
return
$this-> searchopt [$headerText][$string];
else
{
$size = $handler-> getSize ();
if ( (
$headerNumber = $handler-> getHeaderNumber ($headerText) ) !== false)
{
$results = array ();
for (
$i = 1; $i < $size; $i++)
{
$record = $handler-> getRecord ($i, false); // 禁用优化器以防止内存溢出
if (trim ($record [$headerNumber]) == $string)
{
$results[] = $i;

if ( (
$limit_results !== false) && (sizeof ($results) == $limit_results) )
break;
}
}

if (
sizeof ($results) > 0)
{
$this-> searchopt [$headerText][$string] = $results;
return
$this-> search ($headerText, $string, $handler);
}

return
false;
} else
return
false;
}
}
}

?>

- dbase_handler.php

<?php

/* DBase 处理程序 (dbf)
* 处理 dbase 资源
*/

class DBase_Handler
{
private
$resource;
private
$size; // 记录计数
private $header = array ();
private
$dataopt = array (); // 数据优化器

private function setHeader ()
{
$this-> header = dbase_get_header_info ($this-> resource);
}

public function
__construct ($resource)
{
$this-> resource = $resource;
$this-> setHeader ();
$this-> size = dbase_numrecords ($this-> resource);
}

public function
__destruct ()
{
dbase_close ($this-> resource);
}

public function
getRecord ($record_number, $dataopt = true)
{
if (
$record_number > $this-> size)
return
false;
else
{
if (
$this-> dataopt [$record_number])
return
$this-> dataopt [$record_number];
else
{
$record = dbase_get_record ($this-> resource, $record_number);
if (
$dataopt === true) // 数据保存优化器
{
$this-> dataopt [$record_number] = $record;
return
$this-> getRecord ($record_number);
} else
return
$record;
}
}
}

public function
getHeaderNumber ($headerText)
{
foreach (
$this-> header as $index => $header)
{
if (
$header ['name'] == $headerText)
{
return
$index;
break;
}
}

return
false;
}

public function
getHeader ($headerNumber)
{
if (
$headerNumber <= sizeof ($this-> header))
return
$this-> header [$headerNumber];
else
return
false;
}

public function
getSize ()
{
return
$this-> size;
}
}

?>
-1
bi.idan [at] gmail.com
15 年前
一些朋友联系过我询问关于备忘录字段和我的脚本,所以我会在这里发布一些关于常见问题的答案。

(注意:这不是任何程序的广告,只是我自己使用的,而且它是免费的)

所以,如果你想创建/读取备忘录字段,有两种选择

1. 使用 Java/C++/C# 的库来构建 PHP 和 dbf 文件之间的桥梁。我使用的是 dbf2java。虽然它没有像我的其他选择那样完整,但它是一个好的开始。 (http://code.google.com/p/dbf2java-library/)

2. 使用带有管道的外置程序来获取输出。我使用的是 cdbflite,(http://www.whitetown.com/cdbflite/)。它是免费的,并且几乎提供了你处理那些 dbf 文件所需的一切。我不确定大型数据库,而且似乎你需要注册/购买它,但它仍然是一个好的开始。

希望这可以帮助一些需要处理这些数据库文件的朋友,

祝你好运,
idan
To Top