dbase_get_header_info
(PHP 5, PHP 7)
dbase_get_header_info — Получает информацию о свойствах полей базы данных
Описание
$dbase_identifier
)Возвращает информацию о структуре полей (столбцов) базы данных, согласно заданному идентификатору.
Список параметров
-
dbase_identifier
-
Идентификатор базы данных, полученный с помощью dbase_open() или dbase_create().
Возвращаемые значения
Индексированный массив значений для каждой колонки (поля). Индекс массива начинается с 0.
Каждый элемент массива содержит ассоциативный массив информации о столбцах БД следующего вида:
- name
- Наименование поля
- type
- Тип поля dBase в удобном для восприятия виде (date, boolean, и т.д.)
- length
- Максимально хранимое число байт данного поля (включая "precision" - прим. пер.)
- precision
- Количество цифр после запятой
- format
- Предложенный в printf() формат спецификации для данного типа
- offset
- Байт смещения, указывающий размещение поля от начала записи (строки).
Если информация в заголовке базы данных не может быть прочитана, возвращает FALSE
.
Примеры
Пример #1 Получение свойств полей файла базы данных dBase
<?php
// Путь к файлу БД
$db_path = "/tmp/test.dbf";
// Открываем файл БД
$dbh = dbase_open($db_path, 0)
or die("Ошибка! Не получается открыть файл '$db_path'.");
// Получаем информацию о столбцах
$column_info = dbase_get_header_info($dbh);
// Отображение информации
print_r($column_info);
?>
Коментарии
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)
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
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);
}
?>