some of you contacted me about memo fields and my script, so i'll just post my answers on the common question here.
(note: this is not an adv for any program, only what i used for myself, and it's free)
so, there are 2 options if you want to create/read memo fields:
1. use a library for java/c++/c# to build a bridge between php and dbf file. i've used dbf2java. althougth it's not near complete as my other option, it's a good start. (http://code.google.com/p/dbf2java-library/)
2. use an external program with pipes to grab the output. i used cdbflite, (http://www.whitetown.com/cdbflite/). it's free, and pretty much gives you everything you need to handle those dbf files. i'm not sure about big databases and it seems you need to register/buy it, but it's again, a start.
hope it helps some of you who needs to handle those database files,
Good luck,
idan
XXV. dBase, Funções do
Introdução
Estas funções permitem acessar registros guardados em banco de dados no formato Dbase(dbf).
Não há suporte para índices ou campos memo. Não há suporte para travas também. Dois processos do servidor web comcorrentes modificando o mesmo banco de dados normalmente irá arruinar o banco de dados.
Arquivos dBase são arquivos simples em seqüencia de registros de tamanhos fixos. Os registros são incluidos no final do arquivo e registros excluidos são mantidos até que você chame dbase_pack().
Nós recomendamos que você não use seus arquivos dbase como seu banco de dados de produção. Escolha ao invés um servidor SQL real, MySQL ou Postgres são escolhas comuns com o php. O suporte ao Dbase esta aqui para permitir a você importar e exportar dados para e apartir do seu banco de dados web, porque o formato é normalmente entendido por planilhas e organizadores do Windows.
Instalação
Para ativar a biblioteca dbase e para usar estas funções, você deve compilar o PHP com a opção --enable-dbase.
Configurações em execução
Esta extensão não define nenhum parâmetro de configuração no php.ini.
Tipos Resource
Esta extensão não possui nenhum tipo resource.
Constantes pré-definidas
Esta extensão não possui nenhuma constante.
- Índice
- dbase_add_record -- Adiciona um registro ao banco de dados
- dbase_close -- Fecha um banco de dados
- dbase_create -- Cria um banco de dados
- dbase_delete_record -- Exclui um registro do banco de dados
- dbase_get_header_info -- Obtém as informações do cabeçalho do banco de dados
- dbase_get_record_with_names -- Obtém um registro do banco de dados como uma matriz associativa.
- dbase_get_record -- Obtém um registro do banco de dados como uma matriz indexada
- dbase_numfields -- Obtém o número de campos em um banco de dados
- dbase_numrecords -- Obtém o número de registros no banco de dados
- dbase_open -- Abre um banco de dados
- dbase_pack -- Apaga permanentemente os registros do banco de dados dBase
- dbase_replace_record -- Substitui um registro no banco de dados
For all those of you who wants to DBF->SQL, here's half of a hour worth of work.
It's pretty simple, outputs a CREATE TABLE and lots of INSERTs.
The output is HTML, as I use w$ndows here at work and prefer to just see results in opera.
You SHOULD verify the created data, add some CREATE KEYs, NOT NULLs or whatever you like.
<?php
$file_name = "mfiscal/dados22/APISS110.D00";
$table = "dbf_apiss";
$dbf = @dbase_open($file_name, 0) or die("Error opening $file_name");
$fields = dbase_get_header_info($dbf);
/* Just show a table with header information */
echo "<table cellspacing=0><tr><th>Name</th><th>Type</th>
<th>Length</th><th>Precision</th><th>Format</th><th>Offset</th></tr>";
foreach($fields as $field)
{
echo "<tr>
<td>{$field['name']}</td>
<td>{$field['type']}</td>
<td>{$field['length']}</td>
<td>{$field['precision']}</td>
<td>{$field['format']}</td>
<td>{$field['offset']}</td>
</tr>";
}
echo "</table><br><br>";
/* Here begins the SQL code part */
echo "CREATE TABLE $table (<BR>";
$x = 0;
$fields_num = 0;
foreach($fields as $field)
{
if($x++ != 0)
echo ",<BR>";
switch($field['type'])
{
case 'character' : $type = 'CHAR'; $length = $field['length'] > 1 ? "({$field['length']})" : ""; break;
case 'number' : $type = 'NUMERIC'; $length = "({$field['length']}" . ($field['precision'] > 0 ? ", {$field['precision']})": ")");
break;
// case '' : $type = ''; break;
}
$fields_num++;
echo " {$field['name']} $type$length";
}
echo ");<BR><BR>BEGIN;<BR>";
$records = @dbase_numrecords($dbf) or die("Error reading DBF's number of fields");
for($x = 1; $x <= $records; $x++)
{
$record = dbase_get_record($dbf, $x);
echo "INSERT INTO $table VALUES (";
$f = 0;
foreach($record as $field)
{
if($f != 0) echo ", ";
if(strcmp(str_repeat(' ', $fields[$f]['length']), $field) != 0)
{
if($fields[$f]['type'] == 'character') echo "'";
echo $field;
if($fields[$f]['type'] == 'character') echo "'";
}
else
echo "NULL";
if(++$f >= $fields_num) break;
}
echo ");<BR>";
}
echo "COMMIT;";
?>
I know lots of you dosent really use dbase, but i've builded a class to help the one how dose.
(sorry for bad english)
- dbase.php
<?php
set_time_limit (0);
// site_path defined by parent
require_once (SITE_PATH. '/server/php/libs/dbase/handler.php');
/* DBase (dbf)
* manage dbf files, exports and search functionality
* with buildin optimizers for fast performance
*/
class DBase
{
private $handler = false;
private $searchopt = array (); // Search optimizer
private function unload ()
{
if ($this-> handler !== false)
unset ($this-> handler);
}
public function __construct ($file = false)
{
if ($file !== false)
$this-> load ($file);
}
public function __destruct ()
{
$this-> unload ();
}
public function load ($file)
{
$resource = dbase_open ($file, 0);
$this-> handler = new DBase_Handler ($resource);
return $this-> handler;
}
/* Search
* search for string inside header
* returns record number
* false returned if not found or error occurred
* limit_results gets int or false, limit_results equels one will limit the
* search results for one result only, false for no limit
*/
public function search ($headerText, $string, $limit_results = false, $handler = false)
{
if ($handler === false)
$handler = $this-> handler;
if ($this-> searchopt [$headerText][$string])
return $this-> searchopt [$headerText][$string];
else
{
$size = $handler-> getSize ();
if ( ( $headerNumber = $handler-> getHeaderNumber ($headerText) ) !== false)
{
$results = array ();
for ($i = 1; $i < $size; $i++)
{
$record = $handler-> getRecord ($i, false); // Disabled optimizer to prevent memory overflow
if (trim ($record [$headerNumber]) == $string)
{
$results[] = $i;
if ( ($limit_results !== false) && (sizeof ($results) == $limit_results) )
break;
}
}
if (sizeof ($results) > 0)
{
$this-> searchopt [$headerText][$string] = $results;
return $this-> search ($headerText, $string, $handler);
}
return false;
} else
return false;
}
}
}
?>
- dbase_handler.php
<?php
/* DBase Handler (dbf)
* handles dbase resource
*/
class DBase_Handler
{
private $resource;
private $size; // Records Count
private $header = array ();
private $dataopt = array (); // Data optimizer
private function setHeader ()
{
$this-> header = dbase_get_header_info ($this-> resource);
}
public function __construct ($resource)
{
$this-> resource = $resource;
$this-> setHeader ();
$this-> size = dbase_numrecords ($this-> resource);
}
public function __destruct ()
{
dbase_close ($this-> resource);
}
public function getRecord ($record_number, $dataopt = true)
{
if ($record_number > $this-> size)
return false;
else
{
if ($this-> dataopt [$record_number])
return $this-> dataopt [$record_number];
else
{
$record = dbase_get_record ($this-> resource, $record_number);
if ($dataopt === true) // Data saving optimizer
{
$this-> dataopt [$record_number] = $record;
return $this-> getRecord ($record_number);
} else
return $record;
}
}
}
public function getHeaderNumber ($headerText)
{
foreach ($this-> header as $index => $header)
{
if ($header ['name'] == $headerText)
{
return $index;
break;
}
}
return false;
}
public function getHeader ($headerNumber)
{
if ($headerNumber <= sizeof ($this-> header))
return $this-> header [$headerNumber];
else
return false;
}
public function getSize ()
{
return $this-> size;
}
}
?>
If you are using PHP < 5, you can use this function to retrieve dbf header
<?
function get_dbf_header($dbfname) {
$fdbf = fopen($dbfname,'r');
$dbfhdrarr = array();
$buff32 = array();
$i = 1;
$goon = true;
while ($goon) {
if (!feof($fdbf)) {
$buff32 = fread($fdbf,32);
if ($i > 1) {
if (substr($buff32,0,1) == chr(13)) {
$goon = false;
} else {
$pos = strpos(substr($buff32,0,10),chr(0));
$pos = ($pos == 0?10:$pos);
$fieldname = substr($buff32,0,$pos);
$fieldtype = substr($buff32,11,1);
$fieldlen = ord(substr($buff32,16,1));
$fielddec = ord(substr($buff32,17,1));
array_push($dbfhdrarr, array($fieldname,$fieldtype,$fieldlen,$fielddec));
}
}
$i++;
} else {
$goon = false;
}
}
fclose($fdbf);
return($dbfhdrarr);
}
$arr = get_dbf_header('/data/file.dbf');
print_r($arr);
?>
