Newssystem-Problem

2Pac

Erfahrenes Mitglied
Hallo!
Ich habe versucht mein Newssystem auf meiner Seite über txt datein zu realisieren da ich mein webspace nicht wechseln möchte er mir aber MySQL nicht zur verfügung stellen kann...

Und dort habe ich mir folgendes Script ausgedacht... :

PHP:
  if($pw == hundchen)
  {
   $datei = fopen("News/news5.txt","r");
   if($datei)
   {
    while(!feof($datei))
    {
     $fp1 = fgets($datei, 100);
    }
    fclose($datei);
   }
   unlink("News/news6.txt");
   touch("News/news6.txt");
   chmod("News/news6.txt", 0777);
   $datei = fopen("News/news6.txt","w");
   fwrite($datei, $fp1);
   fclose($datei);
 
   $datei = fopen("News/news4.txt","r");
   if($datei)
   {
    while(!feof($datei))
    {
     $fp2 = fgets($datei, 100);
    }
    fclose($datei);
   }
   unlink("News/news5.txt");
   touch("News/news5.txt");
   chmod("News/news5.txt", 0777);
   $datei = fopen("News/news5.txt","w");
   fwrite($datei, $fp2);
   fclose($datei);
  
   $datei = fopen("News/news3.txt","r");
   if($datei)
   {
    while(!feof($datei))
    {
     $fp3 = fgets($datei, 100);
    }
    fclose($datei);
   } 
   unlink("News/news4.txt");
   touch("News/news4.txt");
   chmod("News/news4.txt", 0777);
   $datei = fopen("News/news4.txt","w");
   fwrite($datei, $fp3);
   fclose($datei);
 
   $datei = fopen("News/news2.txt","r");
   if($datei)
   {
    while(!feof($datei))
    {
     $fp4 = fgets($datei, 100);
    }
    fclose($datei);
   }
   unlink("News/news3.txt");
   touch("News/news3.txt");
   chmod("News/news3.txt", 0777);
   $datei = fopen("News/news3.txt","w");
   fwrite($datei, $fp4);
   fclose($datei);
 
   $datei = fopen("News/news1.txt","r");
   if($datei)
   {
    while(!feof($datei))
    {
     $fp5 = fgets($datei, 100);
    }
    fclose($datei);
   }
   unlink("News/news2.txt");
   touch("News/news2.txt");
   chmod("News/news2.txt", 0777);
   $datei = fopen("News/news2.txt","w");
   fwrite($datei, $fp5);
   fclose($datei);
   
   unlink("News/news1.txt");
   touch("News/news1.txt");
   chmod("News/news1.txt", 0777);
   $datei = fopen("News/news1.txt","w");
   fwrite($datei, $news);
   fclose($datei);
   
   echo "Deine News wurden online gebracht";
  }
  else
  {
    echo "Falsches Passwort";
  }

Also ich habe mir gedacht höchstens 6 News gleichzeitig auf der
Page und somit 6 txt datein die da heissen news1.txt ,news2.txt ...

Diese habe ich in dem unterordner News gemacht zur Übersicht.
Nun wird News5 geöffnet und ausgelesen und in 6 geschrieben.
Dann das Gleiche mit 4 und 5,3 und 4,2 und 3,1 und 2.

Zum Schluss wird in news1.txt die neue news die über ein Formular
eingegeben wird geschrieben. Bei den ganzen Aktionen wird die Datei
die ausgelesen ist dabei jeweils gleich gelöscht und beim nächsten
mal wieder erstellt.(also ich lese 5 aus lösche es und schreibe
inhalt in 6, dann lese ich 4 ein, lösche es, lege 5 wieder an und
schreibe inhalt rein) Dann rufe ich auf der seite die news einzeln
auf mit diesem befehl:

PHP:
 $datei = fopen("News/news1.txt","r");
 if($datei)
 {
  while(!feof($datei))
  {
   $fp = fgets($datei,100);
   echo $fp;
  }
  fclose($datei);
 }

