Кратко: чаще всего причина — сессия не та (session_start не вызван / куки сессии не передаётся / значение перезаписывается при генерации картинки) или сравнение идёт с лишними пробелами/типами. Как найти и исправить — шаги и пример.
Проверки и исправления (по порядку):
1) Убедитесь, что везде вызывается session_start() до доступа к $_SESSION (и в скрипте, который генерирует картинку, и в обработчике формы):
- session_start() должен быть на самой вершине файла, до любого вывода.
2) Проверьте, что форма действительно отправляется методом POST и поле называется chislo:
- <form method="post" ...> и <input name="chislo" ...>.
3) Проверьте, что скрипт генерации капчи не перезаписывает $_SESSION['captcha'] в момент обработки POST.
- Частая ошибка: картинка генерируется через captcha.php, который устанавливает $_SESSION['captcha']. Если вы включаете или вызываете код генерации при обработке POST — значение перезаписывается перед проверкой. Генерируйте/записывайте капчу только при GET/при рендере формы, а не при обработке отправки.
4) Удалите пробелы и сравнивайте корректно по типу:
- В POST всё приходит строкой, может быть лишний пробел. Лучше привести к строке и trim, можно использовать строгое сравнение:
if (!isset($_SESSION['captcha']) || !isset($_POST['chislo']) || trim((string)$_SESSION['captcha']) !== trim((string)$_POST['chislo'])) { ... }
5) Отладка: выведите значения перед сравнением:
- var_dump($_SESSION['captcha'], $_POST['chislo']); exit; — это покажет, что именно хранится и почему не совпадает.
6) Другие причины:
- Куки отключены в браузере → сессия не сохраняется.
- Поддомены/префиксы (www) разные → cookie не валидно.
- Вы случайно делаете redirect/перезапрос, где капча заново генерируется.
Пример корректного кода обработчика:
<?php
session_start();
$err = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// отладка (раскомментируйте при необходимости)
// var_dump($_SESSION['captcha'], $_POST['chislo']); exit;
if (!isset($_SESSION['captcha'])) {
$err[] = 'Код капчи не найден в сессии';
} elseif (!isset($_POST['chislo']) || trim($_POST['chislo']) === '') {
$err[] = 'Введите проверочное число';
} elseif (trim((string)$_SESSION['captcha']) !== trim((string)$_POST['chislo'])) {
$err[] = 'Неверное проверочное число';
} else {
// всё ок — регистрируем пользователя
unset($_SESSION['captcha']); // чтобы нельзя было повторно использовать
}
}
?>
Если после этих шагов проблема остаётся — пришлите:
- как вы генерируете/сохраняете капчу (код captcha.php),
- как выглядит форма (HTML),
- подтверждение, что session_start() есть в обоих файлах,
и я помогу точнее.