©
This document uses PHP Chinese website manual Release
(PHP 5, PHP 7)
dbase_get_header_info — Gets the header info of a database
$dbase_identifier
)Returns information on the column structure of the given database link identifier.
dbase_identifier
The database link identifier, returned by dbase_open() or dbase_create() .
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:
If the database header information cannot be read, FALSE
is returned.
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 );
?>
[#1] Marcos Peli [2009-04-16 18:13:32]
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);
}
?>
[#2] Eliovir [2008-07-24 05:04:15]
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
[#3] christoph dot eck at bluewin dot ch [2006-09-12 03:58:26]
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)