Stefan: Style?

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

  1. 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

    1. 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";

      1. 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.

        --
        Mit Computern lösen wir Probleme, die wir ohne sie gar nicht hätten.
        1. 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

          1. 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

            1. 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 :-(.

              1. #!/usr/bin/perl

                use CGI; $cgi = new CGI; print $cgi->header;

                $username = $cgi->param('user');
                $passwort = $cgi->param('pass');

                Das ist so nicht wirklich sicher, weil unverschlüsselte Datei

                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 !!!

                ;)

                1. 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*.

                  1. 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

                    1. Dann werde ich mich da mal erkundigen, soweit ich weiss, funktioniert das aber auch bei meinem Server.

                2. </html>

                  ersetzen durch <html>~;

                  1. Sorry, meine natürlich </html>~;

                    1. 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.

                      1. 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

                        1. 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

                          1. 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.

                            1. 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

                              1. syntax error at whoisonline.cgi line 26, near ";)"
                                Execution of whoisonline.cgi aborted due to compilation errors.

                                1. 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

                                  1. 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

                                  2. 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>~;

                        2. 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 :-(

              2. 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

                1. 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

                  1. 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.

                    1. 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?

                      1. Ganz einfach: Es gibt dem Browser Auskunft über den Dokument-Typ, die darauf folgende HTML-Spezifikation, damit er die Tags korrekt interpretieren kann...

                        1. 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?

                            1. 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?

                              1. Generell wende ich bei solchen Unklarheiten folgende Herangehensweise (mehr oder weniger) an:

                                • Aufgabenstellung definieren
                                • Aufgabe in Teilaufgaben zerlegen
                                • Begriffe sammeln
                                • Suchmaschinen befragen
                                • Auswerten der Ergebnisse
                                • evtl. Konkretisieren der Suche
                                • Auswerten der Ergebnisse
                                • Speichern brauchbarer Ergebnisse
                                • Teilaufgabe umsetzen

                                Bisher hat mich das fast immer zum Ziel gebracht.

                                1. 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*.

                              2. 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 (ä, &Ouml;, ß 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

                                --
                                Ich bin ein verruchter, skrupelloser Datenpirat, denn ich lese nicht gemeinfreie Warezlyrik auf Webseiten, welche kein Nutzungsrecht haben.
                        2. 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

                          --
                          Ich bin ein verruchter, skrupelloser Datenpirat, denn ich lese nicht gemeinfreie Warezlyrik auf Webseiten, welche kein Nutzungsrecht haben.
                2. Hallo,

                  das font-Element gibt es überhaupt nicht!

                  Schön wär's.

                  Gruß,

                  MI

                  --
                  XFrames Working Draft (Deutsche Übersetzung) : http://jendryschik.de/TR/xframes/
                  Die Wissensgesellschaft : http://jendryschik.de/michael/inf/wissensgesellschaft/
                  Einführung in XHTML, CSS und Webdesign: http://jendryschik.de/wsdev/einfuehrung/
                  Feste Positionierung, richtig angewandt : http://jendryschik.de/wsdev/css/fixed/
                  sh:( fo:) rl:( br:& br:] ' n4:& | n4:? ' ie:| va:) de:] zu:) fl:{ ss:| ls:& js:|
                  1. das font-Element gibt es überhaupt nicht!

                    jedenfalls nicht _vor_ dem <body> ;)

  2. 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.

  3. #!/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>~;