PHP 8.4.0 RC4 available for testing

dBase 関数

Many examples in this reference require a dBase database. We will use /tmp/test.dbf that will be created in the example of dbase_create().

目次

add a note

User Contributed Notes 2 notes

up
4
bi.idan AT gmail.com
17 years ago
I know lots of you dosent really use dbase, but i've builded a class to help the one how dose.
(sorry for bad english)

- dbase.php

<?php

set_time_limit
(0);
// site_path defined by parent
require_once (SITE_PATH. '/server/php/libs/dbase/handler.php');

/* DBase (dbf)
* manage dbf files, exports and search functionality
* with buildin optimizers for fast performance
*/

class DBase
{
private
$handler = false;
private
$searchopt = array (); // Search optimizer

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;
}

/* Search
* search for string inside header
* returns record number
* false returned if not found or error occurred
* limit_results gets int or false, limit_results equels one will limit the
* search results for one result only, false for no limit
*/
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); // Disabled optimizer to prevent memory overflow
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 Handler (dbf)
* handles dbase resource
*/

class DBase_Handler
{
private
$resource;
private
$size; // Records Count
private $header = array ();
private
$dataopt = array (); // Data optimizer

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) // Data saving optimizer
{
$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;
}
}

?>
up
0
bi.idan [at] gmail.com
15 years ago
some of you contacted me about memo fields and my script, so i'll just post my answers on the common question here.

(note: this is not an adv for any program, only what i used for myself, and it's free)

so, there are 2 options if you want to create/read memo fields:

1. use a library for java/c++/c# to build a bridge between php and dbf file. i've used dbf2java. althougth it's not near complete as my other option, it's a good start. (http://code.google.com/p/dbf2java-library/)

2. use an external program with pipes to grab the output. i used cdbflite, (http://www.whitetown.com/cdbflite/). it's free, and pretty much gives you everything you need to handle those dbf files. i'm not sure about big databases and it seems you need to register/buy it, but it's again, a start.

hope it helps some of you who needs to handle those database files,

Good luck,
idan
To Top