[PHP] sommare le ore

  • Creatore Discussione Creatore Discussione ste80
  • Data di inizio Data di inizio
eccomi,
ti anticipo che il risultato ottenuto dal codice mysqli e dal codice mysql è identico (ovviamente), così facendo però ottengo la somma delle ore che non è giusto....
PHP:
//somma delle ore--------------------------

//mysqli
$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = '';  //password
$db = 'orari';
$tabella = 'programma';           // nome data base
$conn = mysqli_connect($host,$username,$password, $db) or die (mysql_error());

$r=mysqli_query($conn,"SELECT SUM(HOUR(ore)*3600) as H, SUM(MINUTE(ore)*60) as M, SUM(SECOND(ore)) as S  FROM $tabella");//qui metterai il tuo $tabella

$riga=mysqli_fetch_assoc($r);
echo "ore Totali: ".date('H:i:s',($riga['H']+$riga['M']+$riga['S']))."<br />";


//mysql
$r=mysql_query("SELECT ore FROM $tabella");
var_dump($r);//poi lo togli, dimmi se riporta FALSE o RESOURCE...
$somma=0;
while($riga=mysql_fetch_assoc($r)){
    $tempo=explode(":",$riga['ore']);
    $somma+=$tempo[0]*3600 + $tempo[1]*60+$tempo[2];
}
echo "ore Totali: ".date('H:i:s',$somma)."<br />";

/*
-----------------------------------------
Immagine.png


40 minuti più 30 minuti dovrebbe darmi 01:10:00
però se inserisco un valore alle H tutto è corretto usando mysql e modificando il *3600 in $tempo[2]*3600
PHP:
//mysql
$r=mysql_query("SELECT ore FROM $tabella");
var_dump($r);//poi lo togli, dimmi se riporta FALSE o RESOURCE...
$somma=0;
while($riga=mysql_fetch_assoc($r)){
    $tempo=explode(":",$riga['ore']);
    $somma+=$tempo[0] + $tempo[1]*60+$tempo[2]*3600;
}
echo "ore Totali: ".date('H:i:s',$somma)."<br />";
Immagine2.png

cosa c'è nel codice che non funziona?
 
ciao
ho capito dove è l'inghippo
l'errore non nasce dalla query ma da data
usando la funzione date la somma in secondi viene considerata la data in timestamp
ora la data in in timestamp = 0 corrisponde (parte da) alla data 1970/01/01 01:00:00 cioè ore 1 del 1 gennaio 1970
per cui mettendo la somma delle ore parte da 1 e non da zero
se provi
PHP:
<?php
$somma=4200;//00:30:00 + 00:40:00 -> 70 min -> 4200 sec
echo date('H:i:s',0)."<br>";//parte da (1970/01/01) 01:00:00
echo date('H:i:s',$somma)."<br>"; // 02:10:00
?>
quindi conviene fare una funzione
ecco lo script
PHP:
<?php
/*modificata tabella tbl e inseriti
1    00:30:00
2     00:40:00
3     00:00:00
4     00:00:00
*/
function trasform($t){
    $h=$t/3600;
    $ore=(int)$h;
    $min=(int)(($t%3600)/60);
    $sec=$t-$ore*3600-$min*60;
    $ore=str_pad($ore, 2, "0", STR_PAD_LEFT);// es da1 a 01, se al posto di 2 metti es 3 da 1 a 001 o da 12 a 012
    $min=str_pad($min, 2, "0", STR_PAD_LEFT);
    $sec=str_pad($sec, 2, "0", STR_PAD_LEFT);
    return "$ore:$min:$sec";
}

$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = 'password';  //password
$db = 'prove';            // nome data base
$conn = mysqli_connect($host,$username,$password, $db) or die (mysql_error());
$r=mysqli_query($conn,"SELECT SUM(HOUR(ore)*3600) as H, SUM(MINUTE(ore)*60) as M, SUM(SECOND(ore)) as S  FROM tbl");//qui metterai il tuo $tabella
$riga=mysqli_fetch_assoc($r);
echo $riga['H']." ".$riga['M']." ".$riga['S']."<br>";
$somma=$riga['H']+$riga['M']+$riga['S'];
echo "$somma<br>";
echo "ore Totali: ".trasform($somma)."<br />";//output ore Totali: 01:10:00 OK
?>
 
  • Like
Reactions: ste80
Ok, devo pravarla più tardi pultroppo, devo anche capire esattamente quello che mi hai scritto! Una domanda veloce, questo vale sia se uso mysql che mysqli?
 
ciao
quello che ho scritto va bene per mysqli, non si può mischiare mysql con mysqli
se vuoi scrivere con le vecchie funzioni mysql devi cambiare la connessione e le varie funzioni, però come già detto le funzioni mysql sono obsolete, deprecate e in via di estinzione, quindi ti convine fare tutto in mysqli
 
ESATTO FUNZIONA TUTTO!!!!! mitico!!! ti ringrazio tanto per la pazienza la disponibilità e la prontezza dei post. Ho visto un po in cosa differisce mysql e mysqli, devo approfondire ancora bene le argomentazioni poi io sono di 'coccio' quindi mi ci vuole tempo, intanto grazie ancora ;)
 

Discussioni simili