Mehrere Seiten in einer Datei
Dominique
- cgi
Hallo!
Ich habe schon oft im Web gesehen, dass bestimmte Anbieter (z.B. Microsoft) Seiten erstellen, die ungefähr so lauten:
gameslist.cgi?view=1
Daher meine Frage: Wie kann ich eine CGI-Datei so erstellen, dass durch den Beispielsparameter ?view=1 z.B. mein Text über Basteln erscheint und das durch ?view=2 mein Text übers Web erscheint u.s.w.?
Könnte mir jemand hier ein Script posten? Das wäre sehr nett.
Gruß
Dominique
Sup!
Hast Du überhaupt schon mal ein CGI programmiert oder sowas?
Nur so 'ne Frage,
Gruesse,
Bio
use Mosche;
Daher meine Frage: Wie kann ich eine CGI-Datei so erstellen, dass durch den Beispielsparameter ?view=1 z.B. mein Text über Basteln erscheint und das durch ?view=2 mein Text übers Web erscheint u.s.w.?
#/usr/bin/perl -w
use strict;
use CGI qw(:standard);
print header();
if (param('view') == 1) {
print "deine seite übers basteln";
} else {
print "deine seite übers web";
}
Was war daran jetzt so schwer, dass man es nicht hätte selber lösen können?
use Tschoe qw(Matti);
Hallo Matti,
schade, ich kann immer noch kein Perl. Somit ist für mich alles schwer, was damit zu tun hat. Aber vielleicht könntest Dun uns ja einen Einstieg geben :-)). Dieses Beispiel sieht mir so aus, als wäre es dafür geeignet.
Daher meine Frage: Wie kann ich eine CGI-Datei so erstellen, dass durch den Beispielsparameter ?view=1 z.B. mein Text über Basteln erscheint und das durch ?view=2 mein Text übers Web erscheint u.s.w.?
Ich habe die Frage so verstanden, dass die HTML-Seiten bereits fertig sind, und nun, je nach Parameter, ausgeliefert werden sollen. Also wohl SSI mit Perl, das wär's doch. Kannst Du uns das bitte auch nochmal zeigen?
Und noch zwei drei Bitten. Mach doch wirklich "Mattis Perlkurs" auf. Ich werde ihn aufmerksam verfolgen.
#/usr/bin/perl -w
Was macht diese Zeile?
use strict;
Was heißt das?
use CGI qw(:standard);
Und jetzt blicke ich gar nicht mehr durch
print header();
da kann ich mir noch was vorstellen. Ausgabe des HTML-Headers an die Standardausgabe (wieso ist das jetzt der Browser?) Nur wer hat den Header definiert?
if (param('view') == 1) {
klare Kiste, wer if nicht kennt, darf hier ja keine Fragen stellen
print "deine seite übers basteln";
} else {
print "deine seite übers web";
}
Was war daran jetzt so schwer, dass man es nicht hätte selber lösen können?
Na fast Alles, wie du oben unschwer erkennen kannst.
Und nochmal zum Abschluß meine Anregung: Mach hier doch mal einen Einführungskursus in Perl. Einfach so Schritt für Schritt neue Statements und Vorgehensweisen vorstellen. Wir werden Dich schon löchern. Und hinterher suchen wir alle Threads zum Thema zusammen und machen SelfPERL draus.
Wer hat Interesse? Bitte bei matti hier im Thread anmelden.
Grüße aus http://www.braunsachweig.de
Tom
[der Ungläubige, der jede Doku selber fälschen muss, bevor es KLICK macht]
use Mosche;
Daher meine Frage: Wie kann ich eine CGI-Datei so erstellen, dass durch den Beispielsparameter ?view=1 z.B. mein Text über Basteln erscheint und das durch ?view=2 mein Text übers Web erscheint u.s.w.?
Ich habe die Frage so verstanden, dass die HTML-Seiten bereits fertig sind, und nun, je nach Parameter, ausgeliefert werden sollen. Also wohl SSI mit Perl, das wär's doch. Kannst Du uns das bitte auch nochmal zeigen?
Das ist nicht ganz so einfach. Da wären mehrere Möglichkeiten.
a) eine SSI-Seite, die ungefähr so aufgebaut ist:
<Doctype ...>
<html>
<head>
...
</head>
<body>
<!--#include file="$QUERY_STRING" -->
</body>
</html>
#######################
aufgerufen wird das ganze so:
index.shtml?seite_die_angezeigt_werden_soll.txt
(kann auch .html sein oder so).
Wichtig bei diesem Beispiel wäre es, dass der Dateikopf (und Menu, ...) alles global definiert wird. Was auch nicht geht, ist das ganze über einen "benannten" Parameter zu erledigen:
index.shtml?file=seite_die_angezeigt_werden_soll.txt # geht mit diesem beispiel _nicht_
b) Zweite Variante wäre über ein CGI-Script:
#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);
print header();
print "<Doctype ...";
if (param('file') && -f param('file')) {
# wenn der Parameter 'file' und die durch
# den Parameter benannte Datei existiert,
# Datei einlesen und anzeigen
my $file = param('file');
# jetzt ggf. in das richtige Verzeichnsi wechseln
# bei CGI-Programmen kann das aktuelle Verzeichnis
# undefiniert sein (manchmal)
chdir('/path/to/your/htdocs/dir');
# datei öffnen
open(FH, "<$file") or die "Kann $file nicht öffnen: $!";
# Datei komplett ausgeben
print <FH>;
# datei schliessen
close(FH);
} else {
print "<h1>Keine Datei verfügbar</h1>";
}
print "</body></html>";
Das kann jetzt so aufgerufen werden:
mein_perl_script.pl?file=/index.html
Diese Variante ist etwas aufwändiger, allerdings im Endeffekt wesentlich flexibler, da Daten im Kopf- und Fußbereich der Seite generiert werden können (SSI enthält ja keine Programmiersprache, deshalb ist das bei der ersten Variante ungleich schwieriger).
######################################
Und noch zwei drei Bitten. Mach doch wirklich "Mattis Perlkurs" auf. Ich werde ihn aufmerksam verfolgen.
Naja, ich werde gerne die Fragen zu Perl beantworten, die ich beantworten kann. Für einen Perlkurs kann ich allerdings nicht genug Perl - da gibt es bessere Cracks als mich (Frank, n.d., ...).
#/usr/bin/perl -w
Was macht diese Zeile?
Es ist die sogenannte Shebang-Zeile, die den Pfad zum Perl-Interpreter enthält. Wenn da zum Beispiel
#!/bin/sh
steht, kann ich ein Shell-Script schreiben (Shell ist die "Kommandoumgebung" bei *ix Systemen (zB Linux)).
use strict;
Was heißt das?
Standardmäßg läßt Perl immer recht viel durchgehen, zB müssen keine Variablen deklariert werden u.ä. Der 'strict' Mode bewirkt strengere Regeln des Perl-Interpreters. Ich habe mir damit einen saubereren STil angewöhnt, bei dem im Allgemeinen weniger Fehler entstehen.
use CGI qw(:standard);
Und jetzt blicke ich gar nicht mehr durch
Perl muss nicht unbedingt als Sprache für CGI-Programme verwendet werden, ursprünglich wurde es für etwas ganz anderes entwickelt. Trotzdem gibt es ein Perl-Modul, mit dem typische Routinen für den Gebrauch in einer CGI-Umgebung bekomme (Ausgabe des Content-Types, Parsen des Query_Strings, ...). Mit qw(:standard) importiere ich die Standard-Routinen. Es gibt aber auch Symbole, mit denen ich zB nur die Routinen für HTML AUsgaben importiere, ... Ohne das importieren des Symbols könnte ich nur im Objektorientierten Modus arbeiten.
print header();
da kann ich mir noch was vorstellen. Ausgabe des HTML-Headers an die Standardausgabe (wieso ist das jetzt der Browser?) Nur wer hat den Header definiert?
Standardmäßig ist der Header 'text/html'. header() ist im Übrigen eine Routine des CGI-Moduls. Streng genommen müsste ich eigentlich
print header(-type => 'text/html');
schreiben, das spare ich mir hier aber.
use Tschoe qw(Matti);