7.4k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von max1511 Einsteiger_in (47 Punkte)
Hallo Zusammen

Ich hab das Problem, dass eine PHP Datei Werte von der MySQL holt. MySQL 5.x hat, so viel ich verstanden habe, den maximalwert von 838:59:59. Die Werte werden mit den folgenden Zeilen geholt:

$query = "SELECT sec_to_time(sum(time_to_sec(TotalBlockTime))) FROM flights ".$condition;
$result=mysql_query($query);
$TFT = mysql_result($result,0);

Ehrlich gesagt, hab ich keine Ahnung in diesem Gebiet. Wie muss der Code lauten, damit die PHP Datei einen höheren Wert als 838:59:59 anzeigen kann, z.B. 901:15:31?

Grüsse
Alexander

21 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Wenn dir MySQL diese Einschränkung gibt, dann lös es doch in PHP:

$query= 'SELECT sum( time_to_sec( TotalBlockTime ) ) FROM flights '. $condition;
$result= mysql_query( $query );
$zahl= mysql_result( $result, 0 );

function int_int_divide( $x, $y ) {
return ( $x- ( $x% $y ) )/ $y;
}

$seconds= $zahl% 60;
$zahl= int_int_divide( $zahl, 60 );
$minutes= $zahl% 60;
$zahl= int_int_divide( $zahl, 60 );
$hours= $zahl;

$text= sprintf( '%02d:%02d:%02d', $hours, $minutes, $seconds );



echo $text;
0 Punkte
Beantwortet von dapascha Mitglied (541 Punkte)
Um was für Werte handelt es sich dabei genau? Sollen das Stunden, Minuten und Sekunden sein?
Wenn das so ist, dann würde ich die Sekunden als Timestamp in der Datenbank speichern und die Berechnung nach der Methode der ersten Antwort machen.

Hier ein Beispiel:

$timestamp = 86400;

// Ermittlung der Sekunden
$sec = $timestamp % 60;
// Entfernung der Sekunden
$timestamp = (int) ($timestamp / 60);
// Ermittlung der Minuten
$min = $timestamp % 60;
// Entferungg der Minuten, übrig bleiben die Stunden.
$timestamp = (int) ($timestamp / 60);

printf( '%02d:%02d:%02d', $timestamp, $min, $sec);

Ausgabe:
24:00:00

MfG DaPascha
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Speichere am besten die Sekunden direkt als INT oder BIGINT-Feld in der Datenbank, wenn dir die ~838 Stunden nicht ausreichen. Aber vorsicht, unter 32-bit-Versionen von PHP können maximal Werte zwischen −2,147,483,648 und +2,147,483,647 in einer Ganzzahl-Variable gespeichert werden, bevor es zu Überläufen kommt (d.h. ein positiver Wert größer als +2,147,483,647 wird plötzlich als negativer Wert angezeigt.)
0 Punkte
Beantwortet von max1511 Einsteiger_in (47 Punkte)
Vielen Dank an euch dreien.

son_quatsch, deine Lösung hat mich fast zum Ziel gebracht. Deine Lösung funktioniert soweit, nur hab ich noch ein Problem. Nun wird das Resultat auf der Webseite am falschen Ort angezeigt. Ich hab versucht, $zahl in $TFT zu ändern. Danach wurde das Resultat an zwei verschiedene Orte angezeigt. Dann hab ich echo $text; mit // auskommentiert.

Nun wurde das Resultat, dass am falschen Ort angezeigt wurde, ausgeblendet bzw ist verschwunden. Dort, wo jetzt das Resultat steht, zeigt mir nur die Stunden an, also 1835. Wie kann das Format geändert werden, sodass es 1835:25:44 anzeigt?

So sieht das jetzt aus:

$query= 'SELECT sum( time_to_sec( TotalBlockTime ) ) FROM flights '. $condition;
$result= mysql_query( $query );
$TFT= mysql_result( $result, 0 );

function int_int_divide( $x, $y ) {
return ( $x- ( $x% $y ) )/ $y;
}

$seconds= $TFT% 60;
$TFT= int_int_divide( $TFT, 60 );
$minutes= $TFT% 60;
$TFT= int_int_divide( $TFT, 60 );
$hours= $TFT;

$text= sprintf( '%02d:%02d:%02d', $hours, $minutes, $seconds );

//echo $text;
0 Punkte
Beantwortet von max1511 Einsteiger_in (47 Punkte)
Hey, nach ein bisschen weiter testen hat es geklappt. So sollte es auch funktionieren, oder? So sieht nun der Code aus:

$query= 'SELECT sum( time_to_sec( TotalBlockTime ) ) FROM flights '. $condition;
$result= mysql_query( $query );
$TFT= mysql_result( $result, 0 );

function int_int_divide( $x, $y ) {
return ( $x- ( $x% $y ) )/ $y;
}

$seconds= $TFT% 60;
$TFT= int_int_divide( $TFT, 60 );
$minutes= $TFT% 60;
$TFT= int_int_divide( $TFT, 60 );
$hours= $TFT;

$TFT= sprintf( '%02d:%02d:%02d', $hours, $minutes, $seconds );
0 Punkte
Beantwortet von max1511 Einsteiger_in (47 Punkte)
Ich muss euch in dieser Angelegenheit ein letztes Mal nerven. Der obige Code funktioniert einwandfrei.

In der gleichen PHP-Datei holt es wieder Stunden, Minuten und Sekunden im Format xx:xx:xx. Aber auch hier wieder die Einschränkung von 838:59:59. So wird es abgeruft (in Fett):

