0

При нажатии на кнопку отправить код, приходит код вот в таком виде + информация отправителя

"Ваш временный код: LhWA2E"

вот php код который реализует регистрацию и эту функцию После того как приходит код, появляется поле для его ввода , и как бы я не вводил, код всегда оказывается не верным. В чем может быть проблема?

  <?php
    function generateCode($length = 6) {
        $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $code = "";
    for ($i = 0; $i &lt; $length; $i++) {
        $code .= $characters[rand(0, strlen($characters) - 1)];
    }

    return $code;
}

// Проверяем, была ли отправлена форма с почтой
if (isset($_POST['get_code'])) {
    $mail = $_POST['mail'];

    if (empty($mail)) {
        echo &quot;&lt;table&gt;&quot;;
        echo &quot;&lt;tr&gt;&quot;;
        echo &quot;&lt;td&gt;Пожалуйста, введите почту&lt;/td&gt;&quot;;
        echo &quot;&lt;/tr&gt;&quot;;
        echo &quot;&lt;/table&gt;&quot;;
    } else {
        // Проверяем существование пользователя с такой почтой в базе данных
        $checkQuery = &quot;SELECT id FROM users WHERE mail = '$mail'&quot;;
        $result = mysqli_query($conn, $checkQuery);
        if (mysqli_num_rows($result) &gt; 0) {
            echo &quot;&lt;table&gt;&quot;;
            echo &quot;&lt;tr&gt;&quot;;
            echo &quot;&lt;td&gt;Пользователь с такой почтой уже зарегистрирован&lt;/td&gt;&quot;;
            echo &quot;&lt;/tr&gt;&quot;;
            echo &quot;&lt;/table&gt;&quot;;
        } else {
            // Генерация и отправка кода на почту
            $code = generateCode(6);

            $to = $mail;
            $subject = &quot;Временный код регистрации&quot;;
            $message = &quot;Ваш временный код: $code&quot;;
            $headers = &quot;From: ...&quot;;

            if (mail($to, $subject, $message, $headers)) {
                // Сохранение кода в базе данных, чтобы можно было проверить его в следующем шаге
                $codeQuery = &quot;INSERT INTO verification_codes (mail, code) VALUES ('$mail', '$code')&quot;;
                mysqli_query($conn, $codeQuery);

                // Показать поле для ввода кода и кнопку для регистрации
                echo '&lt;form method=&quot;POST&quot; action=&quot;&quot; name=&quot;go&quot;&gt;
                          &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;code&quot; name=&quot;code&quot; placeholder=&quot;Код&quot;&gt;



                          &lt;button type=&quot;submit&quot; name=&quot;go&quot; class=&quot;btn btn-primary&quot;&gt;Зарегистрироваться&lt;/button&gt;
                      &lt;/form&gt;';
            } else {
                echo &quot;&lt;table&gt;&quot;;
                echo &quot;&lt;tr&gt;&quot;;
                echo &quot;&lt;td&gt;Не удалось отправить код на почту&lt;/td&gt;&quot;;
                echo &quot;&lt;/tr&gt;&quot;;
                echo &quot;&lt;/table&gt;&quot;;
            }
        }
    }
}

// Проверяем, была ли отправлена форма с кодом и почтой if (isset($_POST['go'])) { $code = $_POST['code']; $mail = $_POST['mail'];

// Проверяем, соответствует ли введенный код тому, который был отправлен на почту

