dbase_get_header_info

(PHP 5)

dbase_get_header_infoRécupère des informations d'en-tête d'une base de données dBase

Description

array dbase_get_header_info ( int $dbase_identifier )

dbase_get_header_info() retourne des informations sur la structure des colonnes de la base de données référencée par dbase_identifier.

Liste de paramètres

dbase_identifier

L'identifiant du lien à la base de données, retourné par dbase_open() ou dbase_create().

Valeurs de retour

Un tableau indexé avec une entrée pour chaque colonne de la base de données. L'index du tableau commence à 0.

Chaque élément du tableau contient un tableau associatif contenant les informations sur les colonnes, comme décrit ici :

name
Le nom de la colonne
type
Le nom lisible du type de la colonne (i.e. date, boolean, etc.)
length
Le nombre d'octets que cette colonne peut contenir
precision
Le nombre de décimales pour la colonne
format
Un format printf() suggéré pour la colonne
offset
La position de la colonne depuis la début de la ligne

Si les informations d'en-têtes de la base de données ne peuvent pas être lues, FALSE est retourné.

Exemples

Exemple #1 Affiche les informations d'en-têtes pour un fichier de base de données dBase

<?php
// Chemin vers le fichier dBase
$db_path "/tmp/test.dbf";

// Ouvre le fichier dBase
$dbh dbase_open($db_path0)
or die(
"Erreur ! Impossible d'ouvrir le fichier dBase '$db_path'.");

// Récupération des informations des colonnes
$column_info dbase_get_header_info($dbh);

// Affichage des informations
print_r($column_info);
?>

add a note add a note

User Contributed Notes 3 notes

up
0
Marcos Peli
5 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
5 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
7 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