Nur nun kommt mein Problem. Es funktioniert keine Fehlermeldung usw.
aber er bringt auf der Seite wo die News eingelsen werden. Von der
News die als 1. stand und dann ausgelesen wurde und in die news2.txt
geschrieben worden ist nur die letzte Zeile. Wobei ich glaube das es
irgendwie am schreiben liegt, weil in der datei die aufm server liegt
nur die letzte zeile drinne ist. Kann mir einer sagen woran es liegt
und wie ich es beheben kann? Danke schonmal.

[Kommentar Kojote]
Nächstes Mal bitte statt <QUOTE> <PHP> verwenden, das macht
das ganze gleich übersichtlicher. Nur so als Tip für
zwischendurch. Und den Code vielleicht noch ein wenig einrücken.

Btw. mir ist aufgefallen das ein geschlossener Script Tag die
Schließen Klammer von <PHP> aufbricht. Also vorsichtig alle
miteinander, es sei denn ihr steht auf GRÜN. :-)
[/Kommentar Kojote]
 
mh ..

also auf Anhieb sehe ich nur einen "Fehler" :

Das System ist extrem umständlich :)

Aber der Ansatz ist nicht schlecht.

Versuche doch einmal die kompletten News in eine Datei
zu schreiben, dann musst du nicht soviel am Datei-
system rumhandlen. Und wenn du in der einen Datei
noch alles in ein assoziatives Array schachtelst,
kannst du sogar auf einzelne ID's zugreifen.

Du nimmst Datum, Autor und Beitrag und speicherst
sie in ein Array, also ein Feld. Das sieht in etwa
so aus :

PHP:
$news_array = array($datum, $autor, $beitrag);

Ergebniss :

PHP:
Array
(
 Datum
 Autor
 Beitrag
)

Nicht ganz was wir uns vorstellen, ne ?
Schließlich wollen wir mehrere Beiträge darstellen.
Also müssen wir eine weitere Ebene hinzunehmen,
eine weitere DIMENSION. Mehrdimensionale Felder
sind eigentlich garnicht weiter schwer.

PHP:
$news_array[] = array($datum, $autor, $beitrag);

Ergebniss :

PHP:
Array
(
 [0] =
 Array
 (
  Datum
  Autor
  Beitrag
 )
 [1] =>
 Array
 (
  Datum
  Autor
  Beitrag
 )
)

Schonmal nicht schlecht, denn wir haben nun die Möglichkeit
das Array jederzeit neu zu schreiben und einzelne News direkt
anzusprechen (key der ersten Dimension, also 0 oder 1 etc.)
Ausserdem können wir unbegrenzt viele News einfügen und
brauchen nur eine einzige Datei.

Weiter im Kontext. Es wäre doch noch viel besser wenn wir
einzelne Teile des Arrays direkt ansprechen könnten und nicht
jedes Mal den verdammten Index bräuchten. Also beginnen wir
mit einer Assoziation in der 2ten Dimension.

PHP:
 $news_array[] = array("autor" => $autor,
                       "datum" => "2002-07-06",
                       "beitrag" => $beitrag);

Ergebniss :

PHP:
Array
(
 [0] =>
 Array
 (
  [autor] => autor
  [datum] => datum
  [beitrag] => beitrag
 )
 [1] =>
 Array
 (
  [autor] => autor
  [datum] => datum
  [beitrag] => beitrag
 )
)

Das schöne daran ist, das wir jetzt jederzeit einzelne
Elemente des Arrays direkt ansprechen können. Also z.B.
ist $news_array[0][autor] der Autor der News mit der
ID 0. Spricht denke ich für sich, oder ?

Jetzt muss das Array nur noch zusammengebaut und geschrieben
werden. Daß passiert mit folgendem Code :

PHP:
<?php
//Der Name der Datei in die die News gespeichert werden
$news_scource = "news_array.inc.php";

