Reihenfolge in GB-Einträgen zeitlich sortieren

Hallo, liebe HaBos.

Ich hab im Netz mal ein wenig rumgestöbert (bin totale php-Niete), und mir aus verschiedenen Scripts sozusagen ein Gästebuch zusammengebaut (wirklich nichts besonderes, ohne Admin-Oberfläche, einfach nur ein Schript, welches den Inhalt der Textboxen an eine php Seite übermittelt). Es funktioniert auch alles wunderbar, aber ich weiß nicht, wie ich die Eintrags-Reihenfolge so ändern kann, dass immer der neueste Eintrag oben steht...Kann mir da jemand helfen?!

Hier der verwendete Code:

Eintragen.php
Code:
<table>
<form action=gastebuch.php method=post>
<textarea cols=50 rows=1 name="namedestyps">Name</textarea>
<p>
<textarea cols=50 rows=10 name="text">Nachricht</textarea>
<p>
<textarea cols=50 rows=1 name="homepage">Homepage</textarea>
<p>
<textarea cols=50 rows=1 name="email">eMail</textarea>
<p>
<input type=submit value="Eintragen">
</form>
</table>

Gastebuch.php
Code:
<table>
<a href="eintragen.php">Eintragen</a>
<?
$date = date("j.n.y");

if($text != "") {

$fp=fopen("text.php","a");
fwrite ($fp, "<table>$namedestyps $date <a href='$homepage' target='_blank'>$homepage</a> <a href='mailto:$email'>mail</a><br> $text <hr width='50%'></table>");
fclose($fp);
}

$array=file("text.php");
$lines=sizeof($array);

$text=file("text.php");
$lines=sizeof($text);

for($i=0;$i<$lines;$i++) {
echo $text[$i];
}

?>
</table>

Die Datei "Text.php" ist leer, (bzw. wird mit den Einträgen gefüllt)

Kann mir jemand sagen, wie ich die Einträge so anzeigen lasse, dass der Neueste immer oben ist?! (Wenn möglich, mit Erklärung für Dummies) :rolleyes:

Wäre wirklich klasse.

Danke für's Lesen. Tine
 
mal so nebenbei, hast du kein MysQL, damit wäre das um einiges einfacher..

Aber es geht auch mit Array. Wenn du deine Einträge also in ein Array speicherst (wie du das schienbar machst, wie ich im kurzen überfliegen gesehen hab), so kannst du dein array auch sortieren lassen.

Daui gibt es mehrere funktionen, und möglichkeiten..

Am besten schaust du dir diese seite mit den dazugehörigen querverwesen mal an.
http://de.php.net/manual/de/function.asort.php
 
O...kay...*kopfkratz*...danke schonmal für die flinke Hilfe, aber ich bin scheinbar noch nicht ganz ausgeschlafen. Meinst du das Array von file?
Das bleibt doch immer nur eins. Wo soll ich das sortieren?

Oder meinst du date? (< Is das eigentlich ein Array?!) Sorry, wie gesagt ich hab echt null Plan.

Danke für den Link, ich habe mal etwas über die verschiedenen Sortier-Funktionen gelesen, und fand das hier irgendwie einleuchtend:
Code:
$order=='asc'
Oder bin ich da komplett auf dem Holzweg?!

