Progressmar soll zusammengefasst werden

M4URIC3

Grünschnabel
Hallo,
ich habe mir einen Uptime Script gebaut der mir die letzten 24 Stunden also 1440 Minuten anzeigen soll, Problem nur ich möchte das alles zusammengefasst wird.

So soll es sein:

Von 22:00 bis 06:00 Online
Von 06:00 bis 07:00 Offline
Von 07:00 bis 22:00 Offline

und nicht so:

Um 22:00 Online
Um 22:01 Online
Um 22:02 Online
Um 22:03 Online
Um 22:04 Online
etc...


Mein Code:
PHP:
echo '<div class="progress" style="width: 98%">';
						for($i=1440; $i>=0; $i--){
							$time = time()-60*$i;
							$date = date('YmdHi', $time);
							$result2 = mysql_query("SELECT status FROM uptime_status WHERE date='$date' AND owner='{$domain_row['id']}'");
							$num_row = mysql_num_rows($result2);
							if($num_row == 0){
								echo date('d.m.Y H:i', $time) .' Uhr | Nicht gefrüft';
							} else if ($num_row == 1){
								$row2 = mysql_fetch_array($result2);
								
								if($row2['status'] == 0){
								$status = 'danger';
								$text = "Offline";
								}else if($row2['status'] == 1){
								$status = 'success';
								$text = "Online";
								}
								
								echo date('d.m.Y H:i', $time) .' Uhr | '. $text;
							} else {			
								echo date('d.m.Y H:i', $time) .' Uhr | Nicht gefrüft';
							}		
						}
						echo '</div>';


wahre nett wenn mir da jemand weiterhelfen könnte.

MFG

Maurice
 
Man könnte es in SQL lösen - siehe weiter unten.

Aber wahrscheinlich ists über PHP schneller und einfacher zu verstehen

PHP:
include_once 'connect.php';
// Daten schon richtig sortiert auslesen
$sql = "SELECT stat, date FROM test_per ORDER BY date";
$result = mysql_query($sql);

$lastState = '';
$cnt = 0;
$states = array();
//Alle Einträge durchgehen
while(list($state, $date)  = mysql_fetch_row($result)){
    if($lastState != $state){
        // Statuswechsel
        $states[++$cnt]['start'] = $date;
        //beim neuen Eintrag noch den Status hinzufügen
        $states[$cnt]['state'] = $state;
        //Den letzten Status anpssen
        $lastState = $state;
    }
    // Das Schlussdatum wird überschreiben bis zum nächsten $cnt
    $states[$cnt]['end'] = $date;    
}

print_r($states);


Oder per SQL
SQL:
SELECT
	d2.stat,
	MAX(d2.start_date) AS from_date,
	MAX(d2.end_date) AS to_date
FROM
	(
		SELECT 
			CASE WHEN @last_state <> d1.stat THEN (@cnt := @cnt + 1) ELSE @cnt END AS cnt,
			@last_state:= d1.stat,
			d1.*
		FROM 
			(SELECT @cnt := 0, @last_state='') AS vars,
			(
				SELECT 
					*
				FROM 
					(
						SELECT
							 CASE WHEN @last_state <> dat.stat THEN date ELSE '' END AS start_date,
							 NULL AS end_date,
							 @last_state:= dat.stat AS stat
						FROM
							(SELECT @last_state:='') AS vars,
							test_per AS dat
						ORDER BY
							dat.id 
					) AS start_dat
				WHERE
					start_date != ''					
				UNION ALL 
				SELECT *
				FROM 
					(
						SELECT
							NULL AS start_date,
							CASE WHEN @last_state <> dat.stat THEN date ELSE '' END AS end_date,
							 @last_state:= dat.stat AS stat
						FROM
							(SELECT @last_state:='') AS vars,
							test_per AS dat
						ORDER BY
							dat.id DESC 
					) AS end_dat
				WHERE
					end_date != ''
				ORDER BY
					IFNULL(start_date, end_date)
			) AS d1
	) AS d2
