(PHP 5)
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.
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);
?>
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);
}
?>
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
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)