Замечание:
Модуль переместили в репозиторий » PECL и он больше не поставляется с PHP 5.3.0.
Эти функции позволяют получить доступ к записям, хранящимся в DBase-формате (DBF) баз данных.
Мы не рекомендуем использовать файлы DBase файлы для использования в промышленной эксплуатации. Лучше выберите » SQLite или какую-либо настоящую базу данных; » MySQL или » Postgres являются наиболее частым выбором при работе с PHP. Поддержка dBase больше нужна для импорта и экспорта данных вашей базы данных, поскольку формат её файлов понятен большинству пакетов электронных таблиц (например, Excel).
С версии dbase 7.0.0, база данных автоматически блокируется с помощью flock() . Ранее поддержки блокировок не было, так что два конкурирующих процесса веб-сервера, изменяющие один и тот же файл dBase могли с лёгкостью испортить базу. Такое может произойти даже и в dbase 7.0.0+ на системах, которые реализуют блокировку на уровне процесса с многопоточными SAPI.
База данных dBase является просто последовательностью файлов с фиксированной длиной записи. Записи добавляются в конец файла и удалённые записи будут (физически) хранится до вызова dbase_pack() .
Поддерживаются только dbf-файлы уровня 3 (dBASE III+) - 5 (dBASE V). Доступные типы полей dBase:
| Поле | dBase тип | Формат | Дополнительная информация |
|---|---|---|---|
M |
Memo | n/a | Тип не поддерживается PHP, такое поле будет игнорироваться |
D |
Date | YYYYMMDD |
Длина поля ограничена 8 |
T |
DateTime | YYYYMMDDhhmmss.uuu |
(FoxPro) Проверка на корректность не производится. Доступно с dbase 7.0.0. |
N |
Number | Число | Вы должны указать длину и точность (количество цифр после десятичной точки). |
F |
Float | Число с плавающей точкой | То же, что и N. |
C |
String | A string | Вы должны указать длину. При получении данных, строка будет дополнена справа пробелами до заявленной длины. Более длинные строки будут обрезаны без предупреждения. |
L |
Boolean |
T или Y для true ,
F или N для false ,
? - не инициализировано.
|
С dbase 7.0.0, возвращается как bool (true или false ),
или null для не инициализированных полей.
Ранее возвращалось как int (1 или 0).
|
Замечание:
Начиная с dbase 7.0.0 поддерживаются обнуляемые поля для баз данных
DBASE_TYPE_FOXPRO. Если поле обнуляемое. При передачеnullбудет установлен соответствующий флаг и, при дальнейшем извлечении поля, будет возвращено значениеnull.
Замечание:
Поддержки для индексов и memo-полей нет.
Unfortunately the dbase functions are not compiled into my commercial server's php and I needed to read some geo data in shape files, which include data in dbfs.
So maybe this will help some others:
<?php
function echo_dbf($dbfname) {
$fdbf = fopen($dbfname,'r');
$fields = array();
$buf = fread($fdbf,32);
$header=unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8));
echo 'Header: '.json_encode($header).'<br/>';
$goon = true;
$unpackString='';
while ($goon && !feof($fdbf)) { // read fields:
$buf = fread($fdbf,32);
if (substr($buf,0,1)==chr(13)) {$goon=false;} // end of field list
else {
$field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec", substr($buf,0,18));
echo 'Field: '.json_encode($field).'<br/>';
$unpackString.="A$field[fieldlen]$field[fieldname]/";
array_push($fields, $field);}}
fseek($fdbf, $header['FirstRecord']+1); // move back to the start of the first record (after the field definitions)
for ($i=1; $i<=$header['RecordCount']; $i++) {
$buf = fread($fdbf,$header['RecordLength']);
$record=unpack($unpackString,$buf);
echo 'record: '.json_encode($record).'<br/>';
echo $i.$buf.'<br/>';} //raw record
fclose($fdbf); }
?>
This function simply dumps an entire file using echo and json_encode, so you can tweak it to your own needs... (eg random access would just be a matter of changing the seek to : fseek($fdbf, $header['FirstRecord']+1 +($header['RecordLength']* $desiredrecord0based); removing the for loop and returning $record
This function doesn't do any type conversion, but it does extract the type if you need to play with dates, or tidy up the numbers etc.
So quick and dirty but maybe of use to somebody and illustrates the power of unpack.
Erich