JCB: Hexerei oder wie oder was??

Hallöchen!

Ich hab mir in Perl einen kleinen einfachen Chat geschrieben. Der läuft auch soweit ganz gut. Ich hab ein Messagefenster und ein Fenster mit einem Formular, in dem man Nachricht, Schriftart, Schriftgröße und die Formatierung (fett,kursiv,unterstrichen) wählen kann. Diese Einstellungen sollen natürlich übernommen werden, damit man nicht für jede Nachricht alles neu anklicken muß. Bei der Schriftart/-größe klappt das. Nur bei der Formatierung tritt ein seltsamer Fehler auf. Wenn fett angewählt ist, wird dies übernommen (wenn kursiv und unterstrichen noch zusätzlich angewählt sind auch). Wenn ich aber nur kursiv, nur unterstrichen oder nur kursiv und unterstichen anwähle, verschwindet das beim absenden wieder. Kreuz ich wieder fett an, wird fett auch wieder übernommen.

Hier der Code, mit dem die Formulardaten weiterverarbeitet werden:

-------------------- schnipp-------------------------

if($ENV{'REQUEST_METHOD'} eq 'GET')
 {
  $Daten = $ENV{'QUERY_STRING'}
 }
else
 {
  read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
 }

@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
  ($name, $value) = split(/=/, $Feld);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/<!--(.|\n)*-->//g;
  $Formular[$i] = $name;
  $i = $i + 1;
  $Formular[$i] = $value;
  $i = $i + 1;
}

-------------------- schnapp-------------------------

Und hier der Abschnitt mit dem Code, der die Formatierung im Formular regelt:

-------------------- schnipp-------------------------

print "      <input type=checkbox ";
if ($Formular[9] eq 'fett')
{
  print "checked ";
}

print "name=schriftformat1 value=fett><b>fett</b>\n";

print "      <input type=checkbox ";
if ($Formular[11] eq 'kursiv')
{
  print "checked ";
}

print "name=schriftformat2 value=kursiv><i>kursiv</i>\n";
print "      <input type=checkbox ";
if ($Formular[13] eq 'unterstrichen')
{
  print "checked ";
}

print "name=schriftformat3 value=unterstrichen><u>unterstrichen</u>\n";

-------------------- schnapp-------------------------

Ich kann mir da ehrlich gesagt keinen Reim drauf machen. Aber vielleicht weiß einer von Euch, wo der Fehler liegen könnte.

