Dies ist ein weiteres Beispiel für den Datenbankzugriff mittels DBI.
Im Gegensatz zum vorhergehenden Beispiel arbeitet es aber mit expliziten
Schleifen. [-
# Mit der Datenbank verbinden
$dbh = DBI->connect($DSN) ;
# Vorbereiten des SQL Select
$sth = $dbh -> prepare ("SELECT * from $table") ;
# Abfrage ausführen
$sth -> execute ;
# Ermitteln der Feldnamen für die Überschrift in $head
$head = $sth -> {NAME} ;
-]
<table>
<tr>
[$ foreach $h @$head $]
<th>[+ $h +]</th>
[$ endforeach $]
</tr>
[$ while $dat = $sth -> fetchrow_arrayref $]
<tr>
[$ foreach $v @$dat $]
<td>[+ $v +]</td>
[$ endforeach $]
</tr>
[$ endwhile $]
</table>
DBIx::Recordset ist ein Modul welches den Datenbankzugriff vereinfachen soll.
Eine weiterführende Einführung zu DBIx::Recordset und Embperl findet sich in der iX 9/1999
unter https://www.heise.de/select/ix/archiv/1999/9/seite-142/pdf (erfordert Anmeldung).
Datenbankabfrage Beispiel | top |
[-*set = DBIx::Recordset -> Search ({%fdat,
('!DataSource' => $DSN,
'!Table' => $table,
'$max' => 5,)}) ; -]
<table>
<tr><th>ID</th><th>NAME</th></tr>
<tr>
<td>[+ $set[$row]{id} +]</td>
<td>[+ $set[$row]{name} +]</td>
</tr>
</table>
[+ $set -> PrevNextForm ('Previous Records',
'Next Records',
\%fdat) +]
Search erzeugt ein Recordsetobjekt | top |
Search nimmt die Werte aus %fdat und benutzt diese um einen SQL WHERE
Ausdruck zu erzeugen. Auf diese Weise hängt es davon ab, was an das
Dokument für Daten gesandt werden, welche Anfrage ausgeführt wird.
z.B. wenn man das Dokument mit https://host/mydoc.html?id=5 aufruft,
werden alle Datensätze deren Feld id den Wert 5 enthält angezeigt.
Die Daten können als Array oder mittels eines aktuellen Datensatzzeigers angesprochen werden | top |
Das Ergebnis der Abfrage kann wie ein Array angesprochen werden (was nicht
heißt, daß das ganze Array auch tatsächlich von der Datenbank angefordert wird).
Alternativ können die Felder des aktuellen Record angesprochen werden. set[5]{id} Zugriff auf das Feld 'id' des sechsten gefundenen Datensatzes
set{id} Zugriff auf das Feld 'id' des aktuellen Datensatzes
Felder können mit ihren Namen angesprochen werden | top |
Während bei DBI Feldinhalte hauptsächlich über ihre Spaltennummern angesprochen
werden, benutzt DBIx::Recordset Spaltennamen. Dies macht das Programm einfacher
zu schreiben, leichter verständlich und unabhäniger von Veränderungen in der
Datenbankstruktur.
PrevNextForm erzeugt keinen/einen/zwei Schaltflächen je nachdem ob
weitere Datensätze angezeigt werden müssen | top |
Die PrevNextButtons Funktion kann dazu benutzt werden um Schaltflächen
zum Anzeigen der vorhergehenden bzw. folgenden Datensätze zu erzeugen.
PrevNextForm generiert ein kleines Formular welches alle nötigen
Daten als versteckte Felder enthält.
Wie fürs Suchen, gibt es auch Funktionen für Insert/Update/Delete | top |
Beispiel für Insert Wenn %fdat die Daten für einen neuen Datensatz enthält, fügt der
folgende Code einen diesen der angegebenen Tabelle hinzu. [-*set = DBIx::Recordset -> Insert ({%fdat,
('!DataSource' => $DSN,
'!Table' => $table)}) ; -]
Datenbanktabellen können ebenso an einen Hash gebunden werden | top |
DBIx::Recordset kann ebenfalls eine Datenbanktabelle an einen Hash
binden. Man muß lediglich den Primärschlüssel der Tabelle angeben und
kann dann auf die Tabelle mittels eines Perl Hashs zugreifen. $set{5}{name} Zugriff auf Feld 'name' mit id=5
(id ist Primärschlüssel)
Arbeiten mit mehreren Tabellen | top |
DBIx::Recordset bietet zahlreiche Möglichkeiten um einfach mit mehreren
Tabellen umgehen zu können. DBIx::Recordset versucht auf Grund der
Namen innerhalb der Datenbank selbstständig Zusammenhänge zwischen
Tabellen zu erkennen.
Weitere Zusammenhänge können manuell angegeben werden.
Mit diesen Informationen kann DBIx::Recordset automatisch Unterobjekte
erzeugen, die die zum entsprechenden Datensatz zugehörigen Datensätze der
verbundenen Tabelle enthalten. Ebenso ist es möglich das DBIx::Recordset
einer Abfrage automatisch Felder hinzufügt, die den referenzierten
Datensatz beschreiben. So ist es z.B. möglich, wenn in einer Tabelle
die Kundennr enthalten ist, aus dem Kundenstammsatz automatisch den Namen
des Kunden hinzuzufügen, ohne das diese jedesmal explizit angeben werden
müßte.
|