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.