Následující ukázka zobrazí obsah tabulky v tabulkové formě s užitím html tagu table
.
<%! #include <sqlite3.h> #define MYDB "moje-databaze" #define SQL "SELECT * FROM lidi" sqlite3 *db; int retval; char *zErrMsg = 0; int first_line = 1; int callback(void *NotUsed, int argc, char **argv, char **azColName) { int i; io_printf(out, "<tr>"); for (i = 0; i < argc; i++) { if (first_line) io_printf(out, "<th>%s</th>", azColName[i]); else io_printf(out, "<td>%s</td>", argv[i]); } io_printf(out, "</tr>"); first_line = 0; } %> <html> <head> <title>Lidi</title> <link rel="stylesheet" href="kl.css" type="text/css" /> … </head> <body> <table rules="all" border="1"> <% retval = sqlite3_open(MYDB, &db); retval = sqlite3_exec(db, SQL " LIMIT 1", callback, 0, &zErrMsg); retval = sqlite3_exec(db, SQL , callback, 0, &zErrMsg); sqlite3_close(db); %> </table> </body> </html>
Program je značně zjednodušený ale ukazuje princip. Co stojí za povšimnutí je způsob zobrazení názvů sloupců. Protože jsem nenašel jiný, dělám to takto. Na začátku stránky se nastaví proměnná first_line
na hodnotu 1 jenž znamená že ještě nebyl zpracován první řádek. Když zobrazuji data z databáze pomocí SQL SELECT příkazu, provedu operaci dvakrát. V prvním případě přidám do SQL příkazu klauzuli LIMIT 1
která omezí dotaz jen na jeden výsledný řádek. S tímto řádkem je volána fukce callback
. Ta podle obsahu proměnné first_line
zjistí že je třeba tisknout hlavičky tabulky a zajistí to. Po zpracování jakéhokoliv řádku, tedy hlavně hlaviček se změní hodnota first_line
na 0
a zajistí že přinásledujícím volání již budou zobrazována vlastní data. K tomu dojde po druhém volání sqlite3_exec
tentokráte s selectem bez klauzule LIMIT 1
.
Jiným způsobem jak rozlišit mezi hlavičkou a daty je využít prvního parametru předávaného funkci callback
. Funkce se mírně upraví, aby místo first_line
používala první argument arg1
.
int callback(void *arg1, int argc, char **argv, char **azColName) { … if ((int) arg1)) io_printf(out, "<th>%s</th>", azColName[i]); else io_printf(out, "<td>%s</td>", argv[i]); … }
A v zobrazení stránky použitím parametru callback
funkce rozlišíme jestli se zobrazuje řádek hlaviček nebo řádek dat.
… retval = sqlite3_open(MYDB, &db); retval = sqlite3_exec(db, SQL " LIMIT 1", callback, (void *)1, &zErrMsg); retval = sqlite3_exec(db, SQL , callback, (void *)0, &zErrMsg); sqlite3_close(db); …
V příkladu nejsou ošetřeny všechny chybové stavy, a lze udělat řadu vylepšení. Například před zobrazením tabulky testovat jsou-li v databázi vůbec nějaké řádky, a když ne zobrazit místo tabulky informující zprávu. Je možné také s využitím CSS zobrazit tabulku proužkovaně světlejšími a tmavšími proužky.