@vovkka

Как правильно писать ветвление?

Добрый день, подскажите пожалуйста, как бы вы сделали обработку ошибок? Я Объявляю переменную со счетчиком ошибок и массив ошибок. Что меня смущает: ниже я говорю : если счетчик не равен нулю, значит выводи ошибки, а если else то счетчик равен нулю, но в коде ниже мне тоже надо обрабатывать ошибки, поэтому там на определенных ветках счетчик увеличивается. Вопрос в том нормально ли заходить в ветку по else (по условию счетчик нулевой) и потом внутри увеличивать его... а иначе как обрабатывать ошибки ? Всем добра!

if ($errorCount !== 0) {
      foreach ($errorMessage as $key => $value) {
        echo $value."<br>";
      }
    } else {


<?php
$errorMessage = [];
$errorCount = 0;
  if (isset($_POST["auth_submit"])) {

    //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
    if (trim($_POST["login"])) { 
      $login = trim($_POST['login']); 
      if (!preg_match("/^[a-zA-Z0-9_-]{3,20}$/", $login)) {
        $errorCount++;
        $errorMessage[] = "Логин содержит некорректные символы";
      } 
    } else {
      $errorCount++;
      $errorMessage[] = "Введите логин!";
      unset($login);
    }

    //заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную 
    if (trim($_POST["password"])) {
      $password = trim($_POST['password']);
      if (!preg_match("/^[a-zA-Z0-9_-]{3,20}$/", $password)) {
        $errorCount++;
        $errorMessage[] = "Пароль содержит некорректные символы";
      }  
    } else {
      $errorCount++;
      $errorMessage[] = "Введите пароль!";
      unset($password);
    }

    
    if ($errorCount !== 0) {
      foreach ($errorMessage as $key => $value) {
        echo $value."<br>";
      }
    } else {
          //echo "Данные корректны";
          $login = trim($_POST['login']); 
          $password = trim($_POST['password']);

          //удаляем пользователей из двух таблиц, у которых истек срок годности проверки почты
          $query = "DELETE FROM players WHERE email_active = 0 AND date_registration < (NOW() - INTERVAL ".$timeRemoveNoActivePlayers.");"; 
          $result = dbDelete($query);

          $query = "DELETE FROM confirm_players WHERE date_registration < (NOW() - INTERVAL ".$timeRemoveNoActivePlayers.");"; 
          $result = dbDelete($query);

          $query = "SELECT * FROM players WHERE login = '$login';";

          $result = dbSelect($query);

          if (!$result) {
            $errorCount++;
            $errorMessage[] = "Пользователь с таким логином не найден!";
            //header("Location /");
          } 

          if ($result) {
            foreach ($result as $value) {
              $dbLogin = $value["login"];
              $dbPassword = $value["password"];
              $dbEmailActive = $value["email_active"];
            }

            if ($dbEmailActive) {
              if (password_verify($password, $dbPassword)) {
                $_SESSION["login"] = $dbLogin;
                header("Location: home.php"); 
                //echo "Добро пожловать!";
              } else {
                //echo "Неверный пароль!";
                $errorCount++;
                $errorMessage[] = "Неверный пароль!";
                //header("Location: /"); 
              }
            } else {
              $errorCount++;
              $errorMessage[] = "Вы не подтвердили свою почту!";
            }

          } 

          if ($errorCount !== 0) {
            foreach ($errorMessage as $key => $value) {
              echo $value."<br>";
            }
          }
      }
  } 

?>
  • Вопрос задан
  • 156 просмотров
Решения вопроса 3
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Вопрос в том нормально ли заходить в ветку по else (по условию счетчик нулевой) и потом внутри увеличивать его... а иначе как обрабатывать ошибки ?

Нормально. А почему нет? Это в цикле по массиву не рекомендуется изменять сам массив, а в if-ах - ради Будды.
Ну и вообще часто приходится писать что то типа:
$x = ($x == 0) ? 15 : $x;
Что по сути одно и то же.
Ответ написан
Комментировать
AK-VoronM
@AK-VoronM
"Мало-мало программист"
В принципе ничего особо криминального здесь нет. Код выглядит страшно и запутанно.... Но работает ))

Зачем нужна переменная с количеством ошибок? Можно замечательно использовать count($errors) или empty($errors) - результат будет ровно тот-же, но без кучи повторяющихся лишних действий. И да, если в foreach предать пустой массив - он выполнится 0 раз, и это нормальное поведение.

И очень здорово разбить программу на функции. Для каждой проверки сделать свою функцию, которая будет возвращать true/false.
И совсем здорово будет вынести работу с DB в отдельные функции.
Ответ написан
Комментировать
nefone
@nefone
Junior PHP разработчик
Я не понимаю зачем тебе вообще переменная $errorCount, если ты используешь массив с ошибками, можно делать проще:
if (count($errorMessage) !== 0) { ... }
таким образом избавишься от одной лишней переменной в коде.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект