Einträge zusammenfassen bzw. voraussehen, was kommt?

lisali

Erfahrenes Mitglied
Hallo,

ich möchte anzeigen, wenn jemand ein Bild hochgeladen hat. Das klappt auch alles.

Jetzt habe ich aber z.B. einen User, der 4 Bilder nacheinander hochlädt, aber der Schleifendurchgang kann ja nicht voraussehen was noch kommen wird... also, dass da noch was vom selben User kommt, dass ich nicht zusammenfassen kann, dass mehrere Bilder hochgeladen werden.

Ich gebe nämlich jeden Schleifendurchgang entsprechende Ausgabe aus.

Was gibt es da für Möglichkeiten, damit ich die einzelnen Einträge zu einem zusammenfassend ausgeben kann?
 
Du kannst die Ausgaben in einem Array speichern oder einer einfachen Variable mit einer Zeichenkette und sie nach der Schleife ausgeben. Oder meinst du etwas anderes? Falls dem so sei, wäre es nett, wenn du dein Problem etwas genauer erklären würdest.
 
Das ist irgendwie echt problematisch.

Mein Schema ist nämlich so:

- Daten holen von DB
- Schleife, wo alles ausgelesen wird und mit if's und elseif's prüfen, ob neuer Kommentar, neue Freundschaft zwischen jmd, usw.
- Alles wird jeweils in Variablen gespeichert und ganz am Ende der Schleife wird es ausgegeben (innerhalb der Schleife aber nach den if-Abfragen)


Jetzt weiß ich echt nciht wie ich es konstruiieren könnte, dass ich z.B. einen einzelnen User anzeigen würde, der bestimmte Aktionen mehrfach gemacht hat. Z.B. mehrere Fotos hcohgeladen oder mehrere Freundschaften geschlossen...?
 
Du könntest doch eine neue Tabelle anlegen und darin die Nutzerkennung (ID), den Zeitstempel und die Aktion speichern. Ich verstehe dein Problem jetzt schon eher, aber so wirklich bin ich mir nicht sicher, wo denn jetzt die Schwierigkeit liegt.
 
Ich habe ja eine users_log Tabelle. Dort wird Sender-UID und query gespeichert. Ich lese aus dem Query dann alles aus.

Beispielcode:

PHP:
while ($log = mysql_fetch_array($result))
	{
	parse_str($log['query'], $q);

	$me = "<span class='f14'>".username($log['uid'])."</span> ";
	if ($q['do'] == 'fship')
	{ # --- Freundschaft geschlossen:
	$icon = "<span style='display:inline-block; background:url(img/icon/iconLib.png) 0 -64px no-repeat; height:13px; width:20px'></span>";
	$str = "ist jetzt mit ".username($q['id'])." befreundet.</li><li style='padding-top:8px'>".pimg($log['uid'],33,45,0,1)." ".pimg($q['id'],33,45,0,1)."";
	$table = "users_log";
	}
	elseif ($q['do'] == 'login')
	{ # --- Neu angemeldet:
	$icon = "<span style='display:inline-block; background:url(img/icon/iconLib.png) 0 -77px no-repeat; height:14px; width:20px'></span>";
	$str = "hat sich gerade neu angemeldet.";
	$table = "users_log";
	}	

[...]

// Dann die Ausgabe-Speicherung nach den if-Abfragen:

$output .=  "<li style='padding-bottom:10px'>".$icon." ".$me."".$str."</li><li class='f12' style='clear:left; padding:3px 0 10px 0'>".timediff($log['date'])." ".like($q['cid'],$table)."</li>";

}

// Das ganze ist eine Funktion, also return:
return $output;

Weißt du jetzt mehr, was ich meine?
 
Ich rate einfach mal drauf los: es gibt verschiedene Ereignisse, welche beliebig oft auftreten können. Du willst diese dann ausgeben, aber, nicht wie es jetzt zu sein schein, nicht chronologisch, sondern gruppiert. Ist das jetzt richtig?
 
Fast.

Ich möchte auf jeden Fall chronologisch sortieren, jedoch auch chronologisch-gruppiert sortieren. Wenn A zum Beispiel mit B und C befreundet ist und der Zeitabstand zwischen der Freundschaft mit B und C geringer als 24h ist, dann wird gruppiert.

Der selbe Fall würde auch bei Bilder-Uploads eintreten.

Wenn man aber jedoch z.B. seinen Beziehungsstatus einträgt, wird einfach nur das DATE geupdated. Also ist dies ein Sonderfall. Aber das habe ich bereits hingekriegt.

Es geht eher um die chronologische Sortierung, weil das mit meinem Schema nicht funktionieren kann. WEIL ich eben direkt in $output den String speicher.
 
Die Daten sind, wie ich vermute, generell chronologisch sortiert. Das ist schon mal ein guter Ansatz. Jetzt nimmst du eben ein Array und speicherst dort jeweils die Daten für Ereignis A, für Ereignis B, für Ereignis C ... ab und speicherst außerdem noch den Zeitstempel des Datensatzes und überspeicherst es je mit dem letzten und somit neusten Zeitstempel. Somit kannst du am Ende die Ereignisse auch chronologisch anzeigen und setzt danach auch die Ausgabe zusammen. War das verständlich oder soll ich es noch einmal versuchen?
 
Ich danke dir für die Mühe, aber so ganz klar ist mir das noch nicht. Ich meine, der Zeitstempel in "users_log" ist ja bereits gespeichert. Das heißt, dass ich da ja bereits vergleichen könnte, wo die Zeitdifferenzen liegen.

Kannst du mir deine geschilderte Methode code-technisch beispielhaft erläutern?
 
Also die Unterscheidung, ob ein Eintrag erst in den letzten 24 Stunden erschienen ist, würde ich direkt in MySQL treffen. Aber das ist jetzt nicht das Problem.

Annahme:
PHP:
$events = array(
  0 => array(
    'event' => 'friendship',
    'date' => '2010-11-19 19:03'
    ),
  1 => array(
    'event' => 'relationship',
    'date' => '2010-11-19 19:05'
  ),
  2 => array(
    'event' => 'friendship',
    'date' => '2010-11-19 19:06'
    ),
  3 => array(
    'event' => 'login',
    'date' => '2010-11-19 19:45'
   )
  );

$output = array();

Skript:
PHP:
foreach($events as $event) {
  switch($event['event']) {
    case 'friendship':
      $output['friendship']['value'] .= 'Neue Freundschaft';
      $output['friendship']['date'] = $event['date'];
      break;
    case 'relationship':
      $output['relationship']['value'] .= 'Neuer Beziehungsstatus';
      $output['relationship']['date'] = $event['date'];
      break;
    case 'login':
      $output['login']['value'] .= 'Jemand hat sich angemeldet';
      $output['login']['date'] = $event['date'];
      break;
  }
}

return $output['friendship'] . $output['relationship'] . $output['login'];
 
Zurück