//Wenn gespeichert wird
if($HTTP_POST_VARS[speichern])
{
 //Wenn bereits News existieren
 if(is_file($news_scource)) include($news_scource);

 $autor = $HTTP_POST_VARS[autor];
 $beitrag = $HTTP_POST_VARS[beitrag];

 //Wusste gerade den Befehl nicht genau
 #$datum = getDate();

 //Hier wird die neue News in das Array eingetragen
 $news_array[] = array("autor" => $autor,
                       "datum" => "2002-07-06",
                       "beitrag" => $beitrag);

 //Hier wird das Array schreibfertig gemacht.
 $news_output = "<?php ";
 foreach($news_array as $k => $v)
 {
  $temp_value = '$news_array['.$k.'] = array(';

  $count = count($v) -1;
  $z = 0;

  foreach($v as $temp_k => $temp_v)
  {
    $temp_value .= '"'.$temp_k.'" => "'.$temp_v.'"';
    if($count != $z) $temp_value .= ',';
    $z++;
  }
  $temp_value .= ');';
  $news_output .= $temp_value;
 }
 $news_output .= " ?>";

 $f = fopen($news_scource, "w");
 fwrite($f, $news_output);
 fclose($f);
}
?>

<form action="<?php echo($_SERVER[PHP_SELF]); ?>" method="post">
<input type="text" name="autor" value="">
<input type="text" name="beitrag" value="">
<input type="submit" name="speichern" value="Eintragen">
</form>

Um die News anzuzeigen habe ich erstmal nur einen improvisierten
Code zusammengeschrieben, ich denke du weißt besser was du brauchst.

PHP:
if(is_file("news_array.inc.php"))
{
 require("news_array.inc.php");
 foreach($news_array as $temp_key => $temp_value)
 {
  echo("News ID : ".$temp_key." : ".implode(" ", $temp_value)."<br>");
 }
}

Wenn du Hilfe beim Löschen einzelner News brauchst, melde dich
dann schreibe ich dir noch dazu die Theorie und den Code auf.

Gruß,
Jonathan
 
Danke schonmal echt sehr nett von dir aber ist das ganze jetzt begrenzt? also ich wollte ja nur 6 news anzeigen...Mehr nicht.

Und noch ne weitere Frage em wird das dann an die datei angehängt??? Und nach Datum geordnet?Also so das immer das neuste ganz oben steht?
Wenn nicht wie stell ich das an?Kann ich doch sicher nach der ID ordnen oder?
 
Zuletzt bearbeitet:
punkt 1:

ein Array ist immer nach ID's bzw. INDIZIES sortiert.

Ansonsten gibt es für Array's noch den Befehl sort.
Zu finden : http://www.php.net/manual/en/function.sort.php

Punkt 2:
Was du anzeigst, bleibt ja dir überlassen.
Wenn du nur 6 News anzeigen möchtest, holst
du dir aus dem Array eben nur 6 Keys raus
und gibst diese dann aus. Eigentlich ganz
einfach.

Du kannst auch nur einzelne News rausholen,
wenn du möchtest. Oder nur die Titel anzeigen
und auf einen Klick dann den ganzen Beitrag.
Dafür musst du halt das Assoziative Array
um eine Stelle erweitern.

Du überschreibst immer die ganze Datei mit
den alten News und allem was eben noch dazu
gekommen ist. Wenn bereits 6 Keys vorhanden sind,
kannst du ja die Eingabe sperren.

Und bevor du es in die Datei schreibst sortierst
du dann einfach die erste Dimension des Arrays.

Gruß Jonathan
 
em sorry...

aber hab von arrays noch nicht so viel plan, das sortieren krieg ich sicher hin...Aber das mit den arrays also das nur 6 ausgelesen werden könntest du mir das erklären bzw. aufschreiben :D *bittttteeeee*
 
das geht ganz einfach mit einer for-schleife.

PHP:
for($a = 0; $a <= 5; $a++){
echo $array[$a];
}

die for schleife läuft setzt die variable $a auf 0.
dann läuft sie so oft durch, bis die bedingung $a <=5 nicht mehr erfüllt wird.
bei jedem durchlauf wird $a um eins erhöht.
also werden die array-einträge 0-5 ausgegeben, genau 6 stück.
 
Zurück