Gruß, Jan.
www.Planet-1.de

  1. Du checks nur das erste checkboxFeld und wenn das angekreuzt ist die weiteren...

    Hallöchen!

    Ich hab mir in Perl einen kleinen einfachen Chat geschrieben. Der läuft auch soweit ganz gut. Ich hab ein Messagefenster und ein Fenster mit einem Formular, in dem man Nachricht, Schriftart, Schriftgröße und die Formatierung (fett,kursiv,unterstrichen) wählen kann. Diese Einstellungen sollen natürlich übernommen werden, damit man nicht für jede Nachricht alles neu anklicken muß. Bei der Schriftart/-größe klappt das. Nur bei der Formatierung tritt ein seltsamer Fehler auf. Wenn fett angewählt ist, wird dies übernommen (wenn kursiv und unterstrichen noch zusätzlich angewählt sind auch). Wenn ich aber nur kursiv, nur unterstrichen oder nur kursiv und unterstichen anwähle, verschwindet das beim absenden wieder. Kreuz ich wieder fett an, wird fett auch wieder übernommen.

    Hier der Code, mit dem die Formulardaten weiterverarbeitet werden:

    -------------------- schnipp-------------------------

    if($ENV{'REQUEST_METHOD'} eq 'GET')
    {
      $Daten = $ENV{'QUERY_STRING'}
    }
    else
    {
      read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
    }

    @Formularfelder = split(/&/, $Daten);
    foreach $Feld (@Formularfelder)
    {
      ($name, $value) = split(/=/, $Feld);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $value =~ s/<!--(.|\n)*-->//g;
      $Formular[$i] = $name;
      $i = $i + 1;
      $Formular[$i] = $value;
      $i = $i + 1;
    }

    -------------------- schnapp-------------------------

    Und hier der Abschnitt mit dem Code, der die Formatierung im Formular regelt:

    -------------------- schnipp-------------------------

    print "      <input type=checkbox ";
    if ($Formular[9] eq 'fett')
    {
      print "checked ";
    }

    print "name=schriftformat1 value=fett><b>fett</b>\n";

    print "      <input type=checkbox ";
    if ($Formular[11] eq 'kursiv')
    {
      print "checked ";
    }

    print "name=schriftformat2 value=kursiv><i>kursiv</i>\n";
    print "      <input type=checkbox ";
    if ($Formular[13] eq 'unterstrichen')
    {
      print "checked ";
    }

    print "name=schriftformat3 value=unterstrichen><u>unterstrichen</u>\n";

    -------------------- schnapp-------------------------

    Ich kann mir da ehrlich gesagt keinen Reim drauf machen. Aber vielleicht weiß einer von Euch, wo der Fehler liegen könnte.

    Gruß, Jan.
    www.Planet-1.de

    1. Du checks nur das erste checkboxFeld und wenn das angekreuzt ist die weiteren...

      Wieso checke ich nur das 1. checkboxfeld? Versteh ich irgendwie nich. Wo hat dennn die 1. Abfrage was mit den anderen zu tun?

      Gruß, Jan
      www.Planet-1.de

  2. Hallo,

    Ich schätze, dein Problem liegt in der Art und weise, wie Du die Parameter auswertest. Wenn nämlich eine Checkbox nicht ausgwählt wird, wird der Parameter nicht mitübertragen.
    Jetzt gehst Du aber davon aus, daß die _alle_ Formularfelder wieder in der gleichen Reihenfolge übertragen werden, wie die im Formular stehen.

    [...]

    @Formularfelder = split(/&/, $Daten);
    foreach $Feld (@Formularfelder)
    {

    [...]

    $Formular[$i] = $name;
      $i = $i + 1;
      $Formular[$i] = $value;
      $i = $i + 1;
    }

    Abgesehen davon, daß es besser wäre mit CGI.pm zu arbeiten, solltest Du, wenn schon 'per Hand' ausgewertet, die Werte nicht in ein Array sonder in ein Hash schreiben.

    my @Formularfelder = split(/&/, $Daten);
    my %Formular, $Feld;
    foreach $Feld (@Formularfelder)
      {
      my ($name, $value) = split(/=/, $Feld);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $value =~ s/<!--(.|\n)*-->//g;
      $Formular{$name} = $value;
      }

    Und weiter unten kannst Du die Ausgabe so umschreiben:

    print '      <input type="checkbox" ';
    print 'checked ' if $Formular{'schriftformat1'};
    print qq!name="schriftformat1" value="fett"><b>fett</b>\n!;

    print '      <input type="checkbox" ';
    print 'checked ' if $Formular{'schriftformat2'};
    print qq!name="schriftformat1" value="kursiv"><b>kursiv</b>\n!;

    print '      <input type="checkbox" ';
    print 'checked ' if $Formular{'schriftformat3'};
    print qq!name="schriftformat3" value="unterstrichen"><b>unterstrichen</b>\n!;

    Wenn Du dann noch die Bezeichner und Werte der Checkbox etwas modifizierst, dann kann das so aussehen:

    print qq!<input type="checkbox" $Formular{'fett'}name="fett" value="checked"><b>fett</b>\n!;
    print qq!<input type="checkbox" $Formular{'fett'}name="kursiv" value="checked"><b>kursiv</b>\n!;
    print qq!<input type="checkbox" $Formular{'fett'}name="unterstrichen" value="checked"><b>unterstrichen</b>\n!;

    Solltest Du auf CGI.pm umsteigen, schaut das dann, unter BErücksichtigung Deiner Vorgabe, so aus:

    use CGI;
    my $query = new CGI;

    #hier irgenwelcher Code

    print print $query->checkbox(-name=>'schriftformat1',
                                 -label=>'fett');
    print print $query->checkbox(-name=>'schriftformat2',
                                 -label=>'kursiv');
    print print $query->checkbox(-name=>'schriftformat3',
                                 -label=>'unterstrichen');

    oder aber (mit meiner Namensgebung)

    use CGI;
    my $query = new CGI;

    #hier irgenwelcher Code
    print print $query->checkbox(-name=>'fett');
    print print $query->checkbox(-name=>'kursiv');
    print print $query->checkbox(-name=>'unterstrichen');

    Und im restlichen Programm fagst Du die einzelnen Checkboxen vielleicht mit

    &das_will_der_aber_fett if($query_param('fett'));

    ab.

    Das Leben kann so einfach sein;-)

    Grüße
      Klaus

    1. Klaus, besten Dank! :o)

      Gruß, Jan.
      www.Planet-1.de

  3. print "      <input type=checkbox ";
    if ($Formular[11] eq 'kursiv')
    {
      print "checked ";
    }

    wie wäre es hier mit nem print ">" ?

    print "name=schriftformat2 value=kursiv><i>kursiv</i>\n";
    print "      <input type=checkbox ";
    if ($Formular[13] eq 'unterstrichen')
    {
      print "checked ";
    }

    1. print "      <input type=checkbox ";
      if ($Formular[11] eq 'kursiv')
      {
        print "checked ";
      }

      wie wäre es hier mit nem print ">" ?

      print "name=schriftformat2 value=kursiv><i>kursiv</i>\n";
      print "      <input type=checkbox ";   ^
      if ($Formular[13] eq 'unterstrichen')  |
      {                                      |
        print "checked ";                    |
      }                                      |

      |
      Wieso? Das steht doch da --------------------|   :). Ich brech die zeile ja nich um :).

      Gruß, Jan.
      www.planet-1.de