PHP Hilfe bei Gästebuchausgabe

Blaggi

Grünschnabel
[Nicht erledigt] Hilfe bei Gästebuchausgabe

Hallo :)
Ich leite eine kleine Flash Homepage, und benutze dieses kleine Textbox PHP Script als Gästebuch, weil es die Einträge in eine .txt schreib und da ich die Ausgabe superleicht anpassen kann, sodass mein Flash es anzeigen kann. Ich habe allerdings ein Problem. Er schreibt die neuen Einträge nach unten.. Hier mal der Code meiner msg.php:
PHP:
<?
$person = str_replace ("\n"," ", $person);
$person = str_replace ("<", " ", $person);
$person = str_replace (">", " ", $person);
$person = stripslashes ($person);
?>
<style type="text/css">
<!--
 a:link { text-decoration:none; font-weight:bold; color:#FF9900; }
 a:visited { text-decoration:none; font-weight:bold; color:#FF9900; }
 a:hover { text-decoration:none; font-weight:bold; color:#FF0000; }
 a:active { text-decoration:none; font-weight:bold; color:#FF9900; }
-->
</style>
<body bgcolor="#333333">
<form action="" method="post">

  <p><font color="white">Nick:</font>
    <input type="text" name="person" class=textfeld size="20" maxlength="20" value="<? echo $person; ?>">
    <br>
<font color="white">Message:</font>
<input type="text" name="message" class=textfeld size="20" maxlength="90">
<br>
<input type="submit" value="Senden" class=button>
  </p>
</form>
<a href="javascript:window.close()">Zurück</a><br>
<?
$zeit = date("H:i", time());
$datum = date("d.m.Y", time());
$chat_file_ok = "xml/msg.txt";
$chat_lenght = 7;
$max_single_msg_lenght = 512;
$max_file_size = $chat_lenght * $max_single_msg_lenght;
$file_size= filesize($chat_file_ok);            
if ($file_size > $max_file_size) {
$lines = file($chat_file_ok);    
$a = count($lines);
$u = $a - $chat_lenght;
for($i = $a; $i >= $u ;$i--){
        $msg_old =  $lines[$i] . $msg_old;
    }
$deleted = unlink($chat_file_ok);
$fp = fopen($chat_file_ok, "a+");
$fw = fwrite($fp, $msg_old);
fclose($fp);
}
$msg = str_replace ("\n"," ", $message);
$msg = str_replace ("\n"," ", $message);
$msg = str_replace ("<", " ", $msg);
$msg = str_replace (">", " ", $msg);
$msg = stripslashes ($msg);
if ($msg != ""){
$fp = fopen($chat_file_ok, "a+");
$fw = fwrite($fp, "Von: $person am $datum um $zeit<br>$msg<br>_________________________<br><br>");
fclose($fp);
}
$lines = file($chat_file_ok);
$a = count($lines);
$u = $a - $chat_lenght;
//for($i = $a; $i >= $u ;$i--){
//        echo $lines[$i] . "<br>";
//    }
	 echo "$zeit $datum";
?>
</table>
</BODY>
</HTML>

Relativ weit unten ist der Code der den Text ausgibt.. den muss ich so haben, dass er die neuen Einträge nach oben schreibt. Aber da ist noch das Problem, dass oben in der Datei noch wichtige Daten stehen, wie Titel des Gästebuchs, und würde er die neuen Einträge direkt nach oben schreiben, wärs ja so:

Eintrag 3
Eintrag 2
Eintrag 1
<title>Gästebuch</title>

Und die Ausgabe im Gästebuch dementsprechend auch Falsch... Ich würde das ja so machen, dass er die neuen Einträge an den ANFANG der Zeile 2 schreibt.. dann würde es laufen.. aber ich habe keine Ahnung von PHP.. :(
Könnte mir jemand mit mehr Ahnung eine Lösung coden?

*EDIT*
Zur besseren Verständnis füge ich mal den Code meiner msg.txt ein:

HTML:
<titel>Gaestebuch (BETA!)</titel><a href="msg.php" target="_blank">(Hier eintragen!)</a><br><name>
Von: TESTNAME am 07.12.2005 um 20:10<br>TESTEINTRAG<br>_________________________<br><br>[Und so weiter alles hintereinander]


- Grüße, Blaggi - http://flippy.free-speicher1.de
 
Zuletzt bearbeitet:
Mhm das Problem ist folgendes , wenn man immer ans Ende der Datei schreibt wird man auch immer die neuste Nachricht am Ende der Datei haben also ganz unten ;)

Abhilfe würde da schaffen , Datei einlesen den Inhalt nehmen und an die neuste Nachricht einfach ranhängen dann.

Wobei mir einige Zeilen bei dem Quellcode eh spanisch vorkommen , darum hab ich es mal komplett umgekrempelt.Diese Dateigrösse auf 3.5 kb hab ich einfach mal komplett rausgeschmissen da er darauf hin unr nen paar Zeilen löscht das heisst das irgend nen Eintrag dann zerstückelt werden würde.

aber Eventuell kann mir jemand verraten warum der Programmierer diese \n durch ein " " ersetzt , kommt mir ein wenig seltsam vor einen Zeilenumbruch in ein Freizeichen umzuwandeln.

PHP:
<?php
$person = str_replace ("\n"," ", $person); 
$person = str_replace ("<", " ", $person); 
$person = str_replace (">", " ", $person); 
$person = stripslashes ($person); 
?> 
<style type="text/css"> 
<!-- 
 a:link { text-decoration:none; font-weight:bold; color:#FF9900; } 
 a:visited { text-decoration:none; font-weight:bold; color:#FF9900; } 
 a:hover { text-decoration:none; font-weight:bold; color:#FF0000; } 
 a:active { text-decoration:none; font-weight:bold; color:#FF9900; } 
--> 
</style> 
<body bgcolor="#333333"> 
<form action="" method="post"> 

  <p><font color="white">Nick:</font> 
    <input type="text" name="person" class=textfeld size="20" maxlength="20" value="<? echo $person; ?>"> 
    <br> 
<font color="white">Message:</font> 
<input type="text" name="message" class=textfeld size="20" maxlength="90"> 
<br> 
<input type="submit" value="Senden" class=button> 
  </p> 
</form> 
<a href="javascript:window.close()">Zurück</a><br> 

<? 
$zeit = date("H:i", time()); 
$datum = date("d.m.Y", time()); 
$chat_file_ok = "xml/msg.txt"; 
$old_messages = "";

$file = fopen($chat_file_ok,"r");

while(!feof($file)){
  $old_messages .= fgets($file,255);
}  

$msg = str_replace ("\n"," ", $message); 
$msg = str_replace ("<", " ", $msg); 
$msg = str_replace (">", " ", $msg); 
$msg = stripslashes ($msg);
 
if ($msg != ""){ 
  
  $new_message = "Von:".$person."am ".$datum." um ".$zeit."<br>".$msg."</br>".$old_messages;
  $fp = fopen($chat_file_ok, "w+");
  fwrite($fp,$new_message); 
  fclose($fp); 
}
 
$file = fopen($chat_file_ok , "r");
while(!feof){
  echo fgets($file,255);
}
echo "$zeit $datum"; 
?> 
</table> 
</BODY> 
</HTML>
 
Zuletzt bearbeitet:
Supi, richtig schreiben tut er jetzt, aber das hat auch mein Design rausgehauen.
Jetzt schreibt er den Eintrag ja direkt an die erste stelle, da muss aber mein "<titel>Gaestebuch</titel>" stehen :/
Des GB muss ja so aussehen:
<titel>Gaestebuch</titel>
<name>
eintrag3
eintrag2
eintrag1


Damit mein Flashscript es anzeigen kann
gibts da nen Wokraround?
 
Zuletzt bearbeitet:
PHP:
<?
$person = str_replace ("\n"," ", $person);
$person = str_replace ("<", " ", $person);
$person = str_replace (">", " ", $person);
$person = stripslashes ($person);
?>
<style type="text/css">
<!--
 a:link { text-decoration:none; font-weight:bold; color:#FF9900; }
 a:visited { text-decoration:none; font-weight:bold; color:#FF9900; }
 a:hover { text-decoration:none; font-weight:bold; color:#FF0000; }
 a:active { text-decoration:none; font-weight:bold; color:#FF9900; }
-->
</style>
<body bgcolor="#333333">
<form action="" method="post">

  <p><font color="white">Nick:</font>
    <input type="text" name="person" class=textfeld size="20" maxlength="20" value="<? echo $person; ?>">
    <br>
<font color="white">Message:</font>
<input type="text" name="message" class=textfeld size="20" maxlength="90">
<br>
<input type="submit" value="Senden" class=button>
  </p>
</form>
<a href="javascript:window.close()">Zurück</a><br>
<?
$zeit = date("H:i", time());
$datum = date("d.m.Y", time());
$chat_file_ok = "xml/msg.txt";
$chat_lenght = 7;
$max_single_msg_lenght = 512;
$max_file_size = $chat_lenght * $max_single_msg_lenght;
$file_size= filesize($chat_file_ok);            

if ($file_size > $max_file_size) {
$lines = file($chat_file_ok);    
$a = count($lines);
$u = $a - $chat_lenght;
for($i = $a; $i >= $u ;$i--){
        $msg_old =  $lines[$i] . $msg_old;
    }
fclose($fp);
}

$msg = str_replace ("\n"," ", $message);
$msg = str_replace ("\n"," ", $message);
$msg = str_replace ("<", " ", $msg);
$msg = str_replace (">", " ", $msg);
$msg = stripslashes ($msg);
$msg .= msg_old;

if ($msg != ""){
$fp = fopen($chat_file_ok, "w+");
$fw = fwrite($fp, "Von: $person am $datum um $zeit<br>$msg<br>_________________________<br><br>");
fclose($fp);
}

$file = fopen($chat_file_ok);
while(!feof($file)){
   echo $file;
}

}
	 echo "$zeit $datum";
?>
</table>
</BODY>
</HTML>

mhm probiere es mal so , mit dem JavaScript komm ich total durcheinander hätte wohl nicht zuviel rausradieren sollen da ich mich mit JavaScript nicht so gut auskenn.
Die ganze Zeit frage ich mich warum er das Formular nicht anzeigt obwohl er es müsste :)

Darum verwirrt mich das auch mit dem Title und dem Link zum eintragen da ich dieses hier nirgendwo entdecken kann. Also nur ne kleine Modifikation ich hoffe es haut noch hin :)
 
Hm.. ne leider auch nicht, er überschreibt wieder das wichtige <titel> und <name>
Er müsste alle neuen Einträge in Zeile 2 schreiben, damit es klappt :/

EDIT: Das mit dem Titel und Link ist so: ich schreibe sie immer vorher rein, damit sie immer da sind. Die sind da, weil Flash es wie ne XML Datei lädt und eine CSS datei die tags "NAME" "TITLE" und "A" designed, damit es auch so aussieht wie es aussehen muss
 
Zuletzt bearbeitet:
Also wenn ich dich richtig verstanden habe, hast du ein Problem damit, die Textdatei richtig zu füllen, oder?

Dann würde ich an deiner Stelle versuchen, zwischen fopen und fwrite die Funktion fseek zu benutzen. Damit kannst du den Dateizeiger an die entsprechende Stelle "spulen" und dann deinen Text richtig einfügen.


Du kannst aber auch wie oben, wo du bei Überschreiten der maximalen Dateigröße den Dateiinhalt beeinflusst, einfach die Datei in ein Array einlesen und dort dann an der entsprechenden Stelle den Wert einfügen und danach dann den Inhalt wieder in die Dateischreiben.

Viel Spaß.
 
mxp hat gesagt.:
Also wenn ich dich richtig verstanden habe, hast du ein Problem damit, die Textdatei richtig zu füllen, oder?

Dann würde ich an deiner Stelle versuchen, zwischen fopen und fwrite die Funktion fseek zu benutzen. Damit kannst du den Dateizeiger an die entsprechende Stelle "spulen" und dann deinen Text richtig einfügen.


Du kannst aber auch wie oben, wo du bei Überschreiten der maximalen Dateigröße den Dateiinhalt beeinflusst, einfach die Datei in ein Array einlesen und dort dann an der entsprechenden Stelle den Wert einfügen und danach dann den Inhalt wieder in die Dateischreiben.

Viel Spaß.

Wie gesagt hab ich von PHP NULL (0, Zero) Ahnung, ich weiss net was du damit meinst :/

Also die GB Datei muss so aussehen:

Code:
<titel>Gaestebuch</titel><a href="msg.php" target="_blank">(Eintragen)</a><name><br>
ETC
EINTRAG3
EINTRAG2
EINTRAG1
 
Zuletzt bearbeitet:
Naja wenn es in der Datei steht ganz oben und Du es eh immer neu reinschreibst dann hängen wir es noch oben dran dann.

PHP:
....
<?php  
$zeit = date("H:i", time());  
$datum = date("d.m.Y", time());  
$chat_file_ok = "xml/msg.txt";  
$old_msg = ""; 

$file = file($chat_file_ok);
$header = $file[0]; // erste Zeile nehmen das ist das title etc 

// Alle anderen Zeilen gehören zur alten Nachricht dann
for($i = 1 ; $i < count($file); $i++){   
    $old_msg  .= $file[$i];
}

$msg = str_replace ("\n"," ", $message);  
$msg = str_replace ("<", " ", $msg);  
$msg = str_replace (">", " ", $msg);  
$msg = stripslashes ($msg); 
  
if ($msg != ""){  
  $new_msg = $header."Von:".$person."am ".$datum." um ".$zeit."<br>".$msg."</br>".$old_msg;
  $fp = fopen($chat_file_ok, "w+"); 
  fwrite($fp,$new_msg);  
  fclose($fp);  
} 
  
$file = fopen($chat_file_ok , "r"); 
while(!feof){ 
  echo fgets($file,255); 
} 
echo "$zeit $datum";  
?>  
...

So sollte es hoffentlich funktionieren nun :)

Das mit dem fseek klappt leider nicht wenn man eine Datei im Modus a / a+ öffnet, das hab ich mal probiert man kann sich aber nicht mehr innerhalb der Datei bewegen mit dem Zeiger dann so das er immer am Ende der Datei ist.
 
Zuletzt bearbeitet:
Zurück