Kannst du mir noch einen Denkanstoß geben, bitte?! ?(
 
Da würd ich die Datei text.php oben auffüllen, sprich: Neueinträge immer an den Anfang der Datei statt ans Ende setzen. Geht glaube ich mit dem Schalter "r" bei fopen. Dadurch sind bereits in der Datei die Einträge absteigend sortiert.
 
Zwirni, ich habe deine Methode gerade mal ausprobiert (mit r+), aber dann wird immer nur ein einziger eintrag angezeigt, bzw. die anderen (nachfolgenden) entries werden alle gelöscht.
 
Dann versuch mal die Einträge immer an den Anfang der Datei zu setzen. Reihenfolge:

1. Datei komplett einlesen und Daten in einem String speichern
2. an den Anfang dieses Strings den neuen Eintrag setzen
3. den kompletten String in der Datei speichern (überschreiben)

So bekommste auch den neuesten Eintrag ganz oben hin.

Wie sieht eigentlich der Text aus den du speicherst? Gibt es da auch einen Unix-Zeitstempel? Evtl. kannste ja die Inhalte in einem Array speichern und dieses dann nach diesem Zeitstempel sortieren lassen. Da gabs irgendeinen Befehl für, fällt mir nur gerade nicht ein. array_sort oder sowas.
 
also ich habs jetzt so geschaft allerdings bekommt er probleme wenn er eine mehrzeilkige nachricht verfasst (@tine hab ein paar sachen in der eintrage.php verändert gefiel mir besser kannst es aber auch wieder löschen und wenn du ne sqldb hast, ich hab noch glaub ich ein gb auf dbbasis rumliegen):

eintragen.php
Code:
<table>
<script language="javascript">
function leeren (Wert,Wert2)
{
if (document.bar.elements[Wert2].value == Wert) 
 {
 document.bar.elements[Wert2].value='';
 }
}
</script>
<form name="bar" action=gastebuch.php method=post>
<input type="text" name="namedestyps" value="Name" onclick="leeren('Name','namedestyps')">
<p>
<textarea cols=50 rows=10 name="text" onclick="leeren('Nachricht','text')">Nachricht</textarea>
<p>
<input type="text" name="homepage" value="Homepage" onclick="leeren('Homepage','homepage')">
<p>
<input type="text" name="email" value="Email" onclick="leeren ('Email','email')">
<p>
<input type=submit value="Eintragen">
</form>
</table>

Code:
<table>
<a href="eintragen.php">Eintragen</a><br><br>
<?
$date = date("j.n.y");

if($text != "") {
$fp=fopen("text.php","a");
fwrite ($fp, "<table>$namedestyps $date <a href='$homepage' target='_blank'>$homepage</a> <a href='mailto:$email'>mail</a><br> $text <hr width='50%'></table>
"); //dieser Zeilenumbruch muss hier stehen
echo "Erfolgreich eingetragen";
fclose($fp);
}

$text=file("text.php");
$lines=count($text);
$text = array_reverse ($text); //dreht Array rum.
for($i=0;$i<$lines;$i++) 
{
 echo $text[$i]."<br><br>";
}

?>
</table>



@zwirni modus"r" ist lediglich ein normale read modus s.h. selfphp.de
 
@ Zwirni: Ich hab mal eine Zeit mit eingebaut.
Code:
$time = date("h:m");
allerdings habe ich immernoch keinen Blassen, wie man das sortiert, ist da nicht mal was von "ASC" gewesen? Ist mir so ganz grau in Erinnerung.

@CPU8080: Ich hab grad deinen Vorschlag gesehen, und werde es auch sofort mal testen...Und wenn das nicht klappt, geb ich es auf, mir raucht schon die Birne!

Ja, ich hätte die Möglichkeit, das Ganze mit einer DB zu machen, aber ich hab mich davor gescheut, weil ich noch weniger Ahnung von MySQL als von PHP hab...Shame on me, ich weiß. :rolleyes:

Edit: CPU8080: ich habe deinen Vorschlag jetzt mal getestet, und wie du schon sagtest, wenn der Eintrag länger ist, werden da leider mehrere draus. Aber danke trotzdem. Ob man das wohl irgendwie hinbekommt, dass ein Eintrag auch wirklich einer bleibt?!
 
Original von tine
Edit: CPU8080: ich habe deinen Vorschlag jetzt mal getestet, und wie du schon sagtest, wenn der Eintrag länger ist, werden da leider mehrere draus. Aber danke trotzdem. Ob man das wohl irgendwie hinbekommt, dass ein Eintrag auch wirklich einer bleibt?!

hinkriegen bestimmt irgentwie muss ma gucken, aber vll solltest du dir jetzt erstmal überlegen ob dus mit ner sqldb machst oder einer textdatei
 
Hallo,

es ist ganz leicht, Ihr dürft keine reinen HTML-Tags in der Datei speichern!
Ich habe mir vor einiger Zeit auch ein GB auf File basis gecodet, und stand vor denn selben Problemen. Man hat z.B. das Problem beim IE dass man in einer Textarea einen Zeilenumbruch machen kann. Beim Firefox geht das nicht, der IE fügt dann auch gleich ein Steuerzeichen mit ein /n, und das führt zu einem Zeilenumbruch in der Datei.

Tja, es gibt da noch mehr Probleme die auf einen zukommen.
Ach ja, speichere Dein Datum nicht formatiert, sondern als Unix-Timestamp mit der Funktion mktime(). Das ASC gibts bei DB's!!

Und jetzt zeig ich euch noch die Funktion die bei mir das schreiben regelt.

PHP:
function writeEntry($gName,$gEMail,$gIM,$gHP,$gText,$error,$gdate,$ip)
{
  if($error==TRUE)
  {
          if($zdatei=fopen("gb.dat","r+"))
          {
    
              flock($zdatei,2);
              $guestbook=fread($zdatei,filesize("gb.dat"));
              $array=explode("|x|",$guestbook);
              $eintrag=$array[0];
              $eNr=$eintrag+1;
              $gText=nl2br(htmlspecialchars($gText));
              $gText=bbcode($gText);
              $gName=strip_tags($gName);
              rewind($zdatei);
              fwrite($zdatei,$eNr.'|x|'.$gName.'|x|'.$gEMail.'|x|'.$gIM.'|x|'.$gHP.'|x|'.$gText.'|x|'.$gdate.'|x|'.$ip."\n");
              fwrite($zdatei, $guestbook);
              flock($zdatei,3);
              fclose($zdatei);
              echo "<center><b>Eintragung erfolgreich!</b></center><br/>";
          }
          else
          {
              echo "Fehler! Datei läßt sich nicht öffnen!";
          }
  }
  else
  {
    echo "<center><small><b>Schwerer Ausnahmezustand in checkentry.inc.php 0x00004D 0x0000FF! ;-)</b></small></center>";
  }
}

Ich hatte leider keine Zeit das ganze noch zu Kommentieren. Aber das meiste ist ja eh selbsterklärend.
 
Original von BasicAvid
Beim Firefox geht das nicht, der IE fügt dann auch gleich ein Steuerzeichen mit ein /n, und das führt zu einem Zeilenumbruch in der Datei.

Das war das Stichwort warum nicht einfacher:

$eintragtext = str_replace("\n", '<br>', $text); //Einfach \n rausziehen 8D

Code:
<table>
<a href="eintragen.php">Eintragen</a><br><br>
<?
$date = date("j.n.y");

if($text != "") {
$fp=fopen("text.php","a");
$eintragtext = str_replace("\n", '<br>', $text);
fwrite ($fp, "<table>$namedestyps $date <a href='$homepage' target='_blank'>$homepage</a> <a href='mailto:$email'>mail</a><br> $eintragtext <hr width='50%'></table>
"); //dieser Zeilenumbruch muss hier stehen
echo "Erfolgreich eingetragen";
fclose($fp);
}

$text=file("text.php");
$lines=count($text);
$text = array_reverse ($text); //dreht Array rum.
for($i=0;$i<$lines;$i++) 
{
 echo $text[$i]."<br><br>";
}

?>
</table>
 
Das machts aber um einiges leichter mit ner datenbank..
das mit der datei is doch recht kompliziert..

kurze einführung in mysql

Code:
    define('MYSQL_HOST',     'localhost'); 
    define('MYSQL_USER',     'user');
    define('MYSQL_PASS',     'pass');
    define('MYSQL_DATABASE', 'dbase');

hier werden erstmal ein par constanten definiert, die kannst du auch ine ine andere PHP datei auslagern, die du dann includest, aber du kannst sie auch oben in die datei schreiben.. wurscht!

dort wird
1. die adresse zum sql server angegeben (sagt dir dein provider)
2. der username für den sqlzugang
3. das passwort
4. dort steht der name der datenbank. (den legst du beim erstellen der datenbank fest)

Code:
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
mysql_select_db(MYSQL_DATABASE);

diese zwei sätze bauen eine verbuindung zum mySQLserver auf, mit hilfe der oben angebenenen constanten


Jetzt musst du den befehl für die sql-action zusammenstellen:
Code:
$sql = "INSERT INTO tabellenname ( `ID` , `name` , `nachricht` , `homepage`, `email` , `datum`) 
	VALUES ('', '$name', '$message', '$hp', '$email', now())";

Also den Ausdruck schreiben wir in eine variable, um es etwas übersichtlicher zu gestallten.

INSERT INTO sagt aus, dass ein weiterer datensatz hinzugefügt werden kann, dort gibt es dann noch SELECT, INSERT, UPDATE, ..., um die grundsätzliche action zu definieren.

daanch folgtd er tabellenname. inerhalb einer datenbank muss man tabellen definieren. um die daten zu speichern. hier heist sie einfach tabellenname.

dann volgt die genaue anweisung was mit den einzelnen datenfeldern angesetllt werden soll. wir defineiren die Tabellenspalten, in die wir etwas schreiben wollen.
und nach values kommen die entsprechenden werte in der oben angegebenen folge.

eine besonderheit bieten now() das ist keine wariable, sondern eine funktion, die den aktuellen zeitstempel ausgibt.

Um das ganze jetzt an die datenbank zu übergeben, müssen wir die funktion mysql_query($Sql); ausführen.

Code:
mysql_query($Sql);

schon hast du einen gästebucheintrag in die datenbank verfrachtet.

wenn du es auslesen willst gehst du genauso vor, nur dass die anweisung in der variablen $sql etwas anders lautet:
Code:
SELECT * FROM tabellenname ORDER BY datum DESC";

SELCT sagt aus, dass ein datensatz abgefragt wird.

danach kommen die einzelnen datenfelder die abgefragt werden sollen. * heißt das alle abgefragt werden.
Order BY gibt die anweisungd ie datensätze vorher zu sortieren
darauf folgt dann das datenfeld, anhand der die ausgabe sortiert werden soll.
und dahinter dier sortier algorithmus ASC (aufsteigend) oder DESC (absteigend).

danach mus sman die abfrage wieder übergeben

Code:
$res = mysql_query($Sql);

Diesmal steht eine variable davor. weil wir ja mit den zurückgegebenen daten weiterarbeiten wollen (ausgeben)

diese variable ist ein Array, und enthält somit die gesamte tabellenstrucktur, aber damit kann man nicht arbeiten, deswegen muss man das ganze noch umwandeln.

$row = mysql_fetch_assoc($result); gibt eine reihe als array aus, da wir aber mehrere reihen haben, brauchen wir eine schleife

Code:
while ($row = mysql_fetch_assoc($result)) { }

zwischen den spitzklammern stehen uns nun immer die datenfelder der atuellen reihe zur verfügung.

so könne wir dann eine ausgabe wie diese starten:
Code:
echo "<table><td>name:</td><td>".$row[name]."</td> (...) ";

So das reicht fürs erste, hier is alles ausführlich erklärt
http://www.php4-forum.de/datenbank.htm

Kannst dich auch gerne per IM direkt an mich wenden bei fragen.
 
@CPU8080: So wie du das da gecodet hast übernehme ich es einfach mal, scheint problemlos zu funktionieren.

@BasicAvid: Öj, das sieht ja völlig anders aus. Ich werd mir das nachher mal genauer ansehen, und versuchen das zu kapieren.

@flame: WOW! Kurze Einführung? Also danke schonmal, so mega-schwer sieht das ja gar nicht aus, aber leider scheitert das dann oft an der Umsetzung...(Weiber und ihre Logik...aber Selbsterkenntnis ist ja der Beste Weg zur Besserung *grins*)

Danke nochmal an alle, die geholfen haben. Ich wünsche einen angenehmen Samstag. :)
 
@CPU8080

Mit sowas würde ich aufpassen, wie gesagt ich würde niemals reine HTML mit in der Datei speichern. Und dafür gibts einige Gründe.

Die Datei wird unnötig aufgebläht durch sowas.
Man kann denn Style / Aufbau des Eintrags nur mit viel Aufwand ändern.
Und man könnte noch ganz viele andere schönen Sachen machen ;-)!

Das machts aber um einiges leichter mit ner datenbank..

Das stimmt, mit einer Datenbank ist es wirklich leichter, vorallem wenn man OOP einsetzt.

das mit der datei is nix halbes und nix ganzes..

Begründe warum!!! Den so kann man das nicht sagen. Wenn ich meine Einträge organisiert/struktoriert in eine Datei schreibe, dann habe ich vom Grundprinzip eine DB.
 
theorethisch sollte man das ganze, wie du es gemacht hast, im *.csv format aufbauen.
Ich hätte aber wenn schon den schon eine db benutzt.
 
Original von BasicAvid

das mit der datei is nix halbes und nix ganzes..

Begründe warum!!! Den so kann man das nicht sagen. Wenn ich meine Einträge organisiert/struktoriert in eine Datei schreibe, dann habe ich vom Grundprinzip eine DB.

Ja das hab ich jetzt n bisschen sehr verallgemeinert. Ich meinte insbesondere so wie es DA gemacht wurde ist es nix halbes und nix ganzes. Einfach die daten zusammen mit n paar html-tags in n Datei geschmissen, und dann mit nem Workaround includieren.

Die gründe hast du ja schon selbst genannt, und zusätzlich kann man eben ohne direkten zugriff auf die datei, und dann mit mühseligen editieren per hand nix an den Daten ändern.

Normal müsste man die daten da schon struckturiert abspeicher, und dann mit hilfe eines arrays weiterverwalten. Führt aber leicht zu fehlern, wenn man sich da nicht bis ins kleinste details gedanken über trennzeichen usw. macht.

sagen wir es so, es ist bei weitem nicht so vorteilhaft wie ne datenbank.
@tine: keine angst das wird jetzt warscheinlich bis ins äuserste ausdiskutiert, und von der sicherheitstechnischen seite beleuchtet. Sowas darf dich hier nicht stören. Einfach lesen und draus lernen.
 
Zurück
Oben