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).
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.
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:
| 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, pasarnulldefinirá el flag respectivo, y al recuperarlo el valor del campo seránull.
Nota:
No hay soporte para índices o campos memo.
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