Как проверить, действителен ли введенный код капчи в php?

У меня есть регистрационная форма с кодом проверки. Я хочу знать, как я могу проверить, действителен ли введенный код проверки.

если он действителен, завершите процесс регистрации, если не отобразите сообщение об ошибке.

Я сделал пример, но я получаю эту ошибку, как на изображении ниже:

Ошибка, которую я получаю

register.php

<?php

require_once "db.php";
session_start();

if (isset($_SESSION["user_id"])) {
    header("location: acceuil.php");
}

$error = false;

if (isset($_POST["register_user"])) {
    $name = mysqli_real_escape_string($con, $_POST["name"]);
    $email = mysqli_real_escape_string($con, $_POST["email"]);
    $password = mysqli_real_escape_string($con, $_POST["password"]);
    $confirm_password = mysqli_real_escape_string($con, $_POST["confirm_password"]);

    if (!preg_match("/^[a-zA-Z ]+$/", $name)) {
        $error = true;
        $uname_error = "Le nom ne doit contenir que des alphabets et des espaces !";
    }

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = true;
        $email_error = "Veuillez saisir une adresse e-mail valide !";
    }

    if (strlen($password) < 6) {
        $error = true;
        $password_error = "Le mot de passe doit comporter au moins 6 caractères !";
    }

    if ($password != $confirm_password) {
        $error = true;
        $cpassword_error = "Le mot de passe et la confirmation du mot de passe ne correspondent pas !";
    }
    
if (sha1($_POST['verif_code']) == $_SESSION['verif_code']) { 
    $captcha = $_POST['verif_code'];
} else { 
    $error = true;
    $error_message = "The captcha code you entered does not match. Please try again.";
}

    // Check the database to make sure
    // a user does not already exist with the same name and/or email
    $query = "SELECT * FROM users WHERE name='$name' OR email='$email' LIMIT 1";
    $result = mysqli_query($con, $query);
    $user = mysqli_fetch_assoc($result);

    if ($user) {
        if ($user["name"] === $name) {
            $error_message = "Ce nom est déjà utilisé !";
        }

        if ($user["email"] === $email) {
            $error_message = "Cet e-mail est déjà utilisé !";
        }
    } else {
        // Finally, register user if there are no errors in the form
        if (mysqli_query($con, "INSERT INTO users(name, email, password) VALUES('" . $name . "', '" . $email . "', '" . md5($password) . "')")) {
            $success_message = "Votre compte a été créé avec succès.";
            // header("Refresh:2 ; URL=auth.php");
        } else {
            $error_message = "Oups! quelque chose ne va pas lors de l'inscription! Veuillez réessayer plus tard!";
        }
    }
}

?>

<!DOCTYPE html>
<!--[if lt IE 7]><html class = "ie ie6" lang = "en"> <![endif]-->
<!--[if IE 7]><html class = "ie ie7" lang = "en"> <![endif]-->
<!--[if IE 8]><html class = "ie ie8" lang = "en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!-->
<html lang = "en">
    <!--<![endif]-->
    <head>
        <!-- Required meta tags -->
        <meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
        <meta name = "description" content = "Project Description" />
        <meta name = "author" content = "Project Author" />
        <meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1" />
        <title>Inscription</title>
        <!-- CSS Libraries -->
        <link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" />
        <link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" />
        <!-- Google Fonts -->
        <link rel = "preconnect" href = "https://fonts.googleapis.com" />
        <link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin />
        <link rel = "stylesheet" href = "https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" />
        <style>
            body {
                font-family: "Poppins", sans-serif;
            }
        </style>
    </head>
    <body class = "bg-light">
        <div class = "container col-md-6 mt-5">
            
<?php
if (isset($success_message)) {
    echo "<div class='alert alert-success'><i class='fas fa-check-circle me-1'></i> " . $success_message . "</div>";
}