GROUP BY
	d2.cnt
 
Zuletzt bearbeitet von einem Moderator:
Ich hab das noch nicht so verstanden, vielleicht hilft euch der Auszug aus der Datenbank, damit ihr versteht wie ich das meine:

id status date timestamp

1 1 201301122304 1358028241
2 1 201301122321 1358029261
3 1 201301122305 1358028301
4 2 201301122320 1358029201
5 1 201301122306 1358028361
6 1 201301122319 1358029141
7 1 201301122307 1358028421
8 1 201301122318 1358029081
9 1 201301122308 1358028481
10 1 201301122317 1358029021
11 1 201301122309 1358028541
12 1 201301122316 1358028961

PS: ich habe das mal getestet das Ergebnis sieht so aus:

Array ( [1] => Array ( [start] => 201301122304 [state] => 1 [end] => 201301211748 ) [2] => Array ( [start] => 201301211748 [state] => 0 [end] => 201301211748 ) [3] => Array ( [start] => 201301211749 [state] => 1 [end] => 201301211749 ) [4] => Array ( [start] => 201301211749 [state] => 0 [end] => 201301211749 ) [5] => Array ( [start] => 201301211750 [state] => 1 [end] => 201301211750 ) [6] => Array ( [start] => 201301211750 [state] => 0 [end] => 201301211750 ) [7] => Array ( [start] => 201301211751 [state] => 1 [end] => 201301211751 ) [8] => Array ( [start] => 201301211751 [state] => 0 [end] => 201301211751 ) [9] => Array ( [start] => 201301211752 [state] => 1 [end] => 201301211752 ) [10] => Array ( [start] => 201301211752 [state] => 0 [end] => 201301211752 ) [11] => Array ( [start] => 201301211753 [state] => 1 [end] => 201301211753 ) [12] => Array ( [start] => 201301211753 [state] => 0 [end] => 201301211753 ) [13] => Array ( [start] => 201301211754 [state] => 1 [end] => 201301211754 ) [14] => Array ( [start] => 201301211754 [state] => 0 [end] => 201301211754 ) [15] => Array ( [start] => 201301211755 [state] => 1 [end] => 201301211755 ) [16] => Array ( [start] => 201301211755 [state] => 0 [end] => 201301211755 ) [17] => Array ( [start] => 201301211756 [state] => 1 [end] => 201301211758 ) [18] => Array ( [start] => 201301211758 [state] => 0 [end] => 201301211758 ) [19] => Array ( [start] => 201301211759 [state] => 1 [end] => 201301211759 ) [20] => Array ( [start] => 201301211759 [state] => 0 [end] => 201301211759 ) [21] => Array ( [start] => 201301211800 [state] => 1 [end] => 201301211800 ) [22] => Array ( [start] => 201301211800 [state] => 0 [end] => 201301211800 ) [23] => Array ( [start] => 201301211801 [state] => 1 [end] => 201301211801 ) [24] => Array ( [start] => 201301211801 [state] => 0 [end] => 201301211801 ) [25] => Array ( [start] => 201301211802 [state] => 1 [end] => 201301211802 ) [26] => Array ( [start] => 201301211802 [state] => 0 [end] => 201301211802 ) [27] => Array ( [start] => 201301211803 [state] => 1 [end] => 201301211803 ) [28] => Array ( [start] => 201301211803 [state] => 0 [end] => 201301211803 ) [29] => Array ( [start] => 201301211804 [state] => 1 [end] => 201301211804 ) [30] => Array ( [start] => 201301211804 [state] => 0 [end] => 201301211804 ) [31] => Array ( [start] => 201301211805 [state] => 1 [end] => 201301211805 ) [32] => Array ( [start] => 201301211805 [state] => 0 [end] => 201301211805 ) [33] => Array ( [start] => 201301211806 [state] => 1 [end] => 201301211806 ) [34] => Array ( [start] => 201301211806 [state] => 0 [end] => 201301211806 ) [35] => Array ( [start] => 201301211807 [state] => 1 [end] => 201301211807 ) [36] => Array ( [start] => 201301211807 [state] => 0 [end] => 201301211807 ) [37] => Array ( [start] => === Gekürzt ===
 
Zuletzt bearbeitet:
Bitte einen Dump der Tabelle mit phpMyAdmin erstellen damit wir die Tabelle erstellen und die Testdaten einfügen können. Hab grad keine Lust alle Daten abzutippen.

Was hat date für ein Format?
Was ist timestamp?

Die Testdaten stimmen nicht mit dem Resultat überein
Die folgenden date finde ich in den Beispieldaten NICHT
Code:
Array ( 
    [1] => Array ( 
        [start] => 201301122304 
        [state] => 1 
        [end] => 201301211748 ) 
    [2] => Array ( 
        [start] => 201301211748     <- gibts ind en Testdaten nicht
        [state] => 0                <- state=0 gibts in den Testdaten nicht
        [end] => 201301211748 ) 
    [3] => Array ( 
        [start] => 201301211749 
        [state] => 1 
        [end] => 201301211749 ) 
    [4] => Array ( 
        [start] => 201301211749 
        [state] => 0 
        [end] => 201301211749 ) 
    [5] => Array ( 
        [start] => 201301211750 
        [state] => 1 
        [end] => 201301211750 ) 
    [6] => Array ( 
        [start] => 201301211750 
        [state] => 0 
        [end] => 201301211750 )
    ...
)

Da die Daten nciht in der Richtigen Reihenfolge sind, musst du sie natürlich nach date und ev. timestamp (was immer das bei dir auch ist) sortieren
 
Ok, ich habe jetzt mal ein Backup von der MySQl-Datenbank gemacht. Theoretisch müssten die letzten 24-Stunden "Von 00:00 dd.mm.YY bis 00:00 dd.mm.YY Online" sein.
 

Anhänge

  • uptime_status.sql.zip
    433,7 KB · Aufrufe: 6
So, mein Code kurz umgeschrieben damit nach timestamp sortiert wird und schon hat mans richtig
PHP:
<pre>
<?php
include_once 'connect.php';
// Daten schon richtig sortiert auslesen
$sql = "SELECT status, timestamp FROM uptime_status ORDER BY timestamp";
$result = mysql_query($sql);

$lastState = '';
$cnt = 0;
$states = array();
//Alle Einträge durchgehen
while(list($state, $timestamp)  = mysql_fetch_row($result)){
    if($lastState != $state){
        // Statuswechsel
        $states[++$cnt]['start'] = date( 'Y-m-d H:i:s', $timestamp);
        //beim neuen Eintrag noch den Status hinzufügen
        $states[$cnt]['state'] =  $state;
        //Den letzten Status anpssen
        $lastState = $state;
    }
    // Das Schlussdatum wird überschreiben bis zum nächsten $cnt
    $states[$cnt]['end'] =  date( 'Y-m-d H:i:s', $timestamp);    
}

print_r($states);
?>
</pre>

Ausgabe:
Code:
Array
(
    [1] => Array
        (
            [start] => 2013-01-12 23:04:01
            [state] => 1
            [end] => 2013-02-01 23:52:01
        )

    [2] => Array
        (
            [start] => 2013-02-01 23:53:02
            [state] => 0
            [end] => 2013-02-01 23:54:01
        )

    [3] => Array
        (
            [start] => 2013-02-01 23:55:01
            [state] => 1
            [end] => 2013-02-11 14:06:01
        )

    [4] => Array
        (
            [start] => 2013-02-11 14:07:01
            [state] => 0
            [end] => 2013-02-11 14:07:01
        )

    [5] => Array
        (
            [start] => 2013-02-11 14:08:01
            [state] => 1
            [end] => 2013-02-18 18:59:01
        )

)
 
Zurück