auto archivierung für newsscript

redback79

Erfahrenes Mitglied
hallo erst mal...

ich habe auf für meine seite ein news-script "gebastelt", dass auch prächitg funktioniert... :-)

bisher habe ich es so gelöst, dass einräge die alter als zwei monate sind automatisch archiviert werden und dann über das newsarchiv abgerufen werden können...

nun das problem:
im gengensatz zu "früher" möchte ich nun, dass lediglich die fünf aktuellsten newseinträge angezeigt werden und der 6te eintrag automatisch archiviert wird...

leider habe ich keine ahnung wie ich das angehen soll!?!?

hier mal der code wie die archivierung bisher funktionierte:

PHP:
...

//verbindung zur datenbank herstellen
if (!($verbindung = mysql_pconnect ("localhost", "username", "password")))
	{
	echo("Der Verbindungsaufbau ist fehlgeschlagen!<p>");
	exit();
	}

mysql_select_db("neuigkeiten"); 

$anzahl_eintraege = mysql_num_rows ($sqlanfrage); //prüfen, ob überhaupt einträge vorhanden sind

// kontrolle ob eintrag älter ist als 2 monate, wenn ja, dann archivieren!!! (anmerkung: 1 = neu / 2 = archiviert)
if ($anzahl_eintraege > 0) { //falls einträge vorhanden sind..

       $sqlkommando_2 = "select * FROM eintrag where archiv = 1"; 
       $sqlanfrage_2 = mysql_query($sqlkommando_2); 

    while($daten1 = mysql_fetch_object($sqlanfrage_2)) {
      //echo "$daten->id"; 
      $erstelldatum = $daten1->id;
      $aktuelldatum = time();
      $zeitdifferenz = bcsub ("$aktuelldatum", "$erstelldatum"); //achtung! nicht alle server beherrschen den befehl bcsub(); ! -> PHP muss dafür speziell eingerichtet sein!
      
      if ($zeitdifferenz > 5184000) { //5184000 = 2 monate in sekunden!
       $sqlkommando_1 = "update eintrag set archiv = 2 "; 
       $sqlanfrage_1 = mysql_query($sqlkommando_1); 
       $wieviele = mysql_affected_rows ();
       
      }
 
    } //end while!
}

...

könnt ihr mir weiterhelfen?

THX im voraus

redback
 
Als erstes würde ich das Script vereinfachen.
Mache doch einfach nur EIN update, mit den Bedingungen des Datums...
Dann sparst du dir schon mal viel. Das für das bestehende script.

Für die Anzeige von 5 aktuellen, und der Archivierung der anderen würde ich folgendes vorschlagen:

Du hast ja ein datumsfeld, anhand dessen das eintragsdatum festzustellen ist.
deaktiviere ALLE news.
Danach kannst du einfach die top 5 selecten, den dadurch entstandenen rowset mit ner schleife durchgehen, und dann aktiv auf 1 setzen...

vielleicht nicht das schönste, aber sollte gehen...
 
ich gehe jetzt mal davon aus, dass du ein id feld hast, dass per auto_increment läuft, und immer um 1 erhöht.

PHP:
$query = "UPDATE eintrag SET archiv = 1 WHERE id < max(id)-5";
mysql_query($query);

danach kannst du eine schleife durchlaufen, die alle einträge anzeigt, die archiv = 0 "haben".
 
Zuletzt bearbeitet:
vielen dank für die anregungen!

@brÅinstorm: leider hab ich kein auto_increment feld (was sich natürlich ändern liesse)... die eindeutige zuordung der datenreihen geschieht einzig über das erstelldatum! (erstelldatum = id)





ganz einfach ausgedrückt, will ich all diejenigen einträge, die nicht angezeigt werden mit archiv = 2 "versehen"...

das mit der ausgabe krieg ich schon hin (da gibts ja diverse varianten z.b über den MySQL befehl "...order bei id desc limit 0,5")

das eigentliche problem beschränkt sich darauf, wie ich alle andern einträge (die nicht angezeigt werden) ausfindig mache... :-)

mfg redback

ps. ich sollte vielleicht mal nachhilfeunterricht in sachen "erklärungen" nehmen... :-)
 
du solltest unbedingt ein feld id mit auto_increment machen..
aber nunja, natürlich kannst du es auch anders lösen.

mit der funktion mktime kannst du aus deinem datum ein timestamp erstellen, dann setzt du alles was kleiner als time()-432000 (5 tage wenn ich mich nicht verrechnet habe) zu archiv=1
 
Ich versteh zwar nicht warum du umbedingt eine spalte in der tabelle für 'archiv' reservierst aber wenns spass macht :-)

Wäre, meiner Meinung nach, sehr viel einfacher einfach ein
Code:
... ORDER by datum DESC LIMIT 0,5
reinzuhauen und unter den news nen kleines Form einzubauen ähnlich
Code:
Newsarchiv
News der letzten [inputfeld] Tage [submitfeld=>anzeigen]
kleiner Bsp-Auszug der archiv.php:
PHP:
if (!isset($tage) OR $tage == "")
   $tage = 30; 
$date = time()-60*60*24*$tage;
$query = mysql_query("SELECT * FROM x_news WHERE (datum >= $date) ORDER by datum DESC",$db) or DIE('MySQL-Fehler: '.mysql_error());
$tage stammt aus dem inputfeld oben.

edit: Ups, redback hat die Variante mit LIMIT scho erwähnt =), sry

Beste Grüße, Morph
 
Zuletzt bearbeitet:
ahhhhhhhhhhhhhhhhhhh!

so ein aha erlebnis tut immer wieder gut! *brettvordenkopfschlag*

-> ich hab nun verstanden was ihr mir mit "wozu das archiv feld?" sagen wolltet... :-)


...ich es aber trotzdem gebraucht, da ich zwei php dateien habe! die datei news.php liest nur diejenigen einträge aus, die archiv = 1 gesetzt haben und archiv.php diejenigen, die archiv = 2 haben...
(hab jetzt einfach ein zurück, weiter system mit jeweils 5 einträgen erstellt, damit vermeide ich die riesen kette an newseinträgen auch bestens..)


@Morph: deinen vorschlag werd ich gleich berücksichtigen! ;-)


danke an alle!
 
Zurück