Sortieren und Group BY

Hallo lisali,

PHP ist toll :-) strtotime () wandelt dir ein SQL-Date (YYYY-MM-DD) oder auch ein SQL-Datetime (YYYY-MM-DD HH:MM:SS) in einen Timestamp um.

PHP:
$tsEntry = strtotime ($m_date);
$secondsElapsed = $_SERVER ['REQUEST_TIME'] - $tsEntry;

$timediff = timediff ($secondsElapsed);

Du wirst dich sicherlich fragen, warum ich für den aktuellen Timestamp anstatt time () den Wert aus dem Superglobal-Array mittels $_SERVER ['REQUEST_TIME'] hole - time () ist sehr viel langsamer und das Ergebnis ist das gleiche (wenn das Script nicht gerade mehrere Sekunden läuft). Der Wert im Superglobal Array muss nicht erst über eine Datums Funktion geholt werden, sondern liegt direkt vor. Klar ist das schon ziemlich kleinkariert, aber die Summe der kleinen Unterschiede machen die Henne fett.

Sicherlich gehen auch alle anderen beschriebenen Wege, aber mit Blick auf die Performance sind sie eben suboptimal. Meine Empfehlung ist, auch wenn du im Moment "nur" 100 User hast, bereits jetzt so zu programmieren, dass deine Scripte zu einem späteren Zeitpunkt einem größeren Ansturm gewachsen sind. Nichts ärgert Besucher mehr, als eine lahmende Website. Wenn die Seite erst einmal langsam ist, hast du mit einem Schlag sehr viele Baustellen. Und glaub mir, dieser Zustand tritt quasi schlagartig ab einem bestimmten Schwellwert an Besuchern ein. Datenbanken sind hier leider erbarmungslos. Daher lieber jetzt viel Hirnschmalz rein stecken, als später die Reue zu zahlen. Letztendlich unterscheidet diese Art der Herangehensweise meiner Meinung nach einen guten von einem schlechten Programmierer.

Grüße BN
 
Ach, ich freu mich immer über einen Beitrag von dir... der ist immer so höchstqualitativ! :)

Ist es denn auch so bei selbstgeschriebenen Funktionen, dass wenn ich denke, dass bestimmte Sachen einfach "etwas mehr" Schreibarbeit machen eine Funktion lieber lassen sollte und es direkt hinschreiben?

Ich hab z.B. eine Funktion, die schneidet mir ein Wort zurecht, indem ich Variable und Länge angebe: shortStr($var,$len)

... und setzt dann zusätzlich an diesem String am Ende noch 3 Pünktchen hin: "..."

Ich finde das ganz praktisch, aber ist diese relativ kleine Funktion in Bezug auf die Performance nicht so "gut"?


Und was hälst du von meiner timediff-Funktion? Ist das gut, dass ich alles von Sekunden aus rechne oder wären andere Varianten mit Minuten oder sonstiges "schlauer" oder "besser"?

Dankeschön!
 
danke :-)

