Une bibliothèque simple pour gérer les bases de données dbf comme dBase et FoxPro. Il s'agit d'un portage de la classe PHPXbase écrite par Erwin Kooi, mis à jour vers un code compatible PSR-2 et modifié pour les performances et pour résoudre certains problèmes du code d'origine.
Vous pouvez l'installer via Composer :
$ composer require totalcrm/php-dbf
Plus d'échantillons dans le dossier examle
.
use TotalCRM DBase TableReader ;
$ table = new TableReader ( ' test.dbf ' );
while ( $ record = $ table -> nextRecord ()) {
echo $ record -> get ( ' my_column ' );
//or
echo $ record -> my_column ;
}
Si les données de la base de données ne sont pas au format UTF-8, vous pouvez spécifier un jeu de caractères à partir duquel convertir les données :
use TotalCRM DBase TableReader ;
$ table = new TableReader (
' test.dbf ' ,
[
' encoding ' => ' cp1251 '
]
);
Il est également possible de lire des Mémos à partir de fichiers dédiés. Assurez-vous simplement qu'un fichier .fpt portant le même nom que la base de données principale existe.
Vous pouvez transmettre un tableau des colonnes dont vous avez besoin au constructeur, puis si votre table contient des colonnes que vous n'utilisez pas, elles ne seront pas chargées. De cette façon, l'analyseur peut fonctionner beaucoup plus rapidement.
use TotalCRM DBase TableReader ;
$ table = new TableReader (
' test.dbf ' ,
[
' columns ' => [ ' my_column ' , ' another_column ' ]
]
);
while ( $ record = $ table -> nextRecord ()) {
echo $ record -> my_column ;
echo $ record -> another_column ;
}
Si vous connaissez déjà le type de colonne, vous pouvez également appeler la fonction spécifique au type pour ce champ, ce qui augmente également la vitesse.
while ( $ record = $ table -> nextRecord ()) {
echo $ record -> get ( ' my_column ' );
echo $ record -> get ( ' another_column ' );
}
Pour ouvrir un tableau en vue de l'éditer, vous devez utiliser un objet TableEditor
, comme sur cet exemple :
use TotalCRM DBase TableEditor ;
$ table = new TableEditor ( ' test.dbf ' );
for ( $ i = 0 ; $ i < 10 ; $ i ++) {
$ record = $ table -> nextRecord ();
$ record -> set ( ' field ' , ' string ' );
//or
$ record -> field = ' string ' ;
$ table -> writeRecord ();
}
$ table
-> save ()
-> close ();
use TotalCRM DBase TableEditor ;
$ table = new TableEditor (
' file.dbf ' ,
[
' editMode ' => TableEditor:: EDIT_MODE_CLONE , //default
]
);
$ record = $ table -> appendRecord ();
$ record -> set ( ' name ' , ' test name ' );
$ record -> set ( ' age ' , 20 );
$ table
-> writeRecord ()
-> save ()
-> close ();
use TotalCRM DBase TableEditor ;
$ table = new TableEditor ( ' file.dbf ' );
while ( $ record = $ table -> nextRecord ()) {
if ( $ record -> get ( ' delete_this_row ' )) {
$ table -> deleteRecord (); //mark record deleted
}
}
$ table
-> pack () //remove deleted rows
-> save () //save changes
-> close ();
Pour créer un fichier table, vous devez utiliser l'objet TableCreator
.
use TotalCRM DBase Enum FieldType ;
use TotalCRM DBase Enum TableType ;
use TotalCRM DBase Header Column ;
use TotalCRM DBase Header HeaderFactory ;
use TotalCRM DBase TableCreator ;
use TotalCRM DBase TableEditor ;
// you can specify any other database version from TableType
$ header = HeaderFactory:: create (TableType:: DBASE_III_PLUS_MEMO );
$ filepath = ' /path/to/new/file.dbf ' ;
$ tableCreator = new TableCreator ( $ filepath , $ header );
$ tableCreator
-> addColumn ( new Column ([
' name ' => ' name ' ,
' type ' => FieldType:: CHAR ,
' length ' => 20 ,
]))
-> addColumn ( new Column ([
' name ' => ' birthday ' ,
' type ' => FieldType:: DATE ,
]))
-> addColumn ( new Column ([
' name ' => ' is_man ' ,
' type ' => FieldType:: LOGICAL ,
]))
-> addColumn ( new Column ([
' name ' => ' bio ' ,
' type ' => FieldType:: MEMO ,
]))
-> addColumn ( new Column ([
' name ' => ' money ' ,
' type ' => FieldType:: NUMERIC ,
' length ' => 20 ,
' decimalCount ' => 4 ,
]))
-> addColumn ( new Column ([
' name ' => ' image ' ,
' type ' => FieldType:: MEMO ,
]))
-> save (); //creates file
$ table = new TableEditor ( $ filepath );
//... add records
Je ne suis pas un expert de dBase et je ne connais pas tous les détails des types et des versions de champs, donc la bibliothèque peut ne pas être en mesure de gérer certaines situations. Si vous trouvez une erreur, veuillez ouvrir un problème et envoyez-moi un exemple de tableau afin que je puisse reproduire votre problème, et j'essaierai de vous aider.
Description du format de fichier Xbase
Structure des fichiers pour dBASE 7
STRUCTURE DES FICHIERS DBF ET DBT/FPT