if (isset($error_message)) {
    echo "<div class='alert alert-danger'><i class='fas fa-exclamation-triangle me-1'></i> " . $error_message . "</div>";
}
?>
            
            <form action = "<?php echo $_SERVER['PHP_SELF']; ?>" method = "post" autocomplete = "off">
                <fieldset>
                    <legend class = "h2 mb-4">Connectez-vous et profitez de nos meilleur produits</legend>
                    <div class = "row mb-3">
                        <label for = "name" class = "col-sm-4 col-form-label"><i class = "fas fa-user-circle me-1"></i> Name <sup class = "fw-bold text-danger">*</sup></label>
                        <div class = "col-sm-8">
                            <input type = "text" id = "name" class = "form-control" name = "name" value = "<?php if ($error) echo $name; ?>" autofocus required />
                            <?php if (isset($uname_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $uname_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class = "row mb-3">
                        <label for = "email" class = "col-sm-4 col-form-label"><i class = "fas fa-at me-1"></i> E-mail <sup class = "fw-bold text-danger">*</sup></label>
                        <div class = "col-sm-8">
                            <input type = "email" id = "email" class = "form-control" name = "email" value = "<?php if ($error) echo $email; ?>" required />
                            <?php if (isset($email_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $email_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class = "row mb-3">
                        <label for = "password" class = "col-sm-4 col-form-label"><i class = "fas fa-key me-1"></i> Mot de passe <sup class = "fw-bold text-danger">*</sup></label>
                        <div class = "col-sm-8">
                            <input type = "password" id = "password" class = "form-control" name = "password" value = "" required />
                            <?php if (isset($password_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $password_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class = "row mb-3">
                        <label for = "confirm_password" class = "col-sm-4 col-form-label"><i class = "fas fa-key me-1"></i> Retapez votre MdP <sup class = "fw-bold text-danger">*</sup></label>
                        <div class = "col-sm-8">
                            <input type = "password" id = "confirm_password" class = "form-control" name = "confirm_password" value = "" required />
                            <?php if (isset($cpassword_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $cpassword_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class = "row mb-3">
                        <img src = "captcha/verif_code_gen.php" class = "col-sm-4 col-form-label" alt = "code de vérification" />
                        <div class = "col-sm-8">
                            <input type = "text" class = "form-control" name = "verif_code" value = "" required />
                            <?php if (isset($captcha_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $captcha_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class = "text-end">
                        <button type = "submit" class = "btn btn-primary" name = "register_user">S'inscrire<i class = "fas fa-arrow-alt-circle-right ms-1"></i></button>
                    </div>
                </fieldset>
            </form>
            <p>
                Already a member? <a href = "auth.php">Sign in</a>
            </p>
        </div>
        <!-- JS Libraries -->
        <script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
    </body>
</html>

капча/verif_code_gen.php

<?php
session_start();
header("Content-type: image/png");
$_img = imagecreatefrompng("fond_verif_img.png");
$avant_plan = imagecolorallocate($_img, 255, 255, 255);
$nombre = mt_rand(100000, 999999);
$_SESSION["alert_nbr"] = $nombre;
imagestring($_img, 5, 18, 8, $nombre, $avant_plan);
imagepng($_img);
?>

капча.php

<?php
   session_start();
   $code=rand(1000,9999);
   $_SESSION["code"]=$code;
   $image = imagecreatetruecolor(50, 24);
   $background = imagecolorallocate($image, 245, 73, 73); 
   $forground = imagecolorallocate($image, 255, 255, 255);
   imagefill($image, 0, 0, $background);
   imagestring($image, 5, 5, 5,  $code, $forground);
  header("Cache-Control: no-cache, must-revalidate");
  header('Content-type: image/png');
  imagepng($image);
  imagedestroy($image);
?>

Как решить эту проблему?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Много вещей.

Вы используете разные имена переменных в каждом скрипте.

  • В register.php вы сравниваете переменную POST с $_SESSION['verif_code']
  • В captcha/verif_code_gen.php вы называете это $_SESSION["alert_nbr"]
  • В captcha.php вы называете это $_SESSION["code"]

Во-вторых, почему вы дважды создаете случайное число? Давайте сделаем некоторую очистку и упростим:

В register.php:

После error = false вставьте это

$error = false;

$_SESSION["captcha_code"] = mt_rand(100000, 999999);

Измените следующие строки на:

if ( $_POST[ 'verif_code' ] ) != $_SESSION[ 'captcha_code' ] ) {
    $error = true;
    $error_message = "The captcha code you entered does not match. Please try again.";
} else {
    // Check the database to make sure
    // a user does not already exist with the same name and/or email
    $query = "SELECT * FROM users WHERE name='$name' OR email='$email' LIMIT 1";
    $result = mysqli_query( $con, $query );
    $user = mysqli_fetch_assoc( $result );

    if ( $user ) {
        if ( $user[ "name" ] === $name ) {
            $error_message = "Ce nom est déjà utilisé !";
        }

        if ( $user[ "email" ] === $email ) {
            $error_message = "Cet e-mail est déjà utilisé !";
        }
    } else {
        // Finally, register user if there are no errors in the form
        if ( mysqli_query( $con, "INSERT INTO users(name, email, password) VALUES('" . $name . "', '" . $email . "', '" . md5( $password ) . "')" ) ) {
            $success_message = "Votre compte a été créé avec succès.";
            // header("Refresh:2 ; URL=auth.php");
        } else {
            $error_message = "Oups! quelque chose ne va pas lors de l'inscription! Veuillez réessayer plus tard!";
        }
    }
}

Тогда капча/verif_code_gen.php должен быть:

session_start();
header("Content-type: image/png");
$_img = imagecreatefrompng("fond_verif_img.png");
$avant_plan = imagecolorallocate($_img, 255, 255, 255);
$nombre = $_SESSION["captcha_code"];
imagestring($_img, 5, 18, 8, $nombre, $avant_plan);
imagepng($_img);

Теперь вам не нужен капча.php

как вы можете видеть на этом изображении, если код капчи неверен, он не должен создавать учетную запись пользователя и отображать флэш-сообщение, как мне исправить эту ошибку? i.ibb.co/YdSLTVz/Capture-d-cran-2022-05-08-121732.png

maxwiber 08.05.2022 13:19

одна секундная ошибка в предоставленном вами коде: я ввел правильную капчу и все еще отображаю сообщение об ошибке?

maxwiber 08.05.2022 13:34

Создать и ELSE оператор, который выполняется альтернативно if ($_POST['verif_code']) != $_SESSION['captcha_code']) и включить туда весь код, создающий пользователя. Таким образом, этот код будет выполнен только в том случае, если капча верна. Я отредактирую свой ответ выше, проверьте его.

kissumisha 09.05.2022 02:30

Другие вопросы по теме