$query = "SELECT PilotName, COUNT(PilotName) as TnF, SEC_TO_TIME(SUM(TIME_TO_SEC(TotalBlockTime))) AS TTotalBlockTime, SUM(NbrPassengers) AS TNbrPassengers, SUM(BonusPoints) AS TBonusPoints, SUM(PenalityPoints) AS TPenalityPoints, SUM(BonusPoints - PenalityPoints) AS TotalPoint FROM flights GROUP BY PilotName ORDER BY $sortColumn LIMIT $pStart,$pageLines";

Wie behebt man hier die Einschränkung?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Ja sorry, du hast gar nichts davon verstanden - denn das Problem ist einwandfrei abstrahierbar. Du darfst in der MySQL-Abfrage die Funktion sec_to_time() nicht verwenden. Deine Abfrage muss also wie folgt aussehen:

$query = "SELECT PilotName, COUNT(PilotName) as TnF, SUM(TIME_TO_SEC(TotalBlockTime)) AS TTotalBlockTime, SUM(NbrPassengers) AS TNbrPassengers, SUM(BonusPoints) AS TBonusPoints, SUM(PenalityPoints) AS TPenalityPoints, SUM(BonusPoints - PenalityPoints) AS TotalPoint FROM flights GROUP BY PilotName ORDER BY $sortColumn LIMIT $pStart,$pageLines";

Was du in Antwort 4 mit "nicht angezeigt" und "an verschiedenen Orten" beschreiben wolltest hab ich beim besten Willen nicht verstanden - bei einem solchen Problem müsstest du uns die komplette PHP-Datei posten, denn der "Fehler" steckt eindeutig nicht im lediglich von dir geposteten Ausschnitt.
0 Punkte
Beantwortet von max1511 Einsteiger_in (47 Punkte)
Ja, ich vestehe dieses Zeug auch nicht. Was ich mit "an verschiedenen Orten" meinte ist, dass das Resultat auf der Homepage 2x angezeigt wurde und an verschiedene Positionen.

Die PHP Datei holt 2x die Daten als xx:xx:xx. Ersteres wurde dank deiner Hilfe gelöst. Zweiteres zeigt es immer noch als 838:59:59 an. Wenn ich "SEC_TO_TIME(SUM(TIME_TO_SEC(TotalBlockTime))) AS TTotalBlockTime" lösche, so verschwindet die Anzeige von 838:59:59. Deshalb ist diesen Code dafür zuständig.

Mit deiner Änderung zeigt es nun 21026779 an. Ich kann dir die ganze PHP-Datei posten, hat aber ca 618 Zeilen.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Natürlich 21026779 - das sind Sekunden. Die musst du jetzt noch zerteilen - in Minuten und Stunden. Genauso wie aus meinem ersten Code. Dazu brauchst du natürlich exakt denselben Code, den ich bereits in der ersten Antwort gepostet hab - nur die erste Zeile davon ist ja nun anders - wegen dem $query.

Du "holst" halt nicht mehr "2x die Daten als xx:xx:xx", sondern als n. Also nicht mehr vorformatiert in Stunden:Minuten:Sekunden, sondern nur die Summe der Sekunden. Und die teilst du im nachhinein auf. Durch 60 geteilt bekommst du die Minuten. Durch 3600 geteilt bekommst du die Stunden. Das exakt tut der Code. Das sind absolute Grundlagen - und bei dem laschen Verständnis kannst du es dir natürlich sparen 618 Zeilen zu posten ;-)
Deine PHP-Datei muss so aussehen:


// Diese beiden Funktionen machst du relativ nach oben in deine PHP-Datei - sie dürfen nur einmal so definiert werden
function int_int_divide( $x, $y ) {
return ( $x- ( $x% $y ) )/ $y;
}

function give_zeit( $zahl ) {
$seconds= $zahl% 60;
$zahl= int_int_divide( $zahl, 60 );
$minutes= $zahl% 60;
$zahl= int_int_divide( $zahl, 60 );
$hours= $zahl;

return sprintf( '%02d:%02d:%02d', $hours, $minutes, $seconds );
}

// ...irgendwas andres von dir

// die erste Anzeige/Abfrage
$query= 'SELECT sum( time_to_sec( TotalBlockTime ) ) FROM flights '. $condition;
$result= mysql_query( $query );
$zahl= mysql_result( $result, 0 );
$text= give_zeit( $zahl ); // in $text steht nun die Zeit im Format HH:MM:SS drin

// ...wieder irgendwas andres von dir

// die zweite oder wievielte Anzeige/Abfrage auch immer
$query = "SELECT PilotName, COUNT(PilotName) as TnF, SUM(TIME_TO_SEC(TotalBlockTime)) AS TTotalBlockTime, SUM(NbrPassengers) AS TNbrPassengers, SUM(BonusPoints) AS TBonusPoints, SUM(PenalityPoints) AS TPenalityPoints, SUM(BonusPoints - PenalityPoints) AS TotalPoint FROM flights GROUP BY PilotName ORDER BY $sortColumn LIMIT $pStart,$pageLines";
$result= mysql_query( $query );
$zahl= mysql_result( $result, 0 );
$text= give_zeit( $zahl ); // in $text steht nun die Zeit im Format HH:MM:SS drin

// ...und immer so weiter
0 Punkte
Beantwortet von max1511 Einsteiger_in (47 Punkte)
Habs nach deiner Anleitung in der PHP Datei eingefügt. Die erste Anzeige/Abfrage ist in Ordnung (wird in HH:MM:SS angezeigt). Hingegen die zweite Anzeige/Abfrage zeigt die Zeit immernoch in Sekunden an.
...