PHP Velho Oeste 2024

dbase_get_header_info

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

dbase_get_header_infoGets the header info of a database

Description

dbase_get_header_info(resource $database): array

Returns information on the column structure of the given database resource.

Parameters

database

The database resource, returned by dbase_open() or dbase_create().

Return Values

An indexed array with an entry for each column in the database. The array index starts at 0.

Each array element contains an associative array of column information, as described here:

name
The name of the column
type
The human-readable name for the dbase type of the column (i.e. date, boolean, etc.) The supported field types are listed in the introduction section.
length
The number of bytes this column can hold
precision
The number of digits of decimal precision for the column
format
A suggested printf() format specifier for the column
offset
The byte offset of the column from the start of the row

If the database header information cannot be read, false is returned.

Changelog

Version Description
dbase 7.0.0 database is now a resource instead of an int.

Examples

Example #1 Showing header information for a dBase database file

<?php
// Path to dbase file
$db_path = "/tmp/test.dbf";

// Open dbase file
$dbh = dbase_open($db_path, 0)
or die(
"Error! Could not open dbase database file '$db_path'.");

// Get column information
$column_info = dbase_get_header_info($dbh);

// Display information
print_r($column_info);
?>

add a note add a note

User Contributed Notes 3 notes

up
1
Marcos Peli
14 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