XXV. dBase Functions

简介

These functions allow you to access records stored in dBase-format (dbf) databases.

dBase files are simple sequential files of fixed length records. Records are appended to the end of the file and delete records are kept until you call dbase_pack().

The types of dBase fields available are:

表 1. Available types of fields

FielddBase TypeFormatAdditional information
MMemon/aThis type is not supported by PHP, such field will be ignored
DDateYYYYMMDDThe field length is limited to 8
NNumberA number You must declare a length and a precision (the number of digits after the decimal point)
CStringA stringYou must declare a length. When retrieving data, the string will be right-padded with spaces to fit the declared length.
LBooleanT or Y for TRUE, F or N for FALSEStored and returned as an integer (1 or 0)
FFloatA float numberSupport for this type of field was added in PHP 5.2.0

警告

There is no support for indexes or memo fields. There is no support for locking, too. Two concurrent web server processes modifying the same dBase file will very likely ruin your database.

We recommend that you do not use dBase files as your production database. Choose any real SQL server instead; MySQL or Postgres are common choices with PHP. dBase support is here to allow you to import and export data to and from your web database, because the file format is commonly understood by Windows spreadsheets and organizers.

安装

In order to enable the bundled dbase library and to use these functions, you must compile PHP with the --enable-dbase option.

运行时配置

本扩展模块在 php.ini 中未定义任何配置选项。

资源类型

本扩展模块未定义任何资源类型。

范例

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().

预定义常量

本扩展模块未定义任何常量。

目录
dbase_add_record -- Adds a record to a database
dbase_close -- Closes a database
dbase_create -- Creates a database
dbase_delete_record -- Deletes a record from a database
dbase_get_header_info -- Gets the header info of a database
dbase_get_record_with_names --  Gets a record from a database as an associative array
dbase_get_record --  Gets a record from a database as an indexed array
dbase_numfields -- Gets the number of fields of a database
dbase_numrecords -- Gets the number of records in a database
dbase_open -- Opens a database
dbase_pack -- Packs a database
dbase_replace_record -- Replaces a record in a database

add a note add a note User Contributed Notes
bi.idan AT gmail.com
16-Apr-2007 11:40
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;
   }
}

?>
Hadi Rusiah / deegos at yahoo dot com
08-May-2004 05:33
If you are using PHP < 5, you can use this function to retrieve dbf header

<?
function get_dbf_header($dbfname) {
  
$fdbf = fopen($dbfname,'r');

  
$dbfhdrarr = array();
  
$buff32 = array();
  
$i = 1;
  
$goon = true;

   while (
$goon) {
     if (!
feof($fdbf)) {
        
$buff32 = fread($fdbf,32);
         if (
$i > 1) {
           if (
substr($buff32,0,1) == chr(13)) {
              
$goon = false;
           } else {
              
$pos = strpos(substr($buff32,0,10),chr(0));
              
$pos = ($pos == 0?10:$pos);

              
$fieldname = substr($buff32,0,$pos);
              
$fieldtype = substr($buff32,11,1);
              
$fieldlen = ord(substr($buff32,16,1));
              
$fielddec = ord(substr($buff32,17,1));

array_push($dbfhdrarr, array($fieldname,$fieldtype,$fieldlen,$fielddec));

           }
         }
        
$i++;
     } else {
        
$goon = false;
     }
   }

  
fclose($fdbf);
   return(
$dbfhdrarr);
}

$arr = get_dbf_header('/data/file.dbf');
print_r($arr);
?>