При правильном вводе капчи регистрация не происходит — как это исправить?

<pre><code class="php">if (!isset($_SESSION['captcha']) || !isset($_POST['chislo']) || $_SESSION['captcha']!=$_POST['chislo']){$err[]='Неверное проверочное число';}
  • 24 мая 2026 г. 11:00
Ответы на вопрос 2
Кратко: чаще всего причина — сессия не та (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() есть в обоих файлах,
и я помогу точнее.
похоже файл регистрации не вызывает session_start() — добавь в самый верх
Похожие вопросы