PHP Velho Oeste 2024

dbase_get_header_info

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_get_header_infoObtém as informações do cabeçalho do banco de dados

Descrição

dbase_get_header_info(resource $database): array

Retorna informações sobre a estrutura de colunas do recurso de banco de dados indicado.

Parâmetros

database

O recurso do banco de dados, retornado por dbase_open() ou dbase_create().

Valor Retornado

Um array indexado com uma entrada para cada coluna no banco de dados. O índice começa em 0.

Cada elemento do array contém um array associativo com informações da coluna, como descrito aqui:

name
O nome da coluna
type
O nome legível do tipo de coluna dbase (ex.: date, boolean, etc.) Os tipos de campos suportados estão listados na seção de introdução.
length
O número de bytes que esta coluna pode guardar
precision
O número de dígitos da precisão decimal da coluna
format
Um especificador de formato printf() sugerido para a coluna
offset
O índice em byte da coluna a partir do início da linha

Se as informações do cabeçalho do banco de dados não puderem ser lidas, é retornado false.

Registro de Alterações

Versão Descrição
dbase 7.0.0 database agora é do tipo resource ao invés de int.

Exemplos

Exemplo #1 Mostrando informações do banco de dados de um arquivo dBase

<?php
// caminho para o arquivo dbase
$db_path = "/tmp/test.dbf";

// Abre o arquivo dbase
$dbh = dbase_open($db_path, 0)
or die(
"Erro! Não foi possível abrir o arquivo de banco de dados dbase '$db_path'.");

// Obtém informação de coluna
$column_info = dbase_get_header_info($dbh);

// Mostra a informação
print_r($column_info);
?>

add a note add a note

User Contributed Notes 3 notes

up
1
Marcos Peli
15 years ago
Um dos principais problemas era a flata desta função nas versões PHP<5.0

O Script abaixo "contorna" o problema , e gera uma "pseudo-cabeçario" baseado no próprio conteúdo do arquivo DBF

Óbvio informar que se o arquivo DBF a ser submetido ao script estiver vazio , ou com poucos elementos ou linhas , ou ainda , se estes não representarem o conteudo com fidegnidade , ou seja , com muitos campos NULLs , o script podera não funcionar a contento com relação ao resultado desejado.

Utilizei por muito tempo o script abaixo como alternativa para a ausência da função dbase-get-header-info em versões PHP < 5.0 na confecção de cabeçarios e posterior transformação de arquivo DBF p/ MYSQL

<?php
// parametros iniciais

// Path - caminho para arquivo dbf a ser aberto
$diretorio_open = 'dbf/';
// Arquivo a ser aberto e explorado
$file = 'arquivo.dbf';

$con = dbase_open($diretorio_open.$file,0) or die('Erro na Conexão com o arquivo DBF');

// PHP>5.0 - usa função dbase_get_header_info para ler cabeçario
// PHP<5.0 - Simula a leitura através do conteudo do próprio arquivo
if(function_exists(dbase_get_header_info))   
{
$estrutura_arquivo = dbase_get_header_info($con);}               
else   
{
$estrutura_arquivo = alternative_dbase_get_header_info($con);}

// imprime o header do arquivo
print_r($estrutura_arquivo);

// ---------------------------------------------

// função alternativa
function alternative_dbase_get_header_info($con)
{

   
//Pega o num. de linhas
   
$rows = dbase_numrecords($con);
   
   
//faz o loop percorrendo todas as linhas e carrega a variável $registro com os dados
   
for($i=1;$i<=$rows;$i++)
    {
       
//Pega a linha do arquivo DBF e coloca como array
       
$registro = dbase_get_record_with_names($con,$i);
           
       
$y=0;
               
       
// Mostra as Chaves e os valores do array
       
foreach ($registro as $chave => $valor)
        {
           
// pega as chaves (field - Coluna) só se for a primeira vez
           
if($i==1)
            {
$estrutura_arquivo[$y]['name'] = $chave;}
   
           
// finalmente pega o tipo , o comprimento e a precisão no mesmo padrão que dbase_get_header_info
           
if( ( ( ( @checkdate(substr($valor,4,2),substr($valor,-2),substr($valor,0,4)) ) && (strlen(trim($valor))==8) ) || (strlen(trim($valor))==0) ) && $chave != 'deleted') // testa se é data checkdate(MM,DD,AA)
           
{
                if(!isset(
$estrutura_arquivo[$y]['type']))
                {
                   
$estrutura_arquivo[$y]['type'] = 'date';
                   
$estrutura_arquivo[$y]['length'] = 8;
                   
$estrutura_arquivo[$y]['precision'] = '0';
                }
               
$e_data = TRUE;
            }
            if(
is_numeric(trim($valor)) && strstr($valor, '.'))
            {
               
$estrutura_arquivo[$y]['type'] = 'number';
                if(
$estrutura_arquivo[$y]['length'] < strlen(trim($valor)))
                {
$estrutura_arquivo[$y]['length'] = strlen(trim($valor));}
                if(
$estrutura_arquivo[$y]['precision'] < strlen(strstr(trim($valor),'.'))-1)
                {
$estrutura_arquivo [$y]['precision'] = strlen(strstr(trim($valor),'.'))-1;}
            }
            if(
is_numeric(trim($valor)) && !strstr($valor, '.') && !$e_data && $estrutura_arquivo[$y]['precision'] < 1 && $estrutura_arquivo[$y]['type'] != 'character')
            {
               
$estrutura_arquivo[$y]['type'] = 'number';
                if(
$estrutura_arquivo[$y]['length'] < strlen(trim($valor)))
                {
$estrutura_arquivo[$y]['length'] = strlen(trim($valor));}
               
$estrutura_arquivo [$y]['precision'] = '0';
            }
            if(
strlen($valor)>10 || (!is_numeric(trim($valor)) && strlen(trim($valor))!=0) )
            {
               
$estrutura_arquivo[$y]['type'] = 'character';
                if(
$estrutura_arquivo[$y]['length'] < strlen($valor))
                {
$estrutura_arquivo[$y]['length'] = strlen($valor);}
               
$estrutura_arquivo [$y]['precision'] = '0';
            }
               
           
$e_data = FALSE;
           
$y+=1;
        }
           
    }
       
    return(
estrutura_arquivo);
}
?>
up
0
Eliovir
15 years ago
As of PHP 5.2.6, it seems that the type F (Float) is supported ( ext/dbase/dbase.c +713 ), with a length of 20 characters.

http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm precises : Number stored as a string, right justified, and padded with blanks to the width of the field
up
0
christoph dot eck at bluewin dot ch
17 years ago
Field Types
*********
Not all field types of DBase are supported. Look below for the internal field type definitions of PHP 5.1.x.

The storage symbols of DBase are C (stands for character), D (date) , I (integer), N (number), L (boolean), M (memo). All other symbols like B, @, l, +, F, O and G are defined as unknown.

Sources
*********
http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm
PHP-Source-5.1.6 ext/dbase/dbase.c (line 786)
To Top