online 1
gast (50)

/ Forum / Skripte(PHP,ASP,Perl...)

Skripte(PHP,ASP,Perl...)Skripte(PHP,ASP,Perl...)

Fragevon Max1511 vom 06.08.2021, 23:22 Options

Lösung

PHP/MySQL Anzeige von 838:59:59 umgehen

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


Antwort schreiben

Antwort 1 von son_quatsch vom 07.08.2021, 07:43 OptionsLösung

Lösung
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;

Antwort 2 von DaPascha vom 07.08.2021, 10:20 Options

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

Antwort 3 von Supermax vom 07.08.2021, 11:49 Options

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.)

Antwort 4 von Max1511 vom 07.08.2021, 17:39 Options

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;

Antwort 5 von Max1511 vom 07.08.2021, 18:12 Options

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 );

Antwort 6 von Max1511 vom 07.08.2021, 22:33 Options

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?

Antwort 7 von son_quatsch vom 10.08.2021, 07:39 Options

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.

Antwort 8 von Max1511 vom 10.08.2021, 22:09 Options

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.

Antwort 9 von son_quatsch vom 11.08.2021, 07:35 Options

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

Antwort 10 von Max1511 vom 11.08.2021, 10:47 Options

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.

Antwort 11 von son_quatsch vom 11.08.2021, 11:06 Options

Unmöglich.

Einfachste Mathematik. Sekunden in HH:MM:SS aufteilen. Hast bestimmt "die Anleitung eingefügt" - aber nicht gelesen!
Wir haben uns bereits im Kreis gedreht - einfacher kann ich es dir nicht erklären.

Alternative: du zeigst alle Stellen auf die du definitiv nicht verstehst.

Antwort 12 von Max1511 vom 11.08.2021, 12:17 Options

Also, ich habe direkt nach <?php den Code
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 );
	}


eingefügt. Ist also relativ am Anfang.

Dann hab ich diesen Code:
	$query = "SELECT sec_to_time(sum(time_to_sec(TotalBlockTime))) FROM flights ".$condition;
	$result=mysql_query($query);
	$TFT = mysql_result($result,0);


durch diesen ersetzt:
$query= 'SELECT sum( time_to_sec( TotalBlockTime ) ) FROM flights '. $condition;
	$result= mysql_query( $query );
	$zahl= mysql_result( $result, 0 );
	$text= give_zeit( $zahl );


Weiter habe ich diesen Code:
echo '<br><table width="300" cellspacing="1" cellpadding="2" align="center" style="font: normal 11px/14px Arial,sans-serif;padding:7px 7px 7px 7px">'.$TDListOdd.
		 "<div align=\"center\"><strong><u>Virtual Airline Statistics</u></strong><br>".
		 "Total flights".$startMsg.": $NrfFlights<br>
		 Total flight time: $TFT h<br>
		 Total passengers carried: $TPC<br>
		 Total Cargo carried: $TCW</div>".
		 $ListStop;
	echo "<br>";
durch diesen ersetzt (wegen dem $TFT, diesen Zeigt die erste Anfrage):
echo '<br><table width="300" cellspacing="1" cellpadding="2" align="center" style="font: normal 11px/14px Arial,sans-serif;padding:7px 7px 7px 7px">'.$TDListOdd.
		 "<div align=\"center\"><strong><u>Virtual Airline Statistics</u></strong><br>".
		 "Total flights".$startMsg.": $NrfFlights<br>
		 Total flight time: $text h<br>
		 Total passengers carried: $TPC<br>
		 Total Cargo carried: $TCW</div>".
		 $ListStop;
	echo "<br>";


Dann als zuletzt weiter unten diesen Code:
		$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";
		if(!$result=mysql_query($query))
		{
				echo "SQL Error - ".mysql_error()."<br>".$query;
				return;
		} 


durch diesen ersetzt:

	$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 );
		if(!$result=mysql_query($query))
		{
				echo "SQL Error - ".mysql_error()."<br>".$query;
				return;
		} 


Und das Resultat ist wie gesagt, dass die erste Anfrage korrekt in HH:MM:SS angezeit wird, die zweite jedoch weiterhin als Sekunden.

Zweite Anfrage:
$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 );


So, was hätte ich nun falsch eingefügt?

Antwort 13 von son_quatsch vom 11.08.2021, 13:02 Options

Sehr schön.

Zitat:
Dann als zuletzt weiter unten diesen Code:
Bis hierhin ist alles richtig. Der nachfolgende Code-Teil von mir, der deinen ersetzt ist in diesem Fall unpassend.

Zitat:
Zweite Anfrage:
Hier sehe ich weder, wo du $text verwendest, noch wie deine eigentliche zweite Abfrage aussieht. Was ich aber jetzt erahne zu erkenne ist, dass du eine Abfrage machst, die mehrere Ergebnisse liefern kann. Sei also so nett und poste den Teil vom Anfang des SQL-Statements der "zweiten Abfrage" inklusive der vermutlich nachfolgenden Schleife. Wenn du mehrere Ergebnisse hast musst du ja auch mehrfach HTML-Code ausgeben.

Konkret meine ich damit, dass unter
		{
				echo "SQL Error - ".mysql_error()."<br>".$query;
				return;
		} 
noch mehr Code kommt, vermultich in der Form
while ( $zeile= mysql_fetch_array( $result ) ) {
  ...
}
mysql_free_result( $result );
Kann auch sein, dass das ganz anders aussieht bei dir und derzeit eigentlich alles andere als effektiv abläuft... am besten beantwortest du meine Frage (mehrere Ergebnisse?).

