downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

dbase_add_record> <dba_sync
[edit] Last updated: Mon, 01 Nov 2010

view this page in

XXV. Funciones para dBase

Introducción

Estas funciones permiten el acceso a datos almacenados en bases de datos con formato dBase (dbf).

Los archivos dBase son simplemente archivos secuenciales que contienen registros de anchura fija. Los registros se van añadiendo al final del archivo y los registros borrados se mantienen en el archivo hasta que se llama a la función dbase_pack().

Los tipos de campos de dBase disponibles son los siguientes:

Tabla 1. Tipos de campos disponibles

CampoTipo dBaseFormatoInformación adicional
MMemon/dEste tipo no está soportado por PHP, por lo que los campos de este tipo se ignoran
DDateYYYYMMDDLa longitud del campo está limitada a 8
NNumberUn número Se tiene que declarar la longitud y la precisión (esto es, el número de dígitos detrás del punto decimal)
CStringUna cadenaSe debe declarar la longitud. Cuando se obtienen los datos, la cadena se rellena con espacios por la derecha si es necesario para obtener la misma longitud que la declarada.
LBooleanT o Y indica TRUE, F o N indica FALSESe almacena y se devuelve como un entero (1 o 0)

Aviso

No hay soporte para índices o campos Memo. Tampoco hay soporte para bloqueo: si dos procesos concurrentes en el servidor modifican el mismo archivo dBase, probablemente se destruirán los datos.

Se recomienda no utilizar archivos dBase como bases de datos, sino elegir cualquier servidor SQL; MySQL o Postgres son opciones habituales con PHP. El soporte para dBase se proporciona para permitir importar y exportar datos a y desde la base de datos web, ya que este formato de ficheros es aceptado habitualmente por las hojas de cálculo y los organizadores de Windows.

Instalación

Para habilitar la librería dbase incluida y para poder utilizar estas funciones, se debe compilar PHP con la opción --enable-dbase.

Configuración en tiempo de ejecución

Esta extensión no tiene directivas de configuración en php.ini.

Tipos de recursos

Esta extensión no tiene ningún tipo de recurso definido.

Ejemplos

Muchos de los ejemplos de esta referencia requieren una base de datos de tipo dBase. En los ejemplos se empleará el archivo /tmp/test.dbf que se crea en el ejemplo de la función dbase_create().

Constantes predefinidas

Esta extensión no tiene ninguna constante definida.

Tabla de contenidos
dbase_add_record -- Añade un registro a la base de datos
dbase_close -- Cierra una base de datos
dbase_create -- crea una base de datos dBase
dbase_delete_record -- Borra un registro de la base de datos
dbase_get_header_info -- Obtiene la información de la cabecera de la base de datos
dbase_get_record_with_names --  Obtiene un registro de la base de datos en forma de matriz asociativa
dbase_get_record --  Obtiene un registro de la base de datos en forma de matriz
dbase_numfields -- Obtiene el número de campos de la base de datos
dbase_numrecords -- Obtiene el número de registros de la base de datos
dbase_open -- Abre una base de datos
dbase_pack -- Comprime una base de datos
dbase_replace_record -- Modifica un registro de la base de datos


dbase_add_record> <dba_sync
[edit] Last updated: Mon, 01 Nov 2010
 
add a note add a note User Contributed Notes Funciones para dBase
bi.idan [at] gmail.com 12-Feb-2009 07:16
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
kuthullu at webmails dot com 09-Apr-2008 07:40
For all those of you who wants to DBF->SQL, here's half of a hour worth of work.
It's pretty simple, outputs a CREATE TABLE and lots of INSERTs.
The output is HTML, as I use w$ndows here at work and prefer to just see results in opera.
You SHOULD verify the created data, add some CREATE KEYs, NOT NULLs or whatever you like.

<?php
$file_name
= "mfiscal/dados22/APISS110.D00";
$table = "dbf_apiss";

$dbf = @dbase_open($file_name, 0) or die("Error opening $file_name");
$fields = dbase_get_header_info($dbf);

/* Just show a table with header information */
echo "<table cellspacing=0><tr><th>Name</th><th>Type</th>
<th>Length</th><th>Precision</th><th>Format</th><th>Offset</th></tr>"
;
foreach(
$fields as $field)
{
    echo
"<tr>
        <td>{$field['name']}</td>
        <td>{$field['type']}</td>
        <td>{$field['length']}</td>
        <td>{$field['precision']}</td>
        <td>{$field['format']}</td>
        <td>{$field['offset']}</td>
        </tr>"
;
}
echo
"</table><br><br>";

/* Here begins the SQL code part */
echo "CREATE TABLE $table (<BR>";
$x = 0;
$fields_num = 0;
foreach(
$fields as $field)
{
    if(
$x++ != 0)
        echo
",<BR>";
    switch(
$field['type'])
    {
        case
'character' : $type = 'CHAR'; $length = $field['length'] > 1 ? "({$field['length']})" : ""; break;
        case
'number' : $type = 'NUMERIC'; $length = "({$field['length']}" . ($field['precision'] > 0 ? ", {$field['precision']})": ")");
        break;
//        case '' : $type = ''; break;
   
}
   
$fields_num++;
    echo
"&nbsp;&nbsp;&nbsp;{$field['name']} $type$length";
}
echo
");<BR><BR>BEGIN;<BR>";
$records = @dbase_numrecords($dbf) or die("Error reading DBF's number of fields");
for(
$x = 1; $x <= $records; $x++)
{
   
$record = dbase_get_record($dbf, $x);
    echo
"INSERT INTO $table VALUES (";
   
$f = 0;
    foreach(
$record as $field)
    {
        if(
$f != 0) echo ", ";
        if(
strcmp(str_repeat(' ', $fields[$f]['length']), $field) != 0)
        {
            if(
$fields[$f]['type'] == 'character') echo "'";
            echo
$field;
            if(
$fields[$f]['type'] == 'character') echo "'";
        }
        else
            echo
"NULL";
        if(++
$f >= $fields_num) break;
    }
    echo
");<BR>";
}
echo
"COMMIT;";
?>
bi.idan AT gmail.com 16-Apr-2007 04: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 10: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);
?>

 
show source | credits | sitemap | contact | advertising | mirror sites