Salve a tutti, sono abbastanza nuovo al PHP e sto affrontando alcune problematiche molto toste.
Vi spiego il mio problema che ormai mi assilla da due giorni e ancora non ho trovato una soluzione.
Il risultato è un "cartellino online" delle ore lavorate al netto dell'inattività dell'utente. Vi spiego il funzionamento: la mattina l'utente fa "Avvio" su di una pagina e viene registrato un datalog, nel caso il mouse resti fermi per 10 minuti parte uno script che registra i minuti di inattività, al movimento del mouse vengono registrate i minuti di inattività in tabella, al termine del lavoro l'utente fa "Stop" e viene anche qui registrato un datalog. Il risultato come ho detto è cercare le ore lavorate al netto dell'inattività, e questo sono riuscito a farlo seppur con qualche difficoltà, con una sottrazione tra stop e avvio - il tempo di inattività. Il problema sorge quando gli utenti non fanno ciò che gli si era chiesto di fare, ossia premono "Start" o "Stop" più volte o "a caso". Infatti succede che se viene premuto START - STOP, poi di nuovo START - STOP, io a video ho due colonne che mi riportano la stessa data e il risultato (ad esempio 01/10/2015 1 ora - 1/10/2015 1 ora e mezza), ciò che io vorrei è la somma di queste ore lavorate e un controllo sulle azioni che fa l'utente perchè ci sono problemi anche nel caso in cui l'utente faccia START - START - STOP, il programma prende in considerazione solamente il secondo start. Inoltre vorrei che il punto di partenza sia sempre e solo lo start (capita a volta che parte l'inattività per colpa delle donne delle pulizie che muovono il muose e poi lo script parte, ma questi sono casi proprio eccezionali e poi ci penso). Purtroppo educare gli utenti è complicato vorrei risolvere il problema magari con un'indicazione da parte Vostra. Vi posto il codice sotto. A monte di tutto c'è una query che mi tira fuori i vari dati idoperatore, datalog, etc, poi me li vado a recuperare sotto.
La logica che ho utilizzato: il programma entra e mette blank a tutti i campi fino a che non trova stesso operatore e stessa data e fa il check sulle azioni (da me nominate 1 - Start, 3 - Overtime che andrà ad autoincrementarsi , 4 - Stop). Sul 4 lui fa i calcoli necessari per tirarmi fuori il tempo e funziona benissimo. Ora stavo provando ad utilizzare 2 altre variabili azioneold e azionenew per dirgli se azioneold è diversa da azionenew fai che vai oltre, ma giuro che mi sono perso.
Idee?


Codice PHP:

$RsSql=$oConn->Query($strSql);
if (
$oConn->RecordCount>0)
$nRec = $oConn->RecordCount;
else
$nRec = 0;

$operatore1 = "";
$ora1 = "";
$data1 = "";

$operatore0 = "";
$ora0 = "";
$data0 = "";
//$nextstep = "1";
//$primostep = "";
$azioneold = "";

/* $str1 = "prova";
$str2 = "si";
$pos = strpos($str1,$str2);
echo $pos;
*/
while(!$oConn->EOF) {

$azionenew = $RsSql['azione'];
//echo $azione ;
$datafunk = "";
$data = $RsSql['Data'];
$cellaora = "";
$operatore1 = $RsSql['nome'];
$descrizione = $RsSql['Descrizione'];
$pos = strpos($azione,$nextstep);
//echo $pos."-".$nextstep."
";



SWITCH ($azionenew) {

case
1:
//if ( isset($pos) && !empty($pos) ) {
//$nextstep = 3 || 4;
if ($azionenew != $azioneold) {

$datafunk1 = $RsSql['datafunk'];
//$data1 = substr($RsSql['Data'], 0 , 10);
$data1 = $RsSql['Data'];
$overtime = "";
}

echo
$azionenew;
//}
break;

case
3:
//if ($pos >0) {
// $nextstep = 4;
$overtime += $RsSql['Overtime'];
echo
$azionenew;
//}

break;

case
4:
//if ($pos >0) {
//$primostep = 1;
$descrizione = "Ore Lavorate";
$datafunk = $RsSql['datafunk'];
echo
$azionenew;

break;
//}
}

if ((
$operatore1 == $operatore0) && ($data1 == $data0) && ($azionenew == 4) ) {
//$stop = $datafunk;

$lavorato = abs(strtotime($datafunk) - strtotime($datafunk1));
$minutes = floor($lavorato / 60);
$cellaora = $minutes - $overtime;
$cellaora = substr(($cellaora / 60),0,4);
$StrDati.=" [TR]
"
;
$StrDati.=" [TD]".$RsSql['nome']."[/TD]

[TD]"
.$data0."[/TD]


[TD]"
.$descrizione."[/TD]

[TD]"
.$cellaora."[/TD]

[/TR]
"
;
}





Originariamente scritto da Syd Chino Barrett nel forum PHP in data 22-10-2015 10:40.