If you need a 'download data' button that automatically fires up a spreadsheet (like Excel), find that fputcsv() isn't working as expected, that none of the installed DBA database engines create a spreadsheet that can be opened, and that XLS generating components are just too heavy weight, then this might just hit the spot:
<?php
// simple table to present
$data = array(
array('col1','col2'),
array(1,2),
array(3,4)
);
// pretend content (which is XML) is XLS native
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"sheet.xls\";" );
// construct skeleton
$dom = new DOMDocument('1.0', 'utf-8');
$dom->formatOutput = $dom->preserveSpaces = true; // optional
$n = new DOMProcessingInstruction('mso-application', 'progid="Excel.Sheet"');
$dom->appendChild($n);
$workbook = $dom->appendChild(new DOMElement('Workbook'));
$workbook->setAttribute('xmlns','urn:schemas-microsoft-com:office:spreadsheet');
$workbook->setAttribute('xmlns:o','urn:schemas-microsoft-com:office:office');
$workbook->setAttribute('xmlns:x','urn:schemas-microsoft-com:office:excel');
$workbook->setAttribute('xmlns:ss','xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet');
$workbook->setAttribute('xmlns:html','http://www.w3.org/TR/REC-html40');
$styles = $workbook->appendChild(new DOMElement('Styles'));
$style = $styles->appendChild(new DOMElement('Style'));
$style->setAttribute('ss:ID','Default');
$worksheet = $workbook->appendChild(new DOMElement('Worksheet'));
$worksheet->setAttribute('ss:Name','sheet1');
$xmltable = $worksheet->appendChild(new DOMElement('Table'));
// populate with data
foreach ($data as $datarow) {
$xmlrow = $xmltable->appendChild(new DOMElement('Row'));
foreach ($datarow as $datacell) {
$xmlcell = $xmlrow->appendChild(new DOMElement('Cell'));
$xmldata = $xmlcell->appendChild(new DOMElement('Data', $datacell));
$xmldata->setAttribute('ss:Type', is_numeric($datacell) ? 'Number' : 'String');
}
}
// display and quit
echo $dom->saveXML();
?>
XXIV. DBA
Introduction
Ces fonctions constituent l'interface avec les bases de type Berkeley.
C'est une couche générale pour plusieurs bases de données sur fichiers. En tant que telles, les fonctionnalités sont limitées à une partie des fonctionnalités des bases de données modernes, comme Sleepycat Software's DB2 (à ne pas confondre avec IBM's DB2 software, qui fonctionne avec ODBC).
Pré-requis
Le comportement de certaines fonctions dépend de la base de données utilisée. Par exemple dba_optimize() et dba_sync() n'auront pas le même effet d'une base à l'autre.
Lors de l'utilisation de la fonction dba_open() ou de dba_popen(), une des bibliothèques suivantes doit être fournie comme argument. La liste complète des bibliothèques supportées par votre configuration est disponible avec la fonction phpinfo(). (Pour inclure le support de l'une de ces bibliothèques, ajoutez l'option de configuration --with-XXXX).
Tableau 1. Liste des bibliothèques DBA
| Bibliothèque | Notes |
|---|---|
| dbm | Dbm est la plus ancienne des base de données de type Berkeley. Il vaut mieux l'éviter, si possible. Les fonctions de compatibilités codées dans DB2 et gdbm ne sont pas supportées, car elles ne sont compatibles qu'au niveau du code source et ne peuvent pas gérer le format dbm originel. |
| ndbm | ndbm est un nouveau type de dbm plus flexible. Il a cependant la majorité des limitations du genre. (il est donc déconseillé) |
| gdbm | gdbm est la base dbm GNU. |
| db2 | db2 est DB2 de Sleepycat Software. Elle se décrit comme un "ensemble d'outils qui fournissent une base de données performante, tant pour les applications indépendantes que pour le client/serveur". |
| db3 | DB3 est le DB3 de Sleepycat Software. |
| db4 | DB4 est le Sleepycat Software's DB4. Elle est disponible depuis PHP 4.3.2. |
| cdb | cdb est "un package rapide, robuste, léger pour créer et lire des bases de données constantes". C'est l'auteur de qmail qui l'a écrit, et elle est disponible ici. Puisque c'est une base constante, elle ne supporte que la lecture. Mais depuis PHP 4.3.0, le support de l'écriture a été ajouté (mais pas celui de la modification), grâce aux bibliothèques internes de cdb. |
| cdb_make | Depuis PHP 4.3.0, la création de fichier cdb est supportée, lorsque la bibliothèque cdb, distribuée avec PHP est utilisée. |
| flatfile | Depuis PHP 4.3.0, et pour assurer la compatibilité avec le gestionnaire dbm qui est obsolète et doit être évité, PHP supporte aussi un gestionnaire de fichiers. Il est recommandé de l'utiliser lorsque vous devez accéder à des fichiers au format dbm. Cela arrive lorsque vous ne pouvez pas trouver les bibliothèques dbm pour compiler PHP avec. |
| inifile | Ceci est disponible depuis PHP 4.3.3 pour pouvoir modifier les fichiers php.ini depuis les scripts PHP. Lorsque vous travaillez avec des fichiers ini, vous pouvez passer des tableaux de la forme array(0 => groupe, 1=>nom_valeur) ou des chaînes de la forme "[groupe]nom_valeur" où groupe est optionnel. Comme les fonctions dba_firstkey() et dba_nextkey() retournent des représentations de la clé au format chaîne, il existe une nouvelle fonction, dba_key_split(), disponible depuis PHP 5 qui permet de convertir la chaîne de caractères de clés en tableau de clés sans perdre FALSE. |
| qdbm | Disponible depuis PHP 5.0.0. La bibliothèque qdbm peut être téléchargée sur http://qdbm.sourceforge.net. |
Lors de l'utilisation de la fonction dba_open() ou de dba_popen(), une des bibliothèques suivantes doit être fournie comme argument. La liste complète des bibliothèques supportées par votre configuration est disponible avec la fonction phpinfo().
Installation
En utilisant l'option de compilation --enable-dba=shared, vous pouvez compiler un module dynamique qui activera le support des bases de données de style DBM pour PHP. Vous devez aussi ajouter le support d'au moins l'un des gestionnaires suivants, en spécifiant l'option de configuration --with-XXXX lors de la configuration de PHP.
| Avertissement |
Après avoir configuré et compilé PHP, vous devez exécuter les test suivants à partir de la ligne de commande : php run-tests.php ext/dba. Cela montre si votre combinaison de descripteurs fonctionne. Les plus problématiques sont dbm et ndbm qui entrent en conflit avec nombre d'installations. Ceci est dû au fait que sur de nombreux systèmes, ces bibliothèques font parties de plus d'une bibliothèque. Le test de configuration vous empêche juste de configurer des descripteurs dont la combinaison est défectueuse alors qu'ils fonctionnent correctement séparément. |
Tableau 2. Gestionnaires DBA supportés
| Gestionnaire | Option de configuration |
|---|---|
| dbm |
Pour activer le support de dbm, ajoutez
--with-dbm[=DIR].
|
| ndbm |
Pour activer le support de ndbm, ajoutez
--with-ndbm[=DIR].
|
| gdbm | Pour activer le support de gdbm, ajoutez --with-gdbm[=DIR]. |
| db2 |
Pour activer le support de db2, ajoutez
--with-db2[=DIR].
|
| db3 |
Pour activer le support de db3, ajoutez
--with-db3[=DIR].
|
| db4 |
Pour activer le support de db4, ajoutez
--with-db4[=DIR].
|
| cdb |
Pour activer le support de cdb, ajoutez
--with-cdb[=DIR].
|
| flatfile |
Pour activer le support des fichiers, ajoutez
--with-flatfile.
|
| inifile |
Pour activer le support de inifile, ajoutez l'option
de compilation --with-inifile.
|
| qdbm |
Pour activer le support de qdbm, ajoutez l'option de compilation
--with-qdbm[=DIR].
|
Note : Jusqu'en PHP 4.3.0, il était possible d'utiliser simultanément les gestionnaires db2 et db3 mais juste avec un seul en interne. Cela signifie que vous ne pouvez pas avoir les deux formats de fichiers. Depuis PHP 5.0.0, une vérification est faite lors de la configuration pour éviter ces problèmes.
Configuration à l'exécution
Cette extension ne définit aucune directive de configuration.
Types de ressources
Les fonctions dba_open() et dba_popen() retourne une ressource qui représente la base de données ouverte, et qui est utilisées par toutes les autres fonctions dba.
Constantes pré-définies
Cette extension ne définit aucune constante.
Exemples
DBA gère les données binaires et n'a pas de limites arbitraires. Elle hérite de toutes les limites de la base sous-jacente.
Toutes les bases de données sur fichiers doivent fournir un moyen de changer le mode d'accès au fichier d'une base et, si possible, de toutes les bases. Le mode d'accès est généralement passé en quatrième argument à dba_open() ou dba_popen().
Vous pouvez accéder à toutes les entrées d'une base d'une manière linéaire, avec les fonctions dba_firstkey() et dba_nextkey(). Vous ne devez pas modifier une base lorsque vous la traversez ainsi.
- Table des matières
- dba_close -- Ferme une base DBA
- dba_delete -- Efface une ligne dans une base DBA
- dba_exists -- Vérifie qu'une clé DBA existe
- dba_fetch -- Lit les données liées à une clé DBA
- dba_firstkey -- Lit la première clé DBA
- dba_handlers -- Liste les gestionnaires DBA disponibles
- dba_insert -- Insère une entrée DBA
- dba_key_split -- Transforme une représentation de clé DBA par chaîne en une représentation par tableau
- dba_list -- Liste tous les fichiers de bases de données DBA ouverts
- dba_nextkey -- Lit la clé DBA suivante
- dba_open -- Ouvre une base de données DBA
- dba_optimize -- Optimise une base DBA
- dba_popen -- Ouvre une connexion persistante à une base de données DBA
- dba_replace -- Remplace ou insère une ligne DBA
- dba_sync -- Synchronise une base de données DBA
Benchmark test:
http://qdbm.sourceforge.net/benchmark.pdf
Don't make the dumb mistake I did, if you copy the first example at the top and modify it for test, the dba_open specifies "n" which will truncate the database that you are pointing to. Make sure you change it to "r" if you just want to read from an existing dbm file.
When using db4 on redhat 7.3 you may get signal 11s on the apache child processes. The installation test scripts will report that db4 is working correctly as the cli will not sig 11 out. The solution is to check to see if mod_rewrite is installed with apache, if it is either dereference it from libdb.so.3 or build apache without mod rewrite. Once this is done you will no longer have your child processes dying out and db4 will work. If you do not get a sig 11 after dba_open just ignore this comment.
With db2, you need to call dba_sync() to get the data written to disk; the examples are missing this. db2 uses
the BTREE file format, not the more common HASH.
BTREE is faster, though, in my tests, so it's a good
choice.
