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 Date::Manip. Dieses Modul erlaubt eine einfache Datumsmanipulation, wie der Name ja schon sagt Dazu besorgen wir uns aus dem CPAN das momentan aktuelle DateManip-5.40.tar.gz.

Funktionsweise
Das Einbinden der Module und die Konfiguration der Variablen geschieht in den Zeilen 1-57, 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 62-95 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. Damit kann man an die gewünschte Kategorie in der Anzeige springen. Des weiteren werden zwei weitere Links ausgegeben. Zum einen ein Aufruf des Programmes kat_admin.cgi, und der Aufruf des Programmes links.cgi. Zum Schluß folgt noch ein Formular mit den Eingabefeldern: name und URL, sowie ein Auswahlfeld, zum auswählen der zugehörigen Kategorie. Dieses Auswahlfeld wird aus dem Hash %kat erzeugt, der als keys die Gruppennamen und als values die Gruppenid's enthält. Beim Auswählen wird in einem hidden_field die Gruppenid gesetzt. Außerdem werden noch die Buttons "Eintragen", "Ändern" und "Löschen" erzeugt.
Die restliche Funktionsweise ist dem Skript kat_admin.cgi analog angelegt. Es muß hier nicht geprüft werden, ob die Gruppe gelöscht werden darf, da wir ja die Links bearbeiten. Zusätzlich erfolgt die Ausgabe der Links analog zu links.cgi, hier wird beim Betätigen eines Links das Skript erneut aufgerufen und das Formular mit dem ausgewählten Link vorbelegt. Des weiteren erzeugen wir mit der Funktion UnixDate aus Date::Manip ein Zeitstempel mit dem Format JJJJ-MM-TT HH:MM:SS. Das war's dann schon.

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	use Date::Manip qw/UnixDate/;
  9	
 10	###############################################
 11	# Copyright 1999 Dr Thomas Wieland
 12	# wieland@thwieland.de
 13	# für www.perl-stammtisch.de
 14	###############################################
 15	
 16	# Methode für Formular
 17	my $method = 'POST';
 18	
 19	# Hintergrundfarbe
 20	my $bgrdcl     = '#EEEEEE';
 21	
 22	# Titel der Seite
 23	my $page_title = "Linkseite";
 24	
 25	# Bild für die Überschrift
 26	my $title_gif = "linklogo.gif";
 27	
 28	# Bild für den Homepagebutton
 29	my $homepage_gif = "homepage.gif";
 30	
 31	# Pfad zu den Bildern ausgehend vom Root Verzeichnis des httpd
 32	my $icons = '/images';
 33	
 34	# Adresse des Adminskripts (zum Löschen von Einträgen) Kategorien
 35	my $kadminurl = 'http://localhost/cgi-bin2/mydir/kat_admin.cgi';
 36	
 37	# Adresse des Linkseitenskripts
 38	my $linkurl = 'http://localhost/~wieland/eins/cgi-bin2/links.cgi';
 39	
 40	# Adresse des Adminskripts (zum Löschen von Einträgen) Links
 41	my $link_adminurl = 'http://localhost/cgi-bin2/mydir/link_admin.cgi';
 42	
 43	# Url der Homepage
 44	my $homeurl    = 'http://localhost/';
 45	
 46	
 47	# Variablen für Datenbank
 48	my ($dbh, $sth, $sql, $row, $rv, %kat, %katnames);
 49	my $db_type      = 'mysql';
 50	my $port         = 0;
 51	my $hostname     = "localhost";
 52	my $db_name      = 'perl_stammtisch';
 53	my $DB_DSN       = "DBI:$db_type:$db_name:$hostname:$port:";
 54	my $DB_USER      = "perl_stammtisch";
 55	my $DB_PASSWD    = "";
 56	my $Tab_Links    = 'links';
 57	my $Tab_Link_Kat = 'link_kat';
 58	
 59	# Http Header, Kopf und Überschrift
 60	&http_header;
 61	
 62	# Datenbank Verbindung herstellen
 63	$dbh = DBI->connect($DB_DSN, $DB_USER, $DB_PASSWD,
 64	        { RaiseError => 1 } );
 65	
 66	
 67	# Falls Parameter insert -> Einfügen
 68	if (param('insert')) {
 69	    my $name = param('name');
 70		my $stamp = UnixDate(scalar localtime, "%Y-%m-%d %H:%M:%S");
 71		my $url = param('url');
 72		my $grpid = param('grpid');
 73	    $sql = qq[ INSERT into $Tab_Links 
 74	               (url, name, stamp, grpid) 
 75			VALUES('$url', '$name', '$stamp', '$grpid') ];
 76	    $dbh->do($sql);
 77	    Delete_all();
 78	} elsif (param('edit')) {
 79	    my $name = param('name');
 80	    my $nr   = param('nr');
 81		my $stamp = UnixDate(scalar localtime, "%Y-%m-%d %H:%M:%S");
 82		my $url = param('url');
 83		my $grpid = param('grpid');
 84	    $sql = qq[ UPDATE $Tab_Links 
 85	               SET linkid='$nr', name='$name',
 86		       url='$url', stamp='$stamp', grpid='$grpid'  
 87	               WHERE linkid='$nr' ];
 88	    $dbh->do($sql);
 89	    Delete_all();
 90	} elsif (param('delete')) {
 91	    my $nr = param('nr');
 92	    $sql = qq[ DELETE FROM $Tab_Links WHERE linkid='$nr'];
 93	    $dbh->do($sql);
 94	    Delete_all();
 95	}
 96	
 97	&kat;
 98	&formular;
 99	&links;