$checkCodeQuery = "SELECT * FROM verification_codes WHERE mail = '$mail' AND code = '$code'"; $result = mysqli_query($conn, $checkCodeQuery); if (mysqli_num_rows($result) > 0) { // Код верный, регистрируем пользователя $registerQuery = "INSERT INTO users (mail) VALUES ('$mail')"; mysqli_query($conn, $registerQuery);

echo &quot;&lt;table&gt;&quot;;
echo &quot;&lt;tr&gt;&quot;;
echo &quot;&lt;td&gt;Пользователь успешно зарегистрирован&lt;/td&gt;&quot;;
echo &quot;&lt;/tr&gt;&quot;;
echo &quot;&lt;/table&gt;&quot;;

} else { // Код некорректный, выдаем ошибку echo "<table>"; echo "<tr>"; echo "<td>Неверный код</td>"; echo "</tr>"; echo "</table>"; }} elseif (isset($_POST['go'])) { $name = $_POST["name"]; $fullname = $_POST["fullname"]; $mail = $_POST["mail"]; $pass = $_POST["pass"];

    if (empty($name) || empty($fullname) || empty($mail) || empty($pass)) {
        echo &quot;&lt;table&gt;&quot;;
        echo &quot;&lt;tr&gt;&quot;;
        echo &quot;&lt;td&gt;Нужно заполнить все поля для регистрации&lt;/td&gt;&quot;;
        echo &quot;&lt;/tr&gt;&quot;;
        echo &quot;&lt;/table&gt;&quot;;
    } else {
        // Проверяем существование пользователя с такой почтой в базе данных
        $checkQuery = &quot;SELECT id FROM users WHERE mail = '$mail'&quot;;
        $result = mysqli_query($conn, $checkQuery);
        if (mysqli_num_rows($result) &gt; 0) {
            $query = &quot;INSERT INTO users (id, name, fullname, mail, pass, adres) VALUES (NULL, '$name', '$fullname', '$mail', '$pass' ,'$adres');&quot;;
            mysqli_query($conn, $query);
        }
    }
}

?>

И HTML код к которому привязан php

<form class="LogForm" method="post">
  <div class="soForm">
    <div class="row mb-4">
      <div class="col">
        <div class="form-outline">
          <input type="text" class="form-control" id="name"
            name="name" aria-describedby="emailHelp" value="<?= isset($_POST['name']) ? $_POST['name'] : '' ?>">
          <label class="form-label" for="form3Example1">Имя</label>
        </div>
      </div>
      <div class="col">
        <div class="form-outline">
          <input type="text" class="form-control" id="fullname" name="fullname" value="<?= isset($_POST['fullname']) ? $_POST['fullname'] : '' ?>">
          <label class="form-label" for="form3Example2">Фамилия</label>
        </div>
      </div>
    </div>
&lt;div class=&quot;form-outline mb-4&quot;&gt;
  &lt;input type=&quot;email&quot; class=&quot;form-control&quot; id=&quot;mail&quot; name=&quot;mail&quot; value=&quot;&lt;?= isset($_POST['mail']) ? $_POST['mail'] : '' ?&gt;&quot;&gt;
  &lt;label class=&quot;form-label&quot; for=&quot;form3Example3&quot;&gt;Почта&lt;/label&gt;
&lt;/div&gt;

&lt;button type=&quot;submit&quot; name='get_code' class=&quot;btn btn-primary btn-block mb-4&quot;&gt;Отправить код&lt;/button&gt;

&lt;div class=&quot;form-outline mb-4&quot;&gt;
  &lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;pass&quot; name=&quot;pass&quot;&gt;
  &lt;label class=&quot;form-label&quot; for=&quot;form3Example4&quot;&gt;Пароль&lt;/label&gt;
&lt;/div&gt;

</div> </form>

Damni
  • 1

1 Answers1

0

Давайте сперва немного упростим ваш код. PHP позволяет опередять функции и обычно код распроложенный в услоиви или в цикле — хороший кандидат на выделение в функцию (продробнее об это почитайте в книге Совершенный код Стива Макконнелла).

function userExists(string $mail): bool {
    // ...
}

function sendMail(string $mail, string $code): bool { // ... }

function saveCode(string $code) { // ... }

function codeIsCorrect(string $mail, string $code): bool { // ... }

С выводом html-кода поступим ещё круче — подключим отдельные файлы через require

<!-- emptyEmail.phtml -->
<table>
    <tr>
        <td>Пожалуйста, введите почту</td>
    </tr>
</table>
if (empty($mail)) {
    require './emptyEmail.phtml';
    exit(0); // и если уж на этом обработка закончена, то выйдем
}

В итоге получится более структурированный и понятный код, который можно подебажить хотя бы и с помощью var_dump (просто выводите значения переменных в тех участка кода, где у вас возникают сомнения по поводу их значений).

Некоторые ошибки даже дебажить не придётся, так как они сами бросятся в глаза. Например:

<?php

// ...

if (userExists($mail)) { registerNewUser(...); }


На заметку

С тривиальной задачей поиска багов в php-коде вы справитесь. Но могут быть баги поинтереснее. Например: если вы используете MySQL и создавали поле code как текст с collation ..._ci, то при сопоставлении кода не будет учитываться регистр. То есть код FooBarBaz подойдёт и для foobarbaz. Новички часто забывают об этом. Обязательно протестируйте этот кейс.