Если не важна точность, можно записывать с упреждением.
Т.е логика такова:
1. Загрузка страницы с вопросом, на сервере записывается текущее функцией time()
2. На клиентской стороне ставим обратный отсчет таймера в 60 секунд. (максимальное время на ответ)
3. После ответа данные передаются на сервер, если за 60 секунд не успели срабатывается событие на клиентской стороне и отправляется запрос на сервер, что не пользователь не успел ответить.
4. На сервере в случае если пользователь ответил идет проверка записанного значения по принципу:
St - время сервера. (Записанное в базе, на начале теста)
Ct - текущее время.
Mt - максимальное время на ответ
It - погрешность.
Ft - флаг форсирования, сообщающий серверу о том, что клиент не успел за 60 секунд, и скрипт автоматически отправил серверу запрос говорящий о том, что пользователь опоздал.
Эксперемент 1 (Пользователь успел ответить в отведенные 60 секунд (Псевдокод)):
St = 100
Ct = 153
Mt = 60
It = 10
Ft = false
if(!Ft){
// Пользователь не успел ответить и клиент автоматически отправил запрос серверу.
}else if(Ct - St <= Mt){
// Да пользователь успел ответить за отведенное время Mt
}else{
// Нет пользователь не успел ответить за отведенное время Mt, используем проверку с погрешностью установленной в It
if(Ct - St <= Mt + It){
// Да пользователь успел ответить за отведенное время Mt c учетом погрешности It
}else{
// Нет пользователь не успел ответить за отведенное время Mt даже с учетом погрешности It. (Либо связь плохая, либо читер)
}
}
Для наглядности сделал так, а так можно просто на сервере Mt задать 70 секунд, а отсчет у клиента начинать с 60 секунд и не будет проблем со временем. Думаю если, кто подкрутить счетчик до 70 секунд, сильно обломается, потому что в эти 10 секунд будут заложены погрешности в передачи данных от сервера к клиенту и обратно, в зависимости от качества связи и производительности компьютера или тормозов сервера или клиента, время будет скакать в этих 10 секундах, кто-то управится за 0.2 сек, кто-то будет грузиться 4 сек, кто-то 8 сек (что мало вероятно) и проблема будет решена.
P.S
Зачем хранить время в базе? Лучше в сессии. В базу лишь результат записывать и данные о пользователе, ну ФИО там например и количество попугаев которые он набрал.