Nun Funktionen oder auch Klassen machen immer dann Sinn, wenn Code an mehreren Stellen in gleicher Form auftritt. Es sollte vermieden werden, Code zu doppeln (DRY - don`t repeat yourself). Funktionen sind daher unbedingt erforderlich. Zumal die Wartbarkeit des Codes dadurch erheblich gesteigert wird. Denn ist mal eine Änderung erforderlich, so kann diese an zentraler Stelle innerhalb der Funktion bzw. der Klasse vorgenommen werden.

Wie gut deine Funktion im Bezug auf die Performance ist, kann ich dir nicht sagen. Es kommt darauf an, wie du sie definiert hast. Wichtig ist es aber neben dem Blick auf die Performance auch einen Blick auf die Funktionsweise seiner Software zu werfen. Was nützt schon schneller Code, wenn die Software nicht bedienbar ist :-). Deine "Weiterlesen"-Funktion ist definitiv sinnvoll.

Einige Stellen deiner timediff-Funktionen erscheinen mir unlogisch und ungenau. ich habe sie etwas "aufgeräumt" aber die Ungenauigkeit bei Monat und Jahr gelassen. Hier kommt es auf Genauigkeit sicherlich nicht allzu sehr an. Grundsätzlich sind mathematische Operationen schneller als String-Operationen. Die Geschwindigkeit wird ohne es getestet und mit Alternativen verglichen zu haben gut sein.
PHP:
function timediff ($seconds) 
{
    // Umrechnung von Sekunden in Minuten, Stunden, Tagen, Wochen, Monaten, Jahre:
    $mins   = ( $seconds / 60 % 60 );
    $hours  = ( $seconds / 60 / 60 % 60 );
    $days   = ( $seconds / 24 / 60 / 60 % 60 );
    $weeks  = ( $seconds / 7 / 24 / 60 / 60 % 60 );
    $months = ( $seconds / 4 / 7 / 24 / 60 / 60 % 60 ); // ungenau
    $years  = ( $seconds / 12 / 4 / 7 / 24 / 60 / 60 % 60 ); // ungenau
	
	$timediff = null;
	
	// Wenn <= 2 Tage (172.800 Sekunden)
    if ($seconds<=172800)
    {
		if ($hours!=0) return "<strong>".$hours."</strong>h";
		if ($mins>=1)  return "<strong>".$mins."</strong>min";
		
		return "<strong>".$seconds."</strong>sec";
    }
    
	// Wenn > 2 Tage (172.800 Sekunden) und < 1 Woche (604.800 Sekunden)
	if ($seconds>172800 && $seconds<604800) 
    {
		return "<strong>".$days."</strong>d";
    }
	
	// Wenn >= 1 Woche (604.800 Sekunden)
	if ($weeks<=4)   return "<strong>".$weeks."</strong>w";
	if ($months<=11) return "<strong>".$months."</strong>mon";
	
	return "<strong>".$years."</strong>y";
}

Ich mag es, wenn aus Funktionen "returned" wird, sobald es möglich ist. Das hält Schachtelungen sehr flach, ist aber Geschmacksfrage. Bezüglich deiner timediff Funktion wirf vielleicht mal einen Blick auf http://de2.php.net/manual/en/datetime.diff.php .

Grüße BN
 
Ah, alles klar, danke!

Aber jetzt, nachdem ich deinen letzten Absatz gelesen habe, ist meine Funktion doch eigentlich völlig überflüssig, oder?

Ich hab den Link angeguckt und dort in den Kommentaren hat jemand diese Funktion geschrieben:

PHP:
<?php
function pluralize( $count, $text ) 
{ 
    return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
}

function ago( $datetime )
{
    $interval = date_create('now')->diff( $datetime );
    $suffix = ( $interval->invert ? ' ago' : '' );
    if ( $v = $interval->y >= 1 ) return pluralize( $interval->y, 'year' ) . $suffix;
    if ( $v = $interval->m >= 1 ) return pluralize( $interval->m, 'month' ) . $suffix;
    if ( $v = $interval->d >= 1 ) return pluralize( $interval->d, 'day' ) . $suffix;
    if ( $v = $interval->h >= 1 ) return pluralize( $interval->h, 'hour' ) . $suffix;
    if ( $v = $interval->i >= 1 ) return pluralize( $interval->i, 'minute' ) . $suffix;
    return pluralize( $interval->s, 'second' ) . $suffix;
}
?>

Das ist eigentlich das selbe wie meine Funktion, oder? Wahrscheinlich ist diese sogar noch schneller..?
 
:-) oft muss das Rad nicht neu erfunden werden. Ob die Funktion nun performanter ist als deine weiß ich nicht. Aber sie liest sich in jedem Fall besser.

Grüße BN
 
Bei der Funktion will der aber irgendein anderes Datumsformat... muss ich da auch erstmal strotime benutzen?
 
Nein übergebe einfach den Inhalt des DB-Feldes (Date oder Datetime) ohne ihn mittels strtotime umzuwandeln. Das sollte klappen.

Grüße BN
 
Hi,
ist das Problem schon gelöst? Ich würde erstmal noch eine Config-Tabelle erstellen, dann Max_PMS festlegen.

PHP:
<?php

$config = mysql_query("SELECT max_pms FROM CONFIG");		
$config = mysql_fetch_object($query[config]);
		
$result = mysql_query("SELECT m.id AS message_id , 
				m.`text`,
				m.`sid`,
				u.`uid` AS username,	
				m.`status` AS status,
				m.`title` AS title,
			DATE_FORMAT(`date`,'%d.%m.%Y, %H:%i') AS shortdate,
			TIMESTAMPDIFF(SECOND,`date`,NOW()) AS sec,	   
			FROM `messages` m LEFT JOIN `user`s u ON u.`id` = m.`sid`
			WHERE u.`uid` = '".$_SESSION['id']."' AND u.`uid`_delete='0'
			ORDER m.`id` BY DESC");   

$result2 = mysql_query("SELECT m.id AS message_id ,
            FROM `messages` m LEFT JOIN `user`s u ON u.`id` = m.`sid`
			WHERE u.`uid` = '".$_SESSION['id']."' AND u.`uid`_delete='0' ");
			
$max_pms_ = ($config->max_pms - mysql_num_rows($result2);
$max_pms = str_replace("-", "", $max_pms_);			

if (mysql_num_rows($result2) > $config->max_pms) {
	$message_limit = . $max_pms . "sind zu viele Nachrichten.";
} else {
	$message_limit = '';
}

?>

Somit sind die Nachrichten nach dem User und der Id geordnet und auch die maximale Nachrichtenzahl wird eingehalten.
In der Ausgabe musst du dann nur noch Titel, Text und vom welchem User die Nachricht kommt verarbeiten.

Was hast du eigentlich mit Status vor?

Und habe ich dich richtig verstanden, du möchtest, dass wenn ich mit dir schreiben würde, es im Posteingang nur als eine E-Mail aufgelistet wird, aber der ganze Verlauf zu sehen ist.

Gruß
Matze
 
Zuletzt bearbeitet:
Zurück