amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > PHP: Problem mit der Länge von Strings [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

28.09.2004, 22:28 Uhr

cgutjahr
Posts: 2782
[Administrator]
Ich bin komplett unbedarft was PHP angeht, zum ersten Rumprobieren wollte ich mal "Backdoor" ausprobieren, das ist eine Art Mini-PIM-Tool (Notizen, Links, Addressen, Kalender...):

http://gutjahr.free.fr/backdoor.zip (15 KB)

Mein Problem ist das unten angehängte Skript ("index.php") es enthält ein Formular mit einer <TEXTAREA> und ruft sich selbst auf, wenn man den "add note" Knopf drückt.

Das Problem ist folgendes: Steht in der TEXTAREA zu viel Text (der Knackpunkt ist irgendwo bei 800-1000 Zeichen, hab hier keinen anständigen Texteditor) wenn ich das FORM übermittle, wird ein Teil davon einfach abgeschnitten und landet nicht in $tekst.

Hat jemand eine Ahnung, woran das liegen könnte? String-Variablen sind doch in PHP nicht in der Länge begrenzt, oder?

code:
<? include("header.php"); 

    $tekst = $HTTP_POST_VARS["tekst"];

    if ($tekst) {
        $fp = fopen("notes.txt", "a");
        fputs($fp, date("d/m/Y")."n");
        fputs($fp, date("H.i")."n");
        fputs($fp, stripslashes(str_replace("r", "", str_replace("n", "", nl2br($tekst))))."n");
        fclose($fp);
    }

    $n = 0;
    $guestbook = array();

    $fp = fopen("notes.txt", "r");
    while (!feof($fp)) {
        $datum = fgets($fp, 1024);
        $tijd = fgets($fp, 1024);
        $tekst = fgets($fp, 1024);
        if ($datum && $tijd && $tekst) {
            $guestbook[$n][0] = $datum;
			$guestbook[$n][1] = $tijd;
            $guestbook[$n][2] = $tekst;
            $n++;
        }
    }
    fclose($fp);
	
    if ($kill) {
      $fp = fopen("notes.txt", "w");
      for($i = 0; $i < sizeof($guestbook); $i++) {
	  if ( $i != ($kill - 1)) {
        fputs($fp, $guestbook[$i][0]);           
        fputs($fp, $guestbook[$i][1]);          
        fputs($fp, $guestbook[$i][2]);
		}
      }
      fclose($fp);
	  
	$n = 0;
    $guestbook = array();

    $fp = fopen("notes.txt", "r");
    while (!feof($fp)) {
        $datum = fgets($fp, 1024);
        $tijd = fgets($fp, 1024);
        $tekst = fgets($fp, 1024);
        if ($datum && $tijd && $tekst) {
            $guestbook[$n][0] = $datum;
			$guestbook[$n][1] = $tijd;
            $guestbook[$n][2] = $tekst;
            $n++;
        }
    }
    fclose($fp);
	}	

?>

<br>
<table border="0" cellpadding="2" cellspacing="2" width="500">
<? 	
for ($i = 0; $i < sizeof($guestbook) ; $i++) { 
  $j = $n - $i - 1;
  echo "<tr><td bgcolor=000000 class=wit>".$guestbook[$j][0]." ".$guestbook[$j][1]." ( <a href=index.php?kill=".($j + 1)." class=wit>delete</a> )</td></tr>";
  echo "<tr><td><pre>".$guestbook[$j][2]."</pre></td></tr>";
}
?>
<tr><td align="center">
<br><br>
<form name="frmentry" action="index.php"  method="post">
<textarea name="tekst" class="formAreaBig" rows="10"></textarea>
<br><br><a href="javascript:document.frmentry.submit()">add note</a>
</form></td></tr></table>
</td></tr></table>
</body>
</html>

--
Gutjahrs :amiga: Seiten

[ - Antworten - Zitieren - Direktlink - ]

29.09.2004, 11:08 Uhr

BJ
Posts: 247
Nutzer
Liegt daran:

$tekst = fgets($fp, 1024);

Aus der Datei notes.txt (über den Filepointer $fp) wird per fgets() eine Zeile ausgelesen mit der Länge 1024 Zeichen.

Entweder, du erhöhst den Wert für die Länge, oder du liest die komplette Datei einfach zeilenweise in ein Array ein. Das geht mit dem Befehl file(). Dann hast du in jedem Element des Arrays eine komplette Zeile drin unabhängig von deren Länge.

Mehr Infos dazu unter http://www.selfphp.de im Bereich Dateisytem-Funktionen.
--
It's time to kick ass and chew bubblegum! :O

(Duke Nukem)

[ - Antworten - Zitieren - Direktlink - ]

30.09.2004, 14:07 Uhr

_PAB_
Posts: 3016
Nutzer
Oder einfach das ", 1024" weglassen, also nur:
fgets ($fp);
siehe: Description

string fgets ( resource handle [, int length])

Eine weitere Begrenzung kann daran liegen, daß der Webserver eine Beschränkung auf die Länge eines POST-Requests hat, was aber per Default ausgeschaltet sein sollte.

[ - Antworten - Zitieren - Direktlink - ]

30.09.2004, 16:26 Uhr

cgutjahr
Posts: 2782
[Administrator]
Okay, herzlichen Dank erstmal für die Hineise.

Die Begrenzung kann ich nur bei PHP 4.3 oder neuer weglassen (ältere Versionen nehmen 1024 als Default), mein lokaler AmigaOS-Build ist aber 4.0.irgendwas (IIRC).

Ich hab erstmal um weitermachen zu können, den "length" wert auf 20000 gesetzt. Jetzt bin ich wieder an der Stelle und hab' mir folgenden Workaround überlegt (das mit dem Array würde ich gerne umgehen, das klingt nach viel Aufwand):

Ich berechne beim Speichern die Länge des Strings (der nur ein einziges Newline-Zeichen enthält, nämlich am Ende) und speichere sie vor dem String ab. Das sieht vereinfacht dargestellt so aus:

code:
fputs($fp, (strlen($ntext) + 1)."n");
fputs($fp, nl2br($ntext)."n");


Das funktioniert: Vor jedem String steht jetzt in meiner Textdatei eine Zeile, die die Länge angibt. Das Lesen der Datei wollte ich dann folgendermaßen lösen:

code:
$fp = fopen("notes.txt", "r");
while (!feof($fp))
{
  $ntitle = fgets($fp, 81);
  $ndate = fgets($fp, 20);
  $ntime = fgets($fp, 20);
  $nlength = fgets($fp, 20);
  $ntext = fgets($fp, $nlength);
  if ($ndate && $ntime && $ntext)
  {
   $notes[$n][0] = $ntitle;
   $notes[$n][1] = $ndate;
   $notes[$n][2] = $ntime;
   $notes[$n][4] = $nlength;
   $notes[$n][3] = $ntext;
   $n++;
  }
}
fclose($fp);

$nlength wird der korrekte Wert zugewiesen (ich hab' das mit einer echo-Anweisung überprüft), aber die Schleife wird endlos ausgeführt und meine Festplatte rödelt wie verrückt - kann mir einer von euch sagen was ich falsch mache?

--
Gutjahrs :amiga: Seiten

[ - Antworten - Zitieren - Direktlink - ]

30.09.2004, 17:33 Uhr

whooha
Posts: 41
Nutzer
Zitat:
code:
fputs($fp, (strlen($ntext) + 1)."n");
fputs($fp, nl2br($ntext)."n");



Du solltest erst das nl2br anwenden und dann die Stringlänge abfragen ;)

[ - Antworten - Zitieren - Direktlink - ]

30.09.2004, 22:46 Uhr

BJ
Posts: 247
Nutzer
Also, das mit den Array ist nicht kompliziert. Beispiel aus selfPHP:

<?PHP

// Inhalt der Datei statistik.csv:
//01.08.2001#62.159.232.250#www.selfphp3.de
//02.08.2001#212.82.34.222#www.selfphp4.de
//02.08.2001#http://suchen.abacho.de#62.159.232.250

//03.08.2001#http://www.fireball.de#212.185.44.15


$datei = "statistik.csv";
$array = file($datei);
for($x=0;$x<count($array);$x++){
echo $array[$x];
echo "<br>";
}
?>


Ausgabe:

01.08.2001#62.159.232.250#www.selfphp3.de
02.08.2001#212.82.34.222#www.selfphp4.de
02.08.2001#http://suchen.abacho.de#62.159.232.250

03.08.2001#http://www.fireball.de#212.185.44.15
--
It's time to kick ass and chew bubblegum! :O

(Duke Nukem)

[ - Antworten - Zitieren - Direktlink - ]

01.10.2004, 19:43 Uhr

cgutjahr
Posts: 2782
[Administrator]
@whooha:

Zitat:
Du solltest erst das nl2br anwenden und dann die Stringlänge abfragen ;)
Aua, peinlicher Fehler ;)

@BJ:

Zitat:
Also, das mit den Array ist nicht kompliziert. Beispiel aus selfPHP:
Ach so, das ist ja wirklich elegant. Hab' das Skript entsprechend umgeschrieben und jetzt funktioniert alles! Tausend Dank.

--
Gutjahrs :amiga: Seiten

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > PHP: Problem mit der Länge von Strings [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.