Style?
Stefan
- cgi
Hallo zusammen,
in der cgi-Datei kann man durch print auch html-Datei aufbauen, z.B.
print "<html><head><title>CGI-Feedback</title></head>\n";
Ist es auch möglich darüber auf eine zentrale css-Datei zu verweisen oder muss man alle Formatierungen immer vor Ort mitgeben?
Vielen Dank
Stefan
Mit CGI, sei es nun mit Perl- oder mit PHP-CGI erstelltst Du eine komplett neue Datei. Da der Browser des Nutzers nicht weiß, ob die Datei dynamisch estellt wurde oder von jemandem eingetippt wurde, ist es ihm auch egal, von wem die CSS-Datei eingebunden wurde! Er wird sie immer akzeptieren.
Heiner
Und wie würde dann das Coding dafür aussehen? Oder ist dann dort immer noch ein Fehler drin?
print "<html><head><link rel=stylesheet type="text/css" href="../style.css\n"></head>\n";
Hola,
Und wie würde dann das Coding dafür aussehen? Oder ist dann dort immer noch ein Fehler drin?
print "<html><head><link rel=stylesheet type="text/css" href="../style.css\n"></head>\n";
Wozu ein \n nach style.css?
Wieso machst du es überhaupt so kompliziert, wenn du keine Variablen verwendest?
print q~<html><head><link rel="stylesheet" type="text/css" href="../style.css"></head>
~;
oder
print '<html><head><link rel="stylesheet" type="text/css" href="../style.css"></head>',"\n";
$xNeTworKx.
Hm, irgendwie bekomme ich dann einen Abbruch.
Hier einfach einmal das komplette Coding:
#!/usr/bin/perl
if($ENV{'REQUEST_METHOD'} eq "GET")
{
$in = $ENV{'QUERY_STRING'};
}
elsif($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
}
@pairs = split(/&/, $in);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/|/-/;
$value =~ s/&&/&/;
$value =~ s/§§/-/;
$value =~ s/§/-/;
$in{$name} = $value;
}
print "Content-type: text/html\n\n";
$username = "$in{'user'}";
$passwort = "$in{'pass'}";
open (PASS, "$username.pass") || die print "<p>Dieser Nick ist nicht vorhanden.</p>\n";
$correctpass = <PASS>;
close(PASS);
if ($passwort eq $correctpass) {
&passwortrichtig;
}
else {
&badpass;
}
sub passwortrichtig {
print "<SCRIPT LANGUAGE='JavaScript'>
<!--
var tipWin = null;
function opentip()
{
str="profile.cgi?MyName=$username&pass=$passwort";
tipWin = window.open(str,'tipWin','width=300,height=350,resizeable=no,scrollbars=no');
window.open(str,'tipWin','width=300,height=350');
tipWin.opener = self;
}
//-->
</SCRIPT>";
print "<font size="3" color="#FFCC66" face="Tahoma">";
print "<body bgcolor="#006666">";
print "<meta http-equiv="refresh" content="10;URL=whoisonline.cgi?user=$username&pass=$passwort">";
print "<br><b>Einstellungen:</b><br><br>";
print "<a href="javascript:opentip()" style="text-decoration: none"><font size="2" color="#FF8C00"><b>Profil editieren</b></a></font><br><br>";
print "<b>Wer ist Online?<br><br></b>";
open(USERDATA,"whoisonline.dat");
@user=<USERDATA>;
close(USERDATA);
foreach $user_online(@user)
{
print "<a href="viewprofile.cgi?user=$user_online" style="text-decoration: none" target="_blank"><font size="2" color="#FF8C00"><b>$user_online</b></a><br>\n";
}
}
z.B. soll bei dieser Zeile aus dem <b> das vorbelegte Format <h2> genommen werden:
print "<br><b>Einstellungen:</b><br><br>";
Irgendwie bekomme ich es nicht hin, die css-Datei einzubinden :-(.
Bis denn
Stefan
Grüß Dich,
Dein Script ist unübersichtlich und der generierte HTML-Code ungültig.
print "<font size="3" color="#FFCC66" face="Tahoma">";
print "<body bgcolor="#006666">";
print "<meta http-equiv="refresh"
Informieren Dich bitte in SelfHTML über den Aufbau einer HTML-Datei...
MfG
Dein Script ist unübersichtlich und der generierte HTML-Code ungültig.
print "<font size="3" color="#FFCC66" face="Tahoma">";
print "<body bgcolor="#006666">";
print "<meta http-equiv="refresh"Informieren Dich bitte in SelfHTML über den Aufbau einer HTML-Datei...
Hm, den Aufbau kenne ich eigentlich schon.
Das Skript ist auch nicht von mir, sondern habe ich bekommen und will es nun noch anpassen.
Aber die Tags stimmen so schon, läuft jedenfalls *g*, bekomme nur den Style-Sheet nicht hin :-(.
#!/usr/bin/perl
use CGI; $cgi = new CGI; print $cgi->header;
$username = $cgi->param('user');
$passwort = $cgi->param('pass');
open (PASS, "$username.pass") || die print qq~<p>Dieser Nick ist nicht vorhanden.</p>\n~;
my $correctpass = <PASS>;
close(PASS);
if ($passwort eq $correctpass) {
&goodpass;
}
else {
&badpass;
}
sub goodpass
{
open(USERDATA, "whoisonline.dat") || die print "<p>Die Liste der Online-User ist nicht vorhanden.</p>\n";);
my @users=<USERDATA>;
close(USERDATA);
my $USERS_ONLINE = "";
foreach $user_online(@users)
{
USERS_ONLINE .= qq~<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n~;
}
print qq~<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<meta http-equiv="refresh" content="10;URL=whoisonline.cgi?user=$username&pass=$passwort">
<link href="styles.css" rel="stylesheet" type="text/css">
<script language="JavaScript">
<!--
var tipWin = null;
function opentip()
{
str = "profile.cgi?MyName=$username&pass=$passwort";
tipWin = window.open(str,"tipWin", "width=300, height=350, resizeable=no, scrollbars=no");
window.open (str, "tipWin", "width=300, height=350");
tipWin.opener = self;
}
//-->
</script>
</head>
<body>
<h2>Einstellungen:</h2>
<a href="javascript:opentip()">Profil editieren</a><br>
<br>
Wer ist Online?<br>
<br>
<!-- Ausgabe Usernamen -->
$USERS_ONLINE
<!-- /Ausgabe Usernamen -->
</body>
</html>
in styles.css zum Beispiel:
body {
background-color: #006666;
color: #ff8c00;
}
body, h2, a {
font-family: tahoma, arial, helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
}
h2 {
font-size: 14px;
color: #ffcc66;
}
a {
font-weight: normal;
text-decoration: none;
}
P.S.: DIESER CODE WURDE AUF DIE SCHNELLE ZUSAMMENGEHACKT UND NICHT GETESTET! DAHER KEINE HAFTUNG FÜR LOGISCHE, SYNTAKTISCHE ODER TIPPFEHLER !!!
;)
Ups, da ist ja nichts mehr so geblieben, wie es einmal war.
Leider sagt mir das meiste vom Coding halt nichts, aber was meinst Du mit der unverschlüsselten Datei?
Wenn das wirklich so funktioniert, von wegen den Inhalt für den zu erstellenden html-Inhalt, wäre das mal genial, weil das kann ich dann vielleicht ein wenig *g*.
was meinst Du mit der unverschlüsselten Datei?
Na wenn der Webserver auf dem die Seite läuft, bei nicht vorhandenen Dateien (z.B. blabla.html) das sog. "Verzeichnis-Browsing" aktiviert, dann werden alle möglichen Dateien sichtbar. Mit etwas Verstand kann dann jeder die Paßwörter herausfinden, wenn man die entsprechende Datei anklickt, weil sich dann ein Download-Fenster öffnet...
Umgehen kann man das durch entsprechende Eintragungen in der Datei .htaccess (Google und Forum informieren).
MfG
Dann werde ich mich da mal erkundigen, soweit ich weiss, funktioniert das aber auch bei meinem Server.
</html>
ersetzen durch <html>~;
Sorry, meine natürlich </html>~;
Leider bekomme ich keine html-Seite angezeigt :-( und folgende Meldung:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, root@jupiter.net-4-all.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
---------------------------------------------------------------------
Apache/1.3.27 Server at www.stanload.de Port 80
Die Rechte habe ich auch auf 755 gesetzt.
Hi,
Leider bekomme ich keine html-Seite angezeigt :-( und folgende Meldung:
Beginne dein Script mit:
#!/usr/bin/perl -w
use strict;
use warnings;
Dann lasse es noch mal laufen und schau dir die Fehlermeldung genau an, vielleicht hilft dir auch ein Blick in die error.log-Datei.
Viele Grüße
Torsten
Hi,
huch, zu schnell gewesen:
Beginne dein Script mit:
#!/usr/bin/perl -w
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
Viele Grüße
Torsten
So, hab nun geklappt, aber sagen tut es mir nichts :-(:
Software error:
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 6.
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 6.
Global symbol "$username" requires explicit package name at whoisonline.cgi line 8.
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 8.
Global symbol "$passwort" requires explicit package name at whoisonline.cgi line 9.
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 9.
Global symbol "$username" requires explicit package name at whoisonline.cgi line 12.
Global symbol "$passwort" requires explicit package name at whoisonline.cgi line 15.
syntax error at whoisonline.cgi line 24, near ";)"
Execution of whoisonline.cgi aborted due to compilation errors.
Hi,
Software error:
[...]
Ändere den Einstieg wie folgt:
use CGI;
my $cgi = new CGI;
print $cgi->header;
my $username = $cgi->param('user');
my $passwort = $cgi->param('pass');
und lies hier nach, warum: http://www.perldoc.com/perl5.8.0/lib/strict.html
Viele Grüße
Torsten
syntax error at whoisonline.cgi line 26, near ";)"
Execution of whoisonline.cgi aborted due to compilation errors.
Hi,
syntax error at whoisonline.cgi line 26, near ";)"
Na, das ist doch mal eine knackige Fehlermeldung :-)
Ich nehme an, dass Zeile 26 die hier ist:
open(USERDATA, "whoisonline.dat") || die print "<p>[...]</p>\n";);
^^
Das hier ist zuviel.
Viele Grüße
Torsten
Vauxdvihl sagt mir was, hab auch die CD ;)
Außerdem rares Material von Athena, Lanfear, Labyrinth, Moon of Steel, Sieges Even, Enchant, Sylvan, Soul Cages... *gr*
Prog and Rock on!
Danny
Hallöchen!
open(USERDATA, "whoisonline.dat") || die print "<p>[...]</p>\n";);
^^
Das hier ist zuviel.
Bingo, der Fehler ist auch behoben, dafür aber wieder mal was neues *argh*:
Global symbol "$user_online" requires explicit package name at whoisonline.cgi line 30.
Global symbol "$user_online" requires explicit package name at whoisonline.cgi line 32.
Global symbol "$user_online" requires explicit package name at whoisonline.cgi line 32.
Missing right curly or square bracket at whoisonline.cgi line 63, at end of line
(Might be a runaway multi-line ~~ string starting on line 35)
syntax error at whoisonline.cgi line 63, at EOF
Execution of whoisonline.cgi aborted due to compilation errors.
ab Zeile 30:
foreach $user_online(@users)
{
USERS_ONLINE .= qq~<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n~;
}
Zeile 63 wäre dann diese:
</html>~;
Beginne dein Script mit:
#!/usr/bin/perl -w
use strict;
use warnings;Dann lasse es noch mal laufen und schau dir die Fehlermeldung genau an, vielleicht hilft dir auch ein Blick in die error.log-Datei.
Hm, ist genau die selbe Meldung und diese Datei wurde auch nicht erstellt :-(
Vor einem body-Element steht der !DOCTYPE, das font-Element gibt es überhaupt nicht! Konsultiere mal den Validator: http://validator.w3.org/. Da kann man ne Menge lernen!
Heiner
Vor einem body-Element steht der !DOCTYPE, das font-Element gibt es überhaupt nicht! Konsultiere mal den Validator: http://validator.w3.org/. Da kann man ne Menge lernen!
Hm, leider mal wieder auf Englisch :-(.
Ich sag ja, das Coding kommt nicht von mir und daher auch nicht das <font>, habe aber gerade schon was zu dem Element gefunden:
http://selfhtml.teamone.de/html/text/schrift.htm#art_groesse_farbe
Das font-Tag wurde vom W3C als veraltet eingestuft. Und so sollte man es auch behandeln und nur noch davon Gebrauch machen, wenn Uraltbrowser (< 3.0) berücksichtigt werden sollen. Heutzutage sollte man stattdessen CSS verwenden, was auch wesentlich flexibler und modularer ist.
Wie schön, dass ich dann wohl doch schon was moderner bin, denn auf css hab ich vor einiger Zeit umgestellt.
Dieses W3C versteh ich aber leider dennoch nicht, hab schon in ein paar Seiten mal gesehen, dass dort folgendes steht:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
Aber wofür ist das?
Ganz einfach: Es gibt dem Browser Auskunft über den Dokument-Typ, die darauf folgende HTML-Spezifikation, damit er die Tags korrekt interpretieren kann...
Und da kann ich dann einfach das eintragen, was ich gerade geschrieben habe? Oder muss man dann noch was beachten? Oder gibt's da noch Unterschiede?
http://selfhtml.teamone.de/html/allgemein/grundgeruest.htm#dokumenttyp
Danke!
Und wo erfahre ich was für Regeln es da gibt (auf Deutsch)? Kann ich mir dann so Aktionen wie 'ä' ersparen?
Generell wende ich bei solchen Unklarheiten folgende Herangehensweise (mehr oder weniger) an:
Bisher hat mich das fast immer zum Ziel gebracht.
OK, ich glaube Dir ja.
Hätte ja sein können, dass Du mir bei dem Wetter diese Arbeit ersparen hättest können *g*.
Hallo,
http://selfhtml.teamone.de/html/allgemein/grundgeruest.htm#dokumenttyp
Danke!
Und wo erfahre ich was für Regeln es da gibt (auf Deutsch)? Kann ich mir dann so Aktionen wie 'ä' ersparen?
Dass du 8-Bit-Zeichen wie Umlaute als Entity-Referenzen schreiben musst (ä, Ö, ß usw.), hat mit dem Dokumenttyp nichts zu tun, sondern mit der Kodierung zu tun. Wenn du eine entsprechende Kodierung benutzt und dein Editor das Dokument mit eben dieser Kodierung abspeichern kann, spricht nichts dagegen, Umlaute direkt in den Code zu schreiben, ohne Zeichenreferenzen zu benutzen.
Anbieten würde sich die Kodierung ISO-8859-1 (http://selfhtml.teamone.de/inter/zeichensaetze.htm#iso8859_liste). Gewöhnliche Windows-Editoren, bei welchen die Wahl einer Kodierung nicht möglich ist, nutzen (zumindest in deutschsprachigen Versionen, soweit ich weiß) Windows 1252. Diese Kodierung deckt sich teilweise mit ISO-8859-1. Wenn du diese Kodierung verwenden willst, weil dein Lieblingseditor sie standardmäßig verwendet und dir keine Wahl lässt, musst du einiges beachten, damit du das Dokument trotzdem als ISO-8859-1 auszeichnen kannst:
Links ISO-8859-1, rechts Windows-1252 (jeweils nur der 8-Bit-Bereich, die ASCII-Zeichen kommen hinzu):
<img src="http://czyborra.com/charsets/iso8859-1.gif" border="0" alt=""> <img src="http://czyborra.com/charsets/cp1252.gif" border="0" alt="">
Du musst in dem Fall auf die Zeichen 128-159 (Hexwert 80-9F) verzichten, da diese bei ISO-8859-1 nicht mit Zeichen belegt sind (wie man sieht, die Tabelle ist kürzer). Das heißt also, du könntest zwar Umlaute direkt schreiben, musst aber Euro-Zeichen, typographischen Anführungszeichen und Gedankenstriche weiterhin mit Entity-Referenzen oder numerischen Zeichenreferenzen notieren, beispielsweise âº, â, â usw. Dann kannst du das Dokument beispielsweise über eine meta-Angabe http://selfhtml.teamone.de/html/kopfdaten/meta.htm#zeichensatz als ISO-8859-1-kodiert auszeichen.
Wenn dein Editor sowieso ISO-8859-1 oder eine andere passende Kodierung kann, ist dieser Schritt natürlich nicht nötig, dann kannst du jeweils den kompletten Zeichensatz ausschöpfen, ohne die Zeichen umschreiben zu müssen.
Grüße,
Mathias
Hallo Stefan,
Ganz einfach: Es gibt dem Browser Auskunft über den Dokument-Typ, die darauf folgende HTML-Spezifikation, damit er die Tags korrekt interpretieren kann...
Für die »korrekte Interpretation der Tags«, was immer du damit meinst, ist die Dokumenttyp-Deklaration praktisch völlig irrelevant. Sofern die Ressource als text/html geliefert wird, macht der Browser das Beste daraus, und wenn er auch nur ein oder zwei Elemente aus dem HTML-Standard findet, er wird sie als solche umsetzen.
Mathias
Hallo,
das font-Element gibt es überhaupt nicht!
Schön wär's.
Gruß,
MI
das font-Element gibt es überhaupt nicht!
jedenfalls nicht _vor_ dem <body> ;)
OK, nun bekomme ich was *g*:
Software error:
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 6.
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 6.
Global symbol "$username" requires explicit package name at whoisonline.cgi line 8.
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 8.
Global symbol "$passwort" requires explicit package name at whoisonline.cgi line 9.
Global symbol "$cgi" requires explicit package name at whoisonline.cgi line 9.
Global symbol "$username" requires explicit package name at whoisonline.cgi line 12.
Global symbol "$passwort" requires explicit package name at whoisonline.cgi line 15.
syntax error at whoisonline.cgi line 24, near ";)"
Execution of whoisonline.cgi aborted due to compilation errors.
Natürlich sagt mir das nichts.
#!/usr/bin/perl -w
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use vars qw($cgi $username $passwort);
my $cgi = new CGI;
print $cgi->header;
my $username = $cgi->param('user');
my $passwort = $cgi->param('pass');
open (PASS, "$username.pass") || die print qq~<p>Dieser Nick ist nicht vorhanden.</p>\n~;
my $correctpass = <PASS>;
close(PASS);
if ($passwort eq $correctpass) {
&goodpass;
}
else {
&badpass;
}
sub goodpass
{
open(USERDATA, "whoisonline.dat") || die print qq~<p>Die Liste der Online-User ist nicht vorhanden.</p>\n~;
my @users=<USERDATA>;
close(USERDATA);
my $USERS_ONLINE = "";
foreach ( my $user_online(@users) )
{
USERS_ONLINE .= qq~<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n~;
}
print qq~<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<meta http-equiv="refresh" content="10;URL=whoisonline.cgi?user=$username&pass=$passwort">
<link href="styles.css" rel="stylesheet" type="text/css">
<script language="JavaScript">
<!--
var tipWin = null;
function opentip()
{
str = "profile.cgi?MyName=$username&pass=$passwort";
tipWin = window.open(str,"tipWin", "width=300, height=350, resizeable=no, scrollbars=no");
window.open (str, "tipWin", "width=300, height=350");
tipWin.opener = self;
}
//-->
</script>
</head>
<body>
<h2>Einstellungen:</h2>
<a href="javascript:opentip()">Profil editieren</a><br>
<br>
Wer ist Online?<br>
<br>
<!-- Ausgabe Usernamen -->
$USERS_ONLINE
<!-- /Ausgabe Usernamen -->
</body>
</html>~;