100	
101	# Datenbank Verbindung lösen
102	$dbh->disconnect();  # Datenbankverbindung lösen.
103	    
104	print end_html();
105	
106	# Unterprogramme
107	
108	###############################################
109	sub http_header {
110	###############################################
111	    print header(), 
112	          start_html(
                   -BGCOLOR => $bgrdcl,
113	             -title   => $page_title,
114	             -author  => 'wieland@thwieland.de.de',
115	             -meta=>{'keywords' => 'Perl-Stammtisch',
116	                  'copyright'=>'copyright 1999 Dr. Thomas Wieland'}
117	          )."\n";
118	    print center(table({-border => 0,
119	                        -width  => '95%'},
120	                       TR(td(img{-src => "$icons/$title_gif",
121	                                 -alt => 'Linkseite Logo'}),
122	                          td(h4('Links verwalten')),
123	                          td(a({-href=> $homeurl},
124	                                img{-src => "$icons/$homepage_gif",
125	                                    -alt => 'Zur Homepage',
126	                                    -border => 0}
127	                               )
128	                             )
129	                        )
130	                       )
131	                 ),hr,"\n"; 
132	}
133	
134	
135	###############################################
136	sub formular {
137	###############################################
138	    my $name = param('name');
139	    my $nr = param('nr');
140		my $url =param('url');
141		my $grpid = param('grpid');
142		my @katnames = sort(keys %katnames);
143	    print start_form(-method => $method),
144	          table({-border => 0},
145	                 TR(td(["Name:",
146	                        textfield(-name => 'name',
                                 -value => "$name", -size => 40)])),
147					 TR(td(["URL:",
148	                        textfield(-name => 'url', -value => 
                                 "$url", -size => 40)])),
149	                 ),
150	          hidden(-name => 'nr', -value => "$nr"),
151			  scrolling_list(-name => 'grpid',
152			                 -values => \@katnames,
153					 -labels => \%katnames,
154					 -size   => 1),
155	          table({-border => 0},
156	                TR(td([submit (-name  => 'insert',
157	                               -value => 'Eintragen'),
158	                       submit (-name  => 'edit',
159	                               -value => 'Ändern'),
160	                       submit (-name  => 'delete',
161	                               -value => 'Löschen')]
162	                    )           
163	                  )
164	                ),
165	          end_form(),hr;
166	
167	}
168	
169	###############################################
170	sub kat {
171	###############################################
172	    # Zeile mit Links zu den einzelnen Kategorien erzeugen
173	    $sql = qq[ SELECT * FROM $Tab_Link_Kat ORDER BY gruppe ];
174	    $sth = $dbh->prepare($sql);
175	    $sth->execute();
176	    
177	    print "<center>|";
178	    while ($row = $sth->fetchrow_arrayref) {
179	        print b(" "),
180	              a({href => "#".$row->[1]},$row->[1]),
181	              b(" |");
182	        $kat{"$row->[1]"} = $row->[0];
183			$katnames{"$row->[0]"} = $row->[1];
184	    }
185	    print b(" "),a({href => $kadminurl}, 
               'Kategorien verwalten'),b(" |");
186	    print b(" "),a({href => $linkurl}, 'Links anzeigen'),b(" |");
187	    print "</center>",hr;
188	    $sth->finish;
189	}
190	
191	###############################################
192	sub links {
193	###############################################
194	my $kategorie = undef;
195	    foreach $kategorie (sort(keys %kat)) {
196	      # Überschrift und Anker
197	      print "<blockquote>\n",a({name => $kategorie}),
                  h3($kategorie),"\n";
198	      # passende Einträge holen und ausgeben
199	      $sql = qq[ SELECT url, name, stamp, linkid, grpid FROM $Tab_Links
200	                 WHERE grpid = '$kat{$kategorie}' ORDER by name];
201	      $sth = $dbh->prepare($sql);
202	      $sth->execute();
203	      while ($row = $sth->fetchrow_hashref) {
204	          print a({href => url()."?url=".uri_escape($row->{'url'}).
205		       "&name=".uri_escape($row->{'name'}).
206			 "&nr=".uri_escape($row->{'linkid'}).
207			  "&grpid=".uri_escape($row->{'grpid'})},
208	                   $row->{'name'})," ",$row->{'stamp'},br,"\n";
209	      }
210	      print "</blockquote>\n",hr,"\n";
211	    }
212	    $sth->finish;
213	}
    

Zurück zum Anfang dieses Projekts.