За последние 24 часа нас посетили 17898 программистов и 1781 робот. Сейчас ищут 1880 программистов ...

Скрип тестирования: как усовершенствовать алгоритм

Тема в разделе "Решения, алгоритмы", создана пользователем Vladd55, 6 ноя 2024 в 22:32.

  1. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    86
    Симпатии:
    1
    Для тестирования посетителю поочередно показывают вопросы, записывая его ответы в базу. Но есть нюанс – надо сделать так, что бы при обновлении страницы или при клику «Назад» скрипт останавливался и выводилось сообщение об ошибке.

    Я сделал так.

    На стартовой странице, где еще нет вопросов, вырабатывается случайное число $randomNumber, которое заносится в базу. Потом человек кликает «Начали» и переходит на страницу с адресом test.php?id=" . $randomNumber.
    На этой странице извлекается число из динамического адреса и из базы, и сравнивают их. Если числа совпадают, то все хорошо.

    Вырабатывается другое случайное число и в форме создается action обработчика с динамическим адресом, содержащим это число, которое также заносится в базу вместо прежнего.

    Посетителю показывается вопрос.

    Когда посетитель кликает «Готово», происходит переход на обработчика, которого посетитель не видит.

    В обработчике из адреса берется число и из базы, аналогичным образом они сравниваются. Если совпадают, то результат тестирования заносится в базу. Если не совпадают, то выводится сообщение об ошибке.

    Генерируется новое случайное число, которое тоже заносится в базу, и оно же добавляется в адрес страницы тестирования, где, после проверки, появляется следующий вопрос.

    Все это работает очень хорошо, успешно детектируя и обновления, и попытки Назад. Но бывают случаи, когда скрипт останавливается с диагностикой ошибки, которой на самом деле нет. То есть, что-то не успевает синхронизироваться. Может, браузер $_GET долго отдает или что-то в этом роде.

    Как бы это исправить?

    (Сессии не стал использовать, поскольку вариант с базой позволяет прерваться и потом продолжить с этого же места).