Datenbank basierte Linkseite
Vorarbeiten
Das Skript sollte sinvoller Weise in einem mit .htaccess geschützten Verzeichnis liegen, damit nicht jeder
es ausführen kann.
Jetzt benötigen wir noch zusätzlich das Modul URI::Escape. Dieses Modul erleichtert die URL
konforme Kodierung von Sonderzeichen. Die Gruppennamen könnten ja Sonderzeichen enthalten. Dazu besorgen wir
uns aus dem CPAN das momentan aktuelle
URI-1.23.tar.gz. Wenn wir uns das zugehörige Readme nach dem Auspacken ansehen, erfahren wir, daß vor
URI::Escape noch MIME::Base64 installiert werden muß. Also besorgen wir uns das
momentan aktuelle
MIME-Base64-2.16.tar.gz.
Funktionsweise
Das Einbinden der Module und die Konfiguration der Variablen geschieht in den Zeilen 1-56, ganz analog zu
links.cgi. Dann geben wir mit der Unterroutine http_header einen
gültigen HTTP Header und eine Überschrift aus. In den Zeilen 66-96 wird festgelegt wie das Skript auf die
unterschiedlichen Anfragen im Query String reagieren soll. Danach werden noch die Gruppennamen aus der
Datenbank gelesen und als Links ausgegeben. Diese Links rufen das Programm erneut auf und übergeben zusätzlich
noch im Parameter name den Gruppennamen. Des weiteren werden zwei weitere Links ausgegeben. Zum
einen ein Aufruf des Programmes links_admin.cgi, dessen Beschreibung noch aussteht, und der
Aufruf des Programmes links.cgi. Zum Schluß folgt noch ein Formular mit einem
Eingabefeld: name; und die Buttons "Eintragen", "Ändern" und
"Löschen".
Wird das Skript aufgerufen und im Query String steht ?insert=Eintragen&name=blafasel,
so wird der Gruppenname "blafasel" in die Datenbank hinzugefügt (Zeile 66-72). Wird der Parameter
edit gesetzt, so werden desweiteren noch die Parameter name und nr mit den
Gruppennamen und der Gruppenid übertragen. Dann handelt es sich um eine Änderung und die geänderten Daten
ersetzen den bestehenden Datensatz (Zeile 73-80). Ist der Parameter delete gesetzt, wird der in
name und nr übergebene Datensatz gelöscht. Allerdings nicht bevor geprüft wurde, ob
zu dieser Gruppe noch Datensätze in der Tabelle links existieren. Ist dies der Fall wird an
Stelle des Löschens eine Fehlermeldung ausgegeben. So vermeiden wir, das Links ohne Gruppe zurückbleiben
(Zeilen 81-95).
Ruft das Skript sich selbst mit einem Gruppennamen-Link auf, so werden lediglich die Parameter name
und nr übergeben. Was dazu führt, das das Formular mit dem Gruppennamene gefüllt wird und die
Gruppenid als hidden_field gesetzt wird. Dies erlaubt ein einfaches Editieren von bereits
bestehenden Gruppenbezeichnungen.
Das Skript
Das Programm steht als Text Datei hier zum Download bereit.
1 #!/usr/bin/perl -w
2
3 use CGI qw/:standard :netscape/;
4 use strict;
5 use CGI::Carp qw/fatalsToBrowser/;
6 use DBI;
7 use URI::Escape;
8
9 ###############################################
10 # Copyright 1999 Dr Thomas Wieland
11 # wieland@thwieland.de
12 # für www.perl-stammtisch.de
13 ###############################################
14
15 # Methode für Formular
16 my $method = 'POST';
17
18 # Hintergrundfarbe
19 my $bgrdcl = '#EEEEEE';
20
21 # Titel der Seite
22 my $page_title = "Linkseite";
23
24 # Bild für die Überschrift
25 my $title_gif = "linklogo.gif";
26
27 # Bild für den Homepagebutton
28 my $homepage_gif = "homepage.gif";
29
30 # Pfad zu den Bildern ausgehend vom Root Verzeichnis des httpd
31 my $icons = '/~wieland/eins/images';
32
33 # Adresse des Adminskripts (zum Löschen von Einträgen) Kategorien
34 my $kadminurl = 'http://localhost/cgi-bin2/mydir/kat_admin.cgi';
35
36 # Adresse des Linkseitenskripts
37 my $linkurl = 'http://localhost/cgi-bin2/links.cgi';
38
39 # Adresse des Adminskripts (zum Löschen von Einträgen) Links
40 my $link_adminurl = 'http://localhost/cgi-bin2/mydir/link_admin.cgi';
41
42 # Url der Homepage
43 my $homeurl = 'http://localhost/';
44
45
46 # Variablen für Datenbank
47 my ($dbh, $sth, $sql, $row, $rv);
48 my $db_type = 'mysql';
49 my $port = 0;
50 my $hostname = "localhost";
51 my $db_name = 'perl_stammtisch';
52 my $DB_DSN = "DBI:$db_type:$db_name:$hostname:$port:";
53 my $DB_USER = "Benutzer für die Datenbank";
54 my $DB_PASSWD = "Passwort des Benutzers";
55 my $Tab_Links = 'links';
56 my $Tab_Link_Kat = 'link_kat';
57
58 # Http Header, Kopf und Überschrift
59 &http_header;
60
61 # Datenbank Verbindung herstellen
62 $dbh = DBI->connect($DB_DSN, $DB_USER, $DB_PASSWD,
63 { RaiseError => 1 } );
64
65
66 # Falls Parameter insert -> Einfügen
67 if (param('insert')) {
68 my $name = param('name');
69 $sql = qq[ INSERT into $Tab_Link_Kat
70 (gruppe) VALUES('$name') ];
71 $dbh->do($sql);
72 Delete_all();
73 } elsif (param('edit')) {
74 my $name = param('name');
75 my $nr = param('nr');
76 $sql = qq[ UPDATE $Tab_Link_Kat
77 SET katid='$nr', gruppe='$name'
78 WHERE katid='$nr' ];
79 $dbh->do($sql);
80 Delete_all();
81 } elsif (param('delete')) {
82 my $nr = param('nr');
83 $sql = qq[ SELECT * FROM $Tab_Links WHERE grpid='$nr' ];
84 $sth = $dbh->prepare($sql);
85 $sth->execute();
86 $rv = $sth->rows;
87 unless ($rv) {
88 $sql = qq[ DELETE FROM $Tab_Link_Kat WHERE katid='$nr'];
89 $dbh->do($sql);
90 } else {
91 print "Fehler: Zu dieser Kategorie existieren noch ",
92 "Einträge!! Kategorie nicht gelöscht<br>",hr;
93 }
94 Delete_all();
95 }
96
97 &links;
98 &formular;
99
100 # Datenbank Verbindung lösen
101 $dbh->disconnect(); # Datenbankverbindung lösen.
102
103 print end_html();
104
105 # Unterprogramme
106
107 ###############################################
108 sub http_header {
109 ###############################################
110 print header(),
111 start_html(-BGCOLOR => $bgrdcl,
112 -title => $page_title,
113 -author => 'wieland@thwieland.de',
114 -meta=>{'keywords' => 'Perl-Stammtisch',
115 'copyright'=>
'copyright 1999 Dr. Thomas Wieland'}
116 )."\n";
117 print center(table({-border => 0,
118 -width => '95%'},
119 TR(td(img{-src => "$icons/$title_gif",
120 -alt => 'Linkseite Logo'}),
121 td(h4('Kategorien verwalten')),
122 td(a({-href=> $homeurl},
123 img{-src => "$icons/$homepage_gif",
124 -alt => 'Zur Homepage',
125 -border => 0}
126 )
127 )
128 )
129 )
130 ),hr,"\n";
131 }
132
133
134 ###############################################
135 sub formular {
136 ###############################################
137 my $name = param('name');
138 my $nr = param('nr');
139 print start_form(-method => $method),
140 table({-border => 0},
141 TR(td(["Name:",
142 textfield(-name => 'name', -value =>
"$name", -size => 40)])),
143 ),
144 hidden(-name => 'nr', -value => "$nr"),
145 table({-border => 0},
146 TR(td([submit (-name => 'insert',
147 -value => 'Eintragen'),
148 submit (-name => 'edit',
149 -value => 'Ändern'),
150 submit (-name => 'delete',
151 -value => 'Löschen')]
152 )
153 )
154 ),
155 end_form()
156
157 }
158
159 ###############################################
160 sub links {
161 ###############################################
162 # Zeile mit Links zu den einzelnen Kategorien erzeugen
163 $sql = qq[ SELECT * FROM $Tab_Link_Kat ORDER BY gruppe ];
164 $sth = $dbh->prepare($sql);
165 $sth->execute();
166
167 my %kat = undef;
168 print "<center>|";
169 while ($row = $sth->fetchrow_arrayref) {
170 print b(" "),
171 a({href => url()."?name=".uri_escape($row->[1])."
&nr=".$row->[0]},$row->[1]),
172 b(" |");
173 $kat{"$row->[1]"} = $row->[0];
174 }
175 print b(" "),a({href => $link_adminurl}, 'Links verwalten'),
b(" |");
176 print b(" "),a({href => $linkurl}, 'Links anzeigen'),b(" |");
177 print "</center>",hr;
178 $sth->finish;
179 }
Zurück zum Anfang dieses Projekts.