amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > PHP: Problem mit der Länge von Strings [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2004-09-28, 22:28 h

cgutjahr
Posts: 2783
[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

[ - Answer - Quote - Direct link - ]

2004-09-29, 11:08 h

BJ
Posts: 247
User
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)

[ - Answer - Quote - Direct link - ]

2004-09-30, 14:07 h

_PAB_
Posts: 3016
User
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.

[ - Answer - Quote - Direct link - ]

2004-09-30, 16:26 h

cgutjahr
Posts: 2783
[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

[ - Answer - Quote - Direct link - ]

2004-09-30, 17:33 h

whooha
Posts: 41
User
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 ;)

[ - Answer - Quote - Direct link - ]

2004-09-30, 22:46 h

BJ
Posts: 247
User
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)

[ - Answer - Quote - Direct link - ]

2004-10-01, 19:43 h

cgutjahr
Posts: 2783
[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

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > PHP: Problem mit der Länge von Strings [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.