@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>";
            }
          }
      }
  } 

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
IMAGINWEB Москва
от 55 000 до 85 000 руб.
Владис Владимир
от 100 000 до 150 000 руб.
Glamy Санкт-Петербург
от 120 000 до 180 000 руб.