Не понимаю поведения сессии

Генерится каптча:

<?php 
session_start();
$code = generateRandomString();
$user = $_SESSION['user'][5];
$_SESSION['captcha'][$user] = $code;
header("Content-Type: image/jpeg");

get_checkcode_picture($code);
die;

function get_checkcode_picture($code){
    ...
    imagejpeg($img);
}

Получаю так:

...
<div class="form-group form-captcha">
  <img class="form-captcha__image" src="./theme/base/captcha.php" width=50 height=30>
  <div class="form-captcha__refresh">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="16" height="16">
                                        <path fill="currentColor" d="M440.65 12.57l4 82.77A247.16 247.16 0 0 0 255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0 0 24.09 224h49.05a12 12 0 0 0 11.67-9.26 175.91 175.91 0 0 1 317-56.94l-101.46-4.86a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12H500a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12h-47.37a12 12 0 0 0-11.98 12.57zM255.83 432a175.61 175.61 0 0 1-146-77.8l101.8 4.87a12 12 0 0 0 12.57-12v-47.4a12 12 0 0 0-12-12H12a12 12 0 0 0-12 12V500a12 12 0 0 0 12 12h47.35a12 12 0 0 0 12-12.6l-4.15-82.57A247.17 247.17 0 0 0 255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 0 0-11.8-14.18h-49.05a12 12 0 0 0-11.67 9.26A175.86 175.86 0 0 1 255.83 432z">
                                        </path>
                                    </svg>
  </div>
  <div class="form-group form-captcha__input">
    <label for="captcha" class="control-label d-none">Код, показанный на изображении</label>
    <input type="text" name="captcha" maxlength="5" size=5 required="required" id="captcha" class="form-control captcha" placeholder="*****" autocomplete="off" value="">
    <div class="invalid-feedback">Не вiрний код, спробуйте ще раз.</div>
  </div>
</div>
...

В выше указанном HTML есть js событие:

   $(document).on('keydown', function(event) {
        if (event.shiftKey && event.key == 'A') {
            console.log(JSON.parse('<?php echo json_encode(array("ses" => $_SESSION['captcha'][$_SESSION['user'][5]])); ?>').ses)
        }
    })

Проблема:

При прогрузке формы я вижу картинку, и нажимаю Shift+A. Каритнка и текст не совпадают. Если обновить странчику, то сгенерится новая картинка, и в сессии (при нажатии на Shift+A будет результат со старой картинки).

Почему так может быть? Какие предположения?


Ответы (1 шт):

Автор решения: Ипатьев

Это очень забавный код.

Сначала надо прочитать Самые основы. Как работает PHP.
Потом открыть исходный код страницы и посмотреть на JSON в обработчике Shift+A
А потом подумать, почему код генерации каптчи вызывается позже, чем генерируется JSON.

Это очень важное упражнение, точка блокировки. Еадо чтобы понимание этой проблемы от зубов отскакивало. Без этого дальнейшее изучение РНР не имеет смысла.

→ Ссылка