alex: wordwrap oder aehnliche Funktion

Hallo!
Ich habe da ein Problem, und zwar wollte ich, dass bei der Ausgabe von Eintraegen jede Zeile auf 34 Zeichen beschraenkt wird.
Ich habe versucht wordwrap in meinen Script einzubauen, das hat aber nicht geklappt, jedesmal kam da so ein komischer Fehler raus , sehen sie selbst (erster Eintrag) :

http://mitglied.lycos.de/pandaemonium/gaestebuch/eintragen.php4

Wenn man "wordwrap" hier nicht benutzen kann, welche Funktion kann ich dann nehmen?

Hier mein ganzer Script ("wordwrap" habe ich bereits ausgebaut):

________________________________________________
<html>

<style type="text/css">
<!--
.author {  font-size: 10px; font-weight: bold; color: #FFFFFF}
.eintr { color: #DDDDDD }
.text { font-size: 12px }
-->
</style>

<body bgcolor="#FFFFFF">

<font face="Verdana" size="1,5">
<p><span style="font-size:16pt;"><font face="Comic Sans MS">Mein Gästebuch :</font></span></p>

<?php

$g=file("gaestebuch.txt");

$max=799;  // 1 weniger setzen, weil beim Einlesen, nach loeschen 1 Eintrag zugefuegt wird

$eintraege = count($g);
if($eintraege>$max)
{
 for($q=$max;$q<$eintraege;$q++)
 {
 unset($data[$q]);
 }
}

if (isset($_POST["text"]))
{

if (trim($_POST["text"])=="")
  {
   echo "<b>Du hast kein Text eingegeben !</b><br>";
   echo "Klicke auf den Backbutton deines Browsers";
  }

else
    {

$text=wordwrap($text, 34);
    $d=fopen("gaestebuch.txt","w+");       // Datei zum Anhängen öffnen
     if ($d)                                // Öffnen hat geklappt, $d ist ein Dateizeiger
   {
        $neu= "<table border=350>";
      $neu.= "<tr><td bgcolor=#00CCFF><div class=author>";
      $neu.="Von: ".htmlentities($name);
         $neu.= "</div></td></tr>";

$neu.="<tr><td bgcolor=#F4F4F4><div class=text>";
      $neu.=strtr(nl2br(htmlentities(trim($text))."<br>"),"\n\r"," ");
         $neu.="</div></td></tr></table><br><br>";
      $neu.="\n"; //Ablschluss

fputs($d,$neu); // neuen Eintrag speichern
      for ($i=0;$i<$max;$i++) // alte Einträge speichern
        {
         fputs($d,$g[$i]);
        }
       fclose($d);

array_unshift($g,$neu); // neuen Eintrag für den noch folgenden
                               // Code in $g einfügen
  }

}
}

// Auch im Weiteren gaestebuch.txt _nicht_ laden, die aktuellen
  // Daten stehen allesamt korrekt in $g.

$g=file("gaestebuch.txt"); //Auslesen

if ((! isset($_GET["start"])) || (! is_numeric($_GET["start"])))
   $start=0; // URL-Variable start ist nicht angegeben oder keine Zahl, Standardwert einsetzen
 else
   $start=$_GET["start"]; // URL-Variable start ist brauchbar, Wert übernehmen

if ((! isset($_GET["$eintraege_pro_seite"])) || (! is_numeric($_GET["$eintraege_pro_seite"])))
   $eintraege_pro_seite=10; // URL-Variable start ist nicht angegeben oder keine Zahl, Standardwert einsetzen
 else
   $eintraege_pro_seite=$_GET["$eintraege_pro_seite"]; // URL-Variable start ist brauchbar, Wert übernehmen

for ($i=$start;$i<$start+$eintraege_pro_seite;$i++)
   {
    if (isset($g[$i])) // existiert überhaupt etwas an $g[$i]?
      {
       $z=$i+1;
       echo "<center><div class=eintr>Eintrag $z.</div>$g[$i]";    // ja, eintrag ausgeben
       echo "\n";      // kosmetik, ein bißchen luft tut immer gut
      }
   }

if ($start !=0)

{
     echo "<a href="eintragen.php?";
     echo "start=".($start-$eintraege_pro_seite);
     echo "&eintraege_pro_seite=".$eintraege_pro_seite;
     echo ""><center>zurück</a>";
    }

else
    {
     echo "<center>zurück ";
    }

if ($start+$eintraege_pro_seite<sizeof($g))
    {
     echo "<a href="eintragen.php?";
     echo "start=".($start+$eintraege_pro_seite);
     echo "&eintraege_pro_seite=".$eintraege_pro_seite;
     echo ""><center>Weiter</a>";
    }
else
    {
     echo "<center>weiter";
    }

echo "<br><br><center>$eintraege Einträge";
?>

<font face="Verdana" size="2">
<h1><p><center>Eintragen in mein Gästebuch</h1><br>

<form action="eintragen.php" method="post">

Dein Name: <center><input type="text" name="name" size="24"><br>
<br>

Dein Eintrag:<br>

<center><textarea name="text" cols="35" rows="5"></textarea><br>
<input type="submit" value="Abschicken">

</form>
</font>
</body>

</html>

  1. Moin!

    Ich habe da ein Problem, und zwar wollte ich, dass bei der Ausgabe von Eintraegen jede Zeile auf 34 Zeichen beschraenkt wird.
    Ich habe versucht wordwrap in meinen Script einzubauen, das hat aber nicht geklappt, jedesmal kam da so ein komischer Fehler raus , sehen sie selbst (erster Eintrag) :

    http://mitglied.lycos.de/pandaemonium/gaestebuch/eintragen.php4

    Wenn man "wordwrap" hier nicht benutzen kann, welche Funktion kann ich dann nehmen?

    Hier mein ganzer Script ("wordwrap" habe ich bereits ausgebaut):

    In deiner Frage machst du zwei Fehler:

    1. Du sagst nicht, _welcher_ Fehler kommt. Viele Leute können schon anhand der Fehlermeldung sehen, was falsch ist. Fehlermeldungen sind dein Freund, und niemals "komisch". :)

    2. Du hast das, was du eigentlich zum Laufen kriegen willst, schon wieder ausgebaut (jedenfalls sagst du das, obwohl ich eine wordwrap()-Funktion im Quelltext gefunden habe.

    Außerdem: Auf der angegebenen Seite wird man erstens nicht fündig (da ist nur absolutes Designchaos - und die extrem nervige Lycos-Werbung), und zweitens steht da kein Fehler im ersten Eintrag.

    Immerhin hast du Quelltext angegeben - aber auch hier ist weniger oft mehr, denn du hättest dich ja auf den relevanten Teil beschränken können.

    - Sven Rautenberg

    1. Sooo, wo soll ich denn anfangen.

      1. Du sagst nicht, _welcher_ Fehler kommt. Viele Leute können schon anhand der Fehlermeldung sehen, was falsch ist. Fehlermeldungen sind dein Freund, und niemals "komisch". :)

      Aber da ist ueberhaupt keine fehlermeldung, das ist das ja !
      Der Eintrag wird nur in einem Ying-Yang aehnlchem riesigem Quader ausgegeben. Das war so nicht vorgesehn !
      Ich habe ausserdem in der Datei nachgesehn, wo die Eintraege gespeichert werden (gaestebuch.txt) und ich glaube, dass ein Eintrag, der zu lang ist in 2 Eintraege gespalten wird, wenn ich wordwrap einbaue.

      1. Du hast das, was du eigentlich zum Laufen kriegen willst, schon wieder ausgebaut (jedenfalls sagst du das, obwohl ich eine wordwrap()-Funktion im Quelltext gefunden habe.

      Genau, ich hatte aus Verzweifelung :)  wordwrap an mehreren Stellen eingebaut, und an einer habe ichs vergessen .

      Außerdem: Auf der angegebenen Seite wird man erstens nicht fündig (da ist nur absolutes Designchaos - und die extrem nervige Lycos-Werbung), und zweitens steht da kein Fehler im ersten Eintrag.

      Das Desighn Chaos kommt teilweise davon, weil ich probleme mit CSS hatte. Das hat sich aber schon erledigt. Und dass fast alle Tabellen verschiedene groessen haben, das versuche ich ja gerade zu korrigieren.

      Nunja, ich will wenigstens etwas richtig machen, darum fuege ich an dieser Stelle nochmal den Quelltext ein :)

      http://mitglied.lycos.de/pandaemonium/gaestebuch/eintragen.php4
      ___________________________________________________
      <html>

      <style type="text/css">
      <!--
      .author {  font-size: 10px; font-weight: bold; color: #FFFFFF}
      .eintr { color: #DDDDDD }
      .text { font-size: 12px }
      -->
      </style>

      <body bgcolor="#FFFFFF">

      <font face="Verdana" size="1,5">
      <p><span style="font-size:16pt;"><font face="Comic Sans MS">Mein Gästebuch :</font></span></p>

      <?php

      $g=file("gaestebuch.txt");

      $max=799;  // 1 weniger setzen, weil beim Einlesen, nach loeschen 1 Eintrag zugefuegt wird

      $eintraege = count($g);
      if($eintraege>$max)
      {
       for($q=$max;$q<$eintraege;$q++)
       {
       unset($data[$q]);
       }
      }

      if (isset($_POST["text"]))
      {

      if (trim($_POST["text"])=="")
        {
         echo "<b>Du hast kein Text eingegeben !</b><br>";
         echo "Klicke auf den Backbutton deines Browsers";
        }

      else
          {

      $d=fopen("gaestebuch.txt","w+");       // Datei zum Anhängen öffnen
           if ($d)                                // Öffnen hat geklappt, $d ist ein Dateizeiger
         {
              $neu= "<table border=350>";
            $neu.= "<tr><td bgcolor=#00CCFF><div class=author>";
            $neu.="Von: ".htmlentities($name);
               $neu.= "</div></td></tr>";

      $neu.="<tr><td bgcolor=#F4F4F4><div class=text>";
            $neu.=strtr(nl2br(htmlentities(trim($text))."<br>"),"\n\r"," ");
               $neu.="</div></td></tr></table><br><br>";
            $neu.="\n"; //Ablschluss

      fputs($d,$neu); // neuen Eintrag speichern
            for ($i=0;$i<$max;$i++) // alte Einträge speichern
              {
               fputs($d,$g[$i]);
              }
             fclose($d);

      array_unshift($g,$neu); // neuen Eintrag für den noch folgenden
                                     // Code in $g einfügen
        }

      }
      }

      // Auch im Weiteren gaestebuch.txt _nicht_ laden, die aktuellen
        // Daten stehen allesamt korrekt in $g.

      $g=file("gaestebuch.txt"); //Auslesen

      if ((! isset($_GET["start"])) || (! is_numeric($_GET["start"])))
         $start=0; // URL-Variable start ist nicht angegeben oder keine Zahl, Standardwert einsetzen
       else
         $start=$_GET["start"]; // URL-Variable start ist brauchbar, Wert übernehmen

      if ((! isset($_GET["$eintraege_pro_seite"])) || (! is_numeric($_GET["$eintraege_pro_seite"])))
         $eintraege_pro_seite=10; // URL-Variable start ist nicht angegeben oder keine Zahl, Standardwert einsetzen
       else
         $eintraege_pro_seite=$_GET["$eintraege_pro_seite"]; // URL-Variable start ist brauchbar, Wert übernehmen

      for ($i=$start;$i<$start+$eintraege_pro_seite;$i++)
         {
          if (isset($g[$i])) // existiert überhaupt etwas an $g[$i]?
            {
             $z=$i+1;
             echo "<center><div class=eintr>Eintrag $z.</div>$g[$i]";    // ja, eintrag ausgeben
             echo "\n";      // kosmetik, ein bißchen luft tut immer gut
            }
         }

      if ($start !=0)

      {
           echo "<a href="eintragen.php?";
           echo "start=".($start-$eintraege_pro_seite);
           echo "&eintraege_pro_seite=".$eintraege_pro_seite;
           echo ""><center>zurück</a>";
          }

      else
          {
           echo "<center>zurück ";
          }

      if ($start+$eintraege_pro_seite<sizeof($g))
          {
           echo "<a href="eintragen.php?";
           echo "start=".($start+$eintraege_pro_seite);
           echo "&eintraege_pro_seite=".$eintraege_pro_seite;
           echo ""><center>Weiter</a>";
          }
      else
          {
           echo "<center>weiter";
          }

      echo "<br><br><center>$eintraege Einträge";
      ?>

      <font face="Verdana" size="2">
      <h1><p><center>Eintragen in mein Gästebuch</h1><br>

      <form action="eintragen.php" method="post">

      Dein Name: <center><input type="text" name="name" size="24"><br>
      <br>

      Dein Eintrag:<br>

      <center><textarea name="text" cols="35" rows="5"></textarea><br>
      <input type="submit" value="Abschicken">

      </form>
      </font>
      </body>

      </html>

      1. Moin!

        Das Desighn Chaos kommt teilweise davon, weil ich probleme mit CSS hatte. Das hat sich aber schon erledigt. Und dass fast alle Tabellen verschiedene groessen haben, das versuche ich ja gerade zu korrigieren.

        Ich würde nicht sagen, dass sich das erledigt hat.

        Als erstes produziere bitte mal etwas, was man sich wirklich ansehen kann. Benutze den Validator, dein generiertes HTML zu prüfen, und generiere dann valides HTML.

        http://validator.w3.org/check?uri=http%3A%2F%2Fmitglied.lycos.de%2Fpandaemonium%2Fgaestebuch%2Feintragen.php4&charset=(detect+automatically)&doctype=Inline
        Dir fehlt eine DOCTYPE-Angabe und die Angabe des Zeichensatzes.

        Wenn ich mal HTML 4.01 Transitional und ISO-8859-1 annehme, kommt das hier raus:
        http://validator.w3.org/check?uri=http%3A%2F%2Fmitglied.lycos.de%2Fpandaemonium%2Fgaestebuch%2Feintragen.php4&charset=iso-8859-1+(Western+Europe)&doctype=HTML+4.01+Transitional

        Der Einsatz von <center> ist haarsträubend. Lass das Tag gleich ganz weg, es gehört künftig nicht mehr zu HTML! Außerdem hast du ein paar andere, handfeste Schachtelungsprobleme. Außerdem fehlt dir ein <head>-Bereich, in dem die Styledefinitionen dann abgelegt werden können. Allerdings empfehle ich dir, mit CSS solange zu warten, bis dein PHP reibungslos läuft. Schmeiß CSS nochmal solange raus, wie du rumexperimentierst. Und formatier so wenig wie möglich in HTML-Tags rum (deine bgcolor-Angabe kann z.B. später wunderbar mit CSS einheitlich gesetzt werden, wenn du den Zellen jetzt eine Klasse zuweist, diese aber noch nicht, oder nur einfach, formatierst).

        Nunja, ich will wenigstens etwas richtig machen, darum fuege ich an dieser Stelle nochmal den Quelltext ein :)

        Die Beschreibung deines Problems ist aber immer noch nicht ganz klar. Schätzungsweise solltest du wordwrap dort einfügen, wo du die Benutzereingabe in deine Gästebuchdatei einfügst. Danach liest du die dort eingefügten, fertig in HTML formatierten Einträge ja nur noch ein und gibst sie 1:1 aus. Die Einflußmöglichkeiten sind dort geringer.

        - Sven Rautenberg

        1. Mhm,
          habe ich schon erwaehnt, dass das mein erstes PHP Programm ist?
          Ich wollte nur eine eigene Seite machen, und dazu ein Gaestebuch schreiben.
          Selber schreiben, weil ich kein Gaestebuch gefunden habe, das 100% so aussieht, wie ich es wollte.

          Erstmal : Es ist ein Wunder geschehen! Als ich den Schript zum 100stem Mal durchgelesen, ist mir aufgefallen, dass ich bei der Tabelle

          $neu= "<table border=0 width=350>";

          versehentlich =0 width geloescht habe, und es ist geblieben :

          "<table border=350>";

          Du lachst jetzt warscheinlich, aber ich habe wirklich gedacht, es kommt davon ,weil ich wordwrap an falscher Stelle eingebaut habe !
          Diese graue masse um den Eintrag war also nur der 350Pixel grosser Rand !

          Dann, ich habe mir die Sachen auf
          http://validator.w3.org/check?uri=http%3A%2F%2Fmitglied.lycos.de%2Fpandaemonium%2Fgaestebuch%2Feintragen.php4&charset=iso-8859-1+%28Western+Europe%29&doctype=HTML+4.01+Transitional
          durchgelesen.
          Sie sagen mir leider nicht viel. Nunja sie sagen mir schon was, aber warum zB das ">" in
          <body bgcolor="#FFFFFF">
                                 ^
          nicht erlaub ist bleibt fuer mich ein Raetzel.
          Ich bitte dich garnicht, es alles mir zu erklaeren, weil es zu viel arbeit fuer dich waere. ich bin naemlich noch ziemlich am anfang von PHP.

          Ich wollte nur fragen, wie und ob man wordwrap gleich in ein Formular einfuegen kann.

          Dein Eintrag:<br>

          <center><textarea name="text" cols="35" rows="5"></textarea><br>
          <input type="submit" value="Abschicken">

          Ich dachte wenn im Formular automatisch nach dem 35ten zeichen ein <br> gesetzt wird, ist das problem doch geloest?
          Dann wird die Tabellenbreite nicht mehr vergroessert.
          Ich habe versucht wordwrap hoeher einzufuegen, etwa so:

          $text=wordwrap($text,35,"<br>");
          $neu.="<tr><td bgcolor=#F4F4F4><div class=text>";
                $neu.=strtr(nl2br(htmlentities(trim($text))."<br>"),"\n\r"," ");
                   $neu.="</div></td></tr></table><br><br>";
                $neu.="\n"; //Ablschluss

          Das hat aber nicht hingehauen.
          Warum, weiss ich auch nicht.
          Jedenfalls wurde nach dem 35sten Zeichen kein <br> gesetzt.

          1. Mhm,
            habe ich schon erwaehnt, dass das mein erstes PHP Programm ist?
            Ich wollte nur eine eigene Seite machen, und dazu ein Gaestebuch schreiben.
            Selber schreiben, weil ich kein Gaestebuch gefunden habe, das 100% so aussieht, wie ich es wollte.

            Naja, ganz so schlecht ist das bislang ja nicht. Immerhin bist du schon um die Klippe herumgeschifft, dass der Eintragende kein ausführbares Javascript eingeben kann. Das hätte ich nämlich sonst gleich mal eingegeben. Grund dafür ist die Funktion htmlentities(), die alle bösen Zeichen in ungefährliche Entities wandelt.

            Dann, ich habe mir die Sachen auf
            http://validator.w3.org/check?uri=http%3A%2F%2Fmitglied.lycos.de%2Fpandaemonium%2Fgaestebuch%2Feintragen.php4&charset=iso-8859-1+%28Western+Europe%29&doctype=HTML+4.01+Transitional
            durchgelesen.
            Sie sagen mir leider nicht viel. Nunja sie sagen mir schon was, aber warum zB das ">" in
            <body bgcolor="#FFFFFF">
                                   ^
            nicht erlaub ist bleibt fuer mich ein Raetzel.

            Nicht das ">" ist verboten, sondern das ganze <body>-Tag. Und das liegt daran, weil du kein <head> hast!

            Ich bitte dich garnicht, es alles mir zu erklaeren, weil es zu viel arbeit fuer dich waere. ich bin naemlich noch ziemlich am anfang von PHP.

            Gewisse Dinge erklärt der Validator ganz verständlich - beispielsweise müssen Werte, die andere Zeichen als Buchstaben und Zahlen enthalten, immer in Anführungsstriche gesetzt werden - deine Hintergrundfarbangabe wäre davon betroffen. Aber wie ich schon sagte: Mach das _nicht_ als Angabe in HTML, sondern formatiere es mit CSS. Denn wenn du irgendwann einmal auf die Idee kommst, dass dein Gästebuch anders aussehen soll, müßtest du deine gesamte Gästebuchdatei umändern (in der steht die Formatierung ja schon drin). Mit CSS änderst du einfach nur eine Definition in der CSS-Datei, und fertig.

            Ach ja: Wirf <center> komplett raus. :) Dafür gibt es bessere und vor allem erlaubtere Alternativen.

            Ich dachte wenn im Formular automatisch nach dem 35ten zeichen ein <br> gesetzt wird, ist das problem doch geloest?

            Nein, nicht zwingend. Was du verhindern willst ist, dass jemand hintereinander mehr als 35 Zeichen (außer dem Leerzeichen) eingibt und so deine Tabelle sprengt. Du kannst das verhindern, indem du als wordwrap-Trennzeichen einfach ein Leerzeichen angibst - dann bricht der Browser den Text automatisch um.

            $text=wordwrap($text,35,"<br>");

            Das ist zumindest schon mal die richtige Position. Allerdings: Du fügst hier "<br>" als Zeichen ein - die werden aber durch die nachfolgende Funktion htmlentities() in Entities umgewandelt und erscheinen dann als Text im Browser.

            Nimm ein Leerzeichen als einzufügendes Umbruchzeichen, der Browser erledigt den Rest.

            $neu.="<tr><td bgcolor=#F4F4F4><div class=text>";
                  $neu.=strtr(nl2br(htmlentities(trim($text))."<br>"),"\n\r"," ");
                     $neu.="</div></td></tr></table><br><br>";
                  $neu.="\n"; //Ablschluss

            - Sven Rautenberg

            1. Ich weiss nicht ob das stimmt, aber ich glaube das Leerzeichen hier auch ausgeschlossen wird , in der Zeile

              $neu.=strtr(nl2br(htmlentities(trim($text))."<br>"),"\n\r"," ");

              ganz am Ende.

              Ich habe Versucht den Script mit einem Leerzeichen umzuschreiben, so:

              $text=wordwrap($text,35," ");
              $neu.="<tr><td bgcolor=#F4F4F4><div class=text>";
                    $neu.=strtr(nl2br(htmlentities(trim($text))."<br>"),"\n\r"," ");
                       $neu.="</div></td></tr></table><br><br>";
                    $neu.="\n"; //Ablschluss

              - Garkeine Reaktion.
              Die Lange Zeichenkette wurde nicht unterbrochen.