dBase

Introducción

Nota:

Esta extensión ha sido movida al módulo » PECL y no será integrada en PHP a partir de PHP 5.3.0.

Estas funciones permiten acceder a los registros de las bases de datos en formato dBase (dbf).

Advertencia

Se recomienda no utilizar los ficheros dBase como base de datos de producción. Utilice » SQLite o mejor opte por un verdadero servidor SQL; » MySQL o » PostgreSQL son opciones comunes en PHP. El soporte dBase está presente en PHP únicamente para permitir la importación y exportación de datos desde y hacia su base de datos, ya que este formato de fichero es habitualmente comprendido por los programas de hoja de cálculo de Windows.

Precaución

A partir de dbase 7.0.0 las bases de datos son automáticamente bloqueadas via flock(). No había soporte para el bloqueo previamente, por lo que dos procesos de servidor web concurrentes modificando el mismo fichero dBase probablemente habrían arruinado su base de datos. Esto puede ocurrir incluso con dbase 7.0.0+ en sistemas que implementan el bloqueo a nivel de proceso con las SAPIs multithreaded.

Los ficheros dBase son simples ficheros secuenciales, con un número de registros fijo. Los registros son añadidos al final del fichero y los registros borrados son conservados hasta que se llame a la función dbase_pack().

Solo se soportan los ficheros dbf niveles 3 (dBASE III+) - 5 (dBASE V). Los tipos de campos dBase disponibles son:

Tipo de campos disponible
Campo Tipo dBase Formato Información complementaria
M Memo n/a Este tipo no es soportado por PHP, y será ignorado
D Date YYYYMMDD El tamaño del campo está limitado a 8
T DateTime YYYYMMDDhhmmss.uuu (FoxPro) No se realizan verificaciones de validez. Disponible a partir de dbase 7.0.0.
N Number Un número Se debe declarar un tamaño y una precisión (el número de dígitos después del punto decimal).
F Float Un número flotante Idéntico a N.
C string Una cadena de caracteres Se debe declarar un tamaño. Al recuperar los datos, la cadena será completada con espacios para alcanzar el tamaño declarado. Las cadenas demasiado largas serán truncadas silenciosamente al guardar.
L bool T o Y para true, F o N para false, ? para no inicializada. A partir de dbase 7.0.0, devuelto como bool (true o false), o null para los campos no inicializados Anteriormente, devuelto como int (1 o 0).

Nota:

A partir de dbase 7.0.0 los campos nullable son soportados para las bases de datos DBASE_TYPE_FOXPRO. Si un campo es nullable, pasar null definirá el flag respectivo, y al recuperarlo el valor del campo será null.

Nota:

No hay soporte para índices o campos memo.

add a note

User Contributed Notes 1 note

up
23
Anonymous
16 years ago
Unfortunately the dbase functions are not compiled into my commercial server's php and I needed to read some geo data in shape files, which include data in dbfs.

So maybe this will help some others:

<?php
function echo_dbf($dbfname) {
    $fdbf = fopen($dbfname,'r'); 
    $fields = array();
    $buf = fread($fdbf,32);
    $header=unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8));
    echo 'Header: '.json_encode($header).'<br/>';
    $goon = true; 
    $unpackString='';
    while ($goon && !feof($fdbf)) { // read fields:
        $buf = fread($fdbf,32);
        if (substr($buf,0,1)==chr(13)) {$goon=false;} // end of field list
        else {
            $field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec", substr($buf,0,18));
            echo 'Field: '.json_encode($field).'<br/>';
            $unpackString.="A$field[fieldlen]$field[fieldname]/";
            array_push($fields, $field);}}
    fseek($fdbf, $header['FirstRecord']+1); // move back to the start of the first record (after the field definitions)
    for ($i=1; $i<=$header['RecordCount']; $i++) {
        $buf = fread($fdbf,$header['RecordLength']);
        $record=unpack($unpackString,$buf);
        echo 'record: '.json_encode($record).'<br/>';
        echo $i.$buf.'<br/>';} //raw record
    fclose($fdbf); }
?>

This function simply dumps an entire file using echo and json_encode, so you can tweak it to your own needs... (eg random access would just be a matter of changing the seek to : fseek($fdbf, $header['FirstRecord']+1 +($header['RecordLength']* $desiredrecord0based); removing the for loop and returning $record

This function doesn't do any type conversion, but it does extract the type if you need to play with dates, or tidy up the numbers etc.

So quick and dirty but maybe of use to somebody and illustrates the power of unpack.

Erich
To Top