Antwort 14 von Max1511 vom 11.08.2021, 13:15 Options

So sieht es aus ab der zweiten Abfrage:
	$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 );
		if(!$result=mysql_query($query))
		{
				echo "SQL Error - ".mysql_error()."<br>".$query;
				return;
		} 
	        ///////////////////////////////////////////////////////////////////////////////////////////////////////
		///////////////////// LIST TABLE OUTPUT /////////////////////////////////////////////////////////////// 
	echo $paging_Html;
	
	echo $ListStart.$TableVA;
	
	if ($NrfFlights>0) {
		$Line=0;
		// loop to display all rows 
		while ($row = mysql_fetch_assoc($result)) 
			{
			echo $TRList;
			// loop to display all columns using function "makeTD()" 
			  for($i=0;$i<count($PilotFieldNames);$i++) 
			  {
			  	if ($PilotFieldNames[$i]=='PilotName')
			  	{
			  		echo makeTD1($row[$PilotFieldNames[$i]],$PilotFieldNames[$i],$Line,$row['PilotName']);	// this TD is linked by FlightId 
			  	} else {
				  	echo makeTD1($row[$PilotFieldNames[$i]],$PilotFieldNames[$i],$Line);
			//		echo '<td nowrap style="background-color:red;padding:1px 5px 1px 5px">'.$row[[$i]].'</td>'.chr(13);
				}
			}
			echo '</tr>';
			$Line=!$Line;		
		}
	} 
	else 
	{
		echo '<tr><td colspan="'.count($PilotFieldNames).'" align="center"><br>There are no flights recorded.</td></tr>';
	}
	
	echo $ListStop;
	
	echo $paging_Html;
	/////////////////////////////////////////////////////////////////////////////////////////////////////// 
	

}

if( (!isset($listflight)) and (!isset($pilotflight)) ) return;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 


if(isset($pilotflight))
{
	
	// PAGING ///////////////////////////////////////////////////////////////////////////////////////// 
	//
	// set max page numbers displayed at a time (to avoid line breaks in the paging) 
	$maxPage = 20;
	$pageStep = 10;
	$pStart = 0;
	////////////////////////////////////////////////////////////////////////////////////////////////////////
		$query = "SELECT * FROM flights WHERE PilotName LIKE '%$pilotflight%' ";
		if(!$result=mysql_query($query))
		{
				echo "SQL Error - ".mysql_error()."<br>".$query;
				return;
		} 
	$NrfFlights=mysql_num_rows($result);
	if($NrfFlights==0){echo "No flights to display";return;}
	

	///////////////////////////////////////////////////////////////////////////////////////////////////////

Antwort 15 von Max1511 vom 11.08.2021, 13:18 Options

Sorry, hab grad gesehen dass es weitere Anfragen mit
$query = "SELECT
vorkommen.

Antwort 16 von son_quatsch vom 11.08.2021, 13:36 Options

Du musst lediglich Ausschau nach $row['PilotName'] halten und jedes davon durch give_zeit( $row['PilotName'] ) ersetzen.
Wird jetzt allmählich klar, wie das ganze funktioniert?

Antwort 17 von Max1511 vom 11.08.2021, 13:53 Options

Leider eher nicht. $row['PilotName'] gabs nur einen im ganzen PHP. Ersetzt, aber die zweite Anfrage bleibt immer noch in Sekunden. Falls dir das hilft, geb ich dir den Link der PHP-Datei an, natürlich aber als TXT Datei: http://www.jagsite.ch/DE/Diverses/FsPlistflight.txt So sieht der momentane Zustand der PHP aus.

Antwort 18 von son_quatsch vom 11.08.2021, 14:50 Options

Mein Fehler. PilotName macht auch keinen Sinn, nicht wahr? Dahinter steckt Text und keine Zeit.

Such nach $row['TTotalBlockTime'] (jetzt nicht exakt so, wer weiß mit wievielen Leerzeichen das wo und wie geschrieben ist) und ersetz es durch give_zeit( $row['TTotalBlockTime'] ).

Antwort 19 von Max1511 vom 11.08.2021, 20:39 Options

Mag sein, dass ich blind bin, hab aber ein solcher Code nicht gefunden. Ich hab mal nur mit TTotalBlockTime und mit $row gesucht.
Ein ähnlicher ist dieser:
echo '<tr><td style="width: 120px;"><strong>TotalBlockTime:</strong></td><td>'.$row["TotalBlockTime"]."</td></tr>";

Hat aber mit der zweiten Anfrage nichts zu tun.

Antwort 20 von son_quatsch vom 12.08.2021, 07:33 Options

Stimmt. Aber du hast doch selbst deine Abfragen vor der Nase - geh doch mal alle Teile durch, bei denen du SEC_TO_TIME( ... ) entfernt hast. All diese Spaltennamen müssen doch auch im PHP-Code auftauchen und nicht nur im SQL-Befehl.

Ähnliche Themen

Passwortverschlüsselung mysql bzw php
schojo  05.04.2008 - 73 Hits - 7 Antworten

Abfrage in PHP/MySQL
ClaudiaGauss  15.07.2008 - 45 Hits - 2 Antworten

PHP-MySQL Fehler
detommy  01.12.2008 - 29 Hits - 3 Antworten

php/mysql Datenbankzugriff schützen
dasbinichich  17.06.2009 - 333 Hits - 3 Antworten

OpenSource Browsergame in PHP und MySQL
TByte  04.08.2009 - 1031 Hits - 5 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026