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.