dBase

Introdução

Nota:

Esta extensão foi movida para o repositório » PECL e não é mais distribuída com o PHP desde a versão 5.3.0.

Essas funções permitem acessar registros armazenados em bancos de dados no formato dBase (dbf).

Aviso

Não é recomendado usar arquivos dBase como banco de dados de produção. Use o » SQLite ou escolha qualquer servidor SQL real; » MySQL ou » Postgres são escolhas comuns com o PHP. O suporte ao dBase está aqui para permitir importação e exportação de dados de e para seu banco de dados da web, porque o formato de arquivo é comumente entendido por planilhas e organizadores do Windows.

Cuidado

A partir do dBase 7.0.0, os bancos de dados são bloqueados automaticamente via flock(). Não havia suporte para bloqueio anteriormente, portanto, dois processos simultâneos de servidor web modificando o mesmo arquivo dBase provavelmente teriam arruinado um banco de dados. Isso pode acontecer mesmo com o dBase 7.0.0+ em sistemas que implementam os bloqueios no nível do processo com SAPIs multithread.

Os arquivos dBase são arquivos sequenciais simples de registros de comprimento fixo. Os registros são anexados ao final do arquivo e os registros excluídos são mantidos até a chamada a dbase_pack().

Somente arquivos dbf de nível 3 (dBASE III+) a 5 (dBASE V) são suportados. Os tipos de campos dBase disponíveis são:

Tipos de campos disponíveis
Campo Tipo dBase Formato Informações adicionais
M Memo n/a Este tipo não é suportado pelo PHP, tal campo será ignorado
D Date YYYYMMDD O comprimento do campo é limitado a 8
T DateTime YYYYMMDDhhmmss.uuu (FoxPro) Nenhuma verificação de validade é feita. Disponível a partir do dBase 7.0.0.
N Number Um número Deve-se declarar um comprimento e uma precisão (o número de dígitos após o separador de decimais).
F Float Um número float Igual a N.
C String Uma string Deve-se declarar um comprimento. Ao recuperar dados, a string será preenchida à direita com espaços para caber no comprimento declarado. Strings muito longas serão truncadas silenciosamente ao armazenar dados.
L Boolean T ou Y para true, F ou N para false, ? para não inicializado. A partir do dBase 7.0.0, retornado como um bool (true ou false), ou null para campos não inicializados. Anteriormente, retornado como int (1 ou 0).

Nota:

A partir do dBase 7.0.0, campos anuláveis são suportados para bancos de dados DBASE_TYPE_FOXPRO. Se um campo for anulável, passar null definirá o respectivo sinalizador e, na recuperação posterior, o valor do campo será null.

Nota:

Não há suporte para índices ou campos memo.

adicionar nota

Notas de Usuários 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