dBase

Introduction

Note:

Cette extension a été déplacée dans le module » PECL et ne sera plus intégrée dans PHP à partir de PHP 5.3.0.

Ces fonctions permettent d'accéder aux enregistrements des bases de données au format dBase (dbf).

Avertissement

Il est recommandé de ne pas utiliser les fichiers dBase comme la base de données de production. Il est recommandé d'utiliser » SQLite ou d'opter plutôt pour un vrai serveur SQL à la place ; » MySQL ou » PostgreSQL sont des choix communs en PHP. Le support dBase est présent en PHP uniquement pour permettre d'importer et d'exporter des données depuis et vers la base de données, car ce format de fichier est habituellement compris par les tableurs Windows.

Attention

À partir de dbase 7.0.0 les bases de données sont automatiquement verrouillées via flock(). Il n'y avait aucun support pour le verrouillage précédemment, donc deux processus de serveur web concomitants modifiant le même fichier dBase auraient très probablement ruiné la base de données. Ceci peut se produire même avec dbase 7.0.0+ sur les systèmes qui implémentent le verrouillage au niveau du processus avec les SAPI multithreadés.

Les fichiers dBase sont de simples fichiers séquentiels, d'un nombre d'enregistrements fixe. Les enregistrements sont ajoutés à la fin du fichier et les enregistrements effacés sont conservés tant que l'on n'appelle pas la fonction dbase_pack().

Seuls les fichiers dbf levels 3 (dBASE III+) - 5 (dBASE V) sont supportés. Les types de champs dBase disponibles sont :

Types de champs disponibles
Champ Type dBase Format Informations complémentaires
M Memo n/a Ce type n'est pas supporté par PHP, et sera ignoré
D Date YYYYMMDD La taille du champ est limitée à 8
T DateTime YYYYMMDDhhmmss.uuu (FoxPro) Aucune vérification de validité n'est faite. Disponible à partir de dbase 7.0.0.
N Number Un nombre Il faut déclarer une taille et une précision (le nombre de chiffres après le point décimal).
F Float Un nombre flottant Identique à N.
C chaîne de caractères Une chaîne de caractères Il faut déclarer une taille. Lors de la récupération des données, la chaîne sera complétée d'espaces afin d'atteindre la taille déclarée. Les chaîne de caractères trop longues seront tronquées silencieusement lors de l'enregistrement.
L booléen T ou Y pour true, F ou N pour false, ? pour non initialisée. À partir de dbase 7.0.0, retourné en tant que bool (true ou false), ou null pour les champs non initialisés. Précédemment, retourné en tant que int (1 ou 0).

Note:

À partir de dbase 7.0.0 les champs nullable sont supportés pour les bases de données DBASE_TYPE_FOXPRO. Si un champ est nullable, passer null définira le drapeau respectif, et lors d'une récupération ultérieure la valeur du champ sera null.

Note:

Il n'y a aucun support des index ou des champs memo.

add a note

User Contributed Notes 1 note

up
23
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
To Top