dBase

EinfĂŒhrung

Hinweis:

Diese Erweiterung wurde ins » PECL-Repositorium verschoben und ist nicht mehr Teil von PHP ab PHP 5.3.0.

Diese Funktionen erlauben Ihnen den Zugriff auf DatensÀtze, die in Datenbanken im dBase-Format (dbf) vorliegen.

Warnung

Wir empfehlen, keine dBase-Dateien als Produktions-Datenbank zu verwenden. WĂ€hlen Sie dafĂŒr stattdessen » SQLite oder einen echten SQL-Server; » MySQL oder » Postgres sind bei PHP eine gute Wahl. Die dBase-UnterstĂŒtzung durch PHP dient hauptsĂ€chlich dem Im- und Export von Daten zu oder aus ihrer Web-Datenbank, weil das DBF-Datei-Format allgemein von Windows-Tabellenkalulationen und -Zeitplanern verstanden wird.

Achtung

Von dbase 7.0.0 an werden Datenbanken automatisch per flock() gesperrt. Zuvor wurden Sperren nicht unterstĂŒtzt, so dass zwei Webserver-Prozesse, die gleichzeitig dieselbe dBase-Datei Ă€nderten, mit hoher Wahrscheinlichkeit die Datenbank ruinierten. Dies kann auf Systemen, die die Sperren auf Prozessebene implementieren unter multithreaded SAPIS, auch noch mit dbase 7.0.0+ passieren.

dBase-Dateien sind einfache sequentielle Dateien mit fester DatensatzlÀnge. Neue DatensÀtze werden am Dateiende angehÀngt und gelöschte DatensÀtze werden beibehalten, bis Sie dbase_pack() aufrufen.

Nur dbf Datei-Level 3 (dBASE III+) - 5 (dBASE V) werden unterstĂŒtzt. Folgende dBase-Feldtypen stehen stehen zur VerfĂŒgung:

VerfĂŒgbare Feldtypen
Feld dBase-Typ Format ZusÀtzliche Informationen
M Memo n/a Dieser Typ wird von PHP nicht unterstĂŒtzt, ein solches Feld wird ignoriert
D Date YYYYMMDD Die FeldlÀnge ist auf acht Zeichen begrenzt
T DateTime YYYYMMDDhhmmss.uuu (FoxPro) Es wird keine GĂŒltigkeitsprĂŒfung vorgenommen. VerfĂŒgbar seit dbase 7.0.0.
N Number Eine Zahl Sie mĂŒssen die LĂ€nge und die Genauigkeit (die Anzahl der Nachkommastellen) angeben.
F Float Eine Gleitkommazahl Dasselbe wie N.
C String Eine Zeichenkette Sie mĂŒssen die LĂ€nge angeben. Wenn Daten eingetragen werden, werden Leerzeichen ans Ende der Zeichenkette angehĂ€ngt, bis die festgelegte LĂ€nge erreicht ist. Überlange Zeichenketten werden stillschweigend abgeschnitten, wenn die Daten gespeichert werden.
L Boolean T oder Y fĂŒr true, F oder N fĂŒr false, ? fĂŒr nicht initialisiert. Wird seit dbase 7.0.0 als bool (true oder false), oder null fĂŒr nicht initialisierte Felder zurĂŒckgeliefert. Wurde vorher als int (1 oder 0> zurĂŒckgegeben.

Hinweis:

Von dbase 7.0.0 an werden nullable Felder fĂŒr DBASE_TYPE_FOXPRO Datenbanken unterstĂŒtzt. Ist ein Feld nullable, wird die Übergabe von null das entsprechende Flag setzen, und beim spĂ€teren Abruf wird der Feldwert null sein.

Hinweis:

Indizes und Memo-Felder werden nicht unterstĂŒtzt.

add a note

User Contributed Notes 1 note

up
24
Anonymous ¶
16 years ago
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