Когда статус меняется на подготовку / подготовку, запускается таймер. Затем я хочу остановить таймер и вычислить разницу, когда статус изменится на готово, и сохранить его как время в базе данных. Я пробовал разные способы, но не могу заставить его работать, что я делаю не так? Спасибо
if(isset($_POST['prepare'])){
$_SESSION['startTime'] = time();
$question2="UPDATE `order` SET orderStatus='Preparing', idEmployee='$_SESSION[id]' WHERE idorder='$_POST[id]'";
$sth = $db->prepare($question2);
$sth->execute();
}
if(isset($_POST['ready'])){
$total = time() - $_SESSION['startTime'];
echo date('h:i:s', $total);
$question2="UPDATE `order` SET orderStatus='Completed', timeCompleted='$total' WHERE idorder='$_POST[id]'";
$sth = $db->prepare($question2);
$sth->execute();
}
редактировать: я преодолел проблемы, которые у меня были, просто используя метод в классе DateTime. Я начал с записи времени, когда был принят заказ, я также записал время, когда заказ был выполнен. Затем я использовал метод diff (), чтобы вычислить разницу между двумя записанными моментами, и сохранил результаты в моей базе данных.
if(isset($_POST['prepare'])){
$_SESSION['startTime'] = new DateTime();
$question2="UPDATE `order` SET orderStatus='Preparing', idEmployee='$_SESSION[id]' WHERE idorder='$_POST[prepare]'";
$sth = $db->prepare($question2);
$sth->execute();
}
if(isset($_POST['ready'])){
$endTime = new DateTime();
$i = $_SESSION['startTime']->diff($endTime);
$end = $i->format('%h:%i:%s');
$question2="UPDATE `order` SET orderStatus='Completed', timeCompleted='$end' WHERE idorder='$_POST[ready]'";
$sth = $db->prepare($question2);
$sth->execute();
}
замещать $total = time() - $_SESSION['startTime']
с $total = time() - strtotime($_SESSION['startTime'])
И добавить session_start();
к началу вашего кода, если вы этого не сделали
Тогда это будет работать.
Если оба подготовленных и готовых действия выполняются на одной и той же машине одним и тем же человеком (в рамках одного сеанса) — этот код должен работать. Если вы считаете, что все это правда — я бы проверил, чтобы переменные сеанса были установлены print_r ($ _ SESSION)
Тем не менее, я бы порекомендовал, когда вы обновляете orderStatus до «Preparing», создаете новый столбец с именем timeStarted и обновляете его до time (), а затем, когда вы обновляете до «Completed», устанавливаете timecompleted и time ()
Затем вы можете легко определить разницу, как в настоящее время (если этот код сработал, timeCompleted на самом деле timeTaken), для которого вы можете даже добавить 3-й столбец, который представляет собой разницу между ними для упрощения создания отчетов.
Выполнение этого означает, что если это займет больше времени, чем сеанс, или компьютер перезагружается / перезапускается, startTime не теряется.