PHP показывает полный список ошибок в массиве

#php #oop

#php #ооп

Вопрос:

Я использую ООП, и я хотел спросить вас, ребята, как это можно сделать! Я продолжаю пытаться, но он все еще не работает; (
Вот мой файл класса:

 class Signup {
    // Error
    public $error = array();
    public function validate($username, $email_mobile, $password) {
        if(!empty($username) || !empty($email_mobile) || !empty($password)){
            if(strlen($username) < 3 || strlen($username) > 50){
                $this->error = "Username is too short or too long!";
                return $this->error;
            }elseif(strlen($email_mobile) < 3 || strlen($email_mobile) > 50) {
                $this->error = "Email is too short or too long!";
                return $this->error;
            }elseif(strlen($password) < 3 || strlen($password) > 50){
                $this->error = "Password is too short or too long!";
                return $this->error;
            }
        } else {
            $this->error = "Please fill are required feilds";
            return $this->error;
        }
    }
 

Вот мой файл регистрации

 $error[] = $signup->validate($username, $email_mobile, $password);
        <?php 
        // require('lib/function/signup.php');
        if(isset($error)){
            var_dump($error);
            foreach ($error as $value) {
                echo $value . "<br>";
            }
        }
        ?>
 

Я знаю, что я вызываю $error в том же файле, а не ошибку свойства. Но я не знаю, как отправить этот массив в другой файл! Пожалуйста, помогите мне! Кроме того, я вызвал все, и проблема только в моем коде (я думаю), я включил только свой файл и создал переменную для вызова моего класса регистрации

Комментарии:

1. вы не представляете себе время, когда имя пользователя, адрес электронной почты и пароль могут быть либо слишком длинными, либо слишком короткими?

2. Что такое $signup ? Я предполагаю, что это экземпляр Signup , но мы не видим, как вы его создаете. Внутри Signup вы объявляете ошибки как массив, но затем присваиваете ему строку в любой из ветвей. Ваша validate функция всегда будет возвращать строку, а не массив. Но в signup файле вы ожидаете, что результатом будет массив.

3. Не связано, но вы можете выйти return $this->error за пределы всех условных ветвей, поскольку это не зависит от потока выполнения, вы вызываете его во всех случаях.

Ответ №1:

  1. В вашей карьере разработчика никогда не бывает слишком рано изучать стандарты кодирования. Сразу переходите к PSR-12 и применяйте все эти рекомендации для написания красивого, профессионального кода.
  2. Используйте объявления типов данных в своих классах, где это возможно, это улучшит целостность данных во всех ваших проектах.
  3. Похоже, вы предпочитаете возвращать массив ошибок. По этой причине я не вижу никакой пользы в долговременном кэшировании ошибок в свойстве класса. Этот стиль кодирования подходит, но вы можете выбрать return nothing ( void ) и вместо этого заполнить свойство класса $errors , а затем получить к нему доступ непосредственно после $signup->validate() вызова через $signup->errors или использовать метод получения.
  4. empty() Проверки выполняются слишком поздно. Как только значения были переданы методу класса, эти значения уже должны быть объявлены. По этой причине empty() нет необходимости проверять накладные расходы на простую «ложность». Просто проверьте длину строки значений.
  5. Ваши проверки качества данных кажутся немного незрелыми (проверки электронной почты и паролей должны быть намного сложнее), но я не буду путать вас с какой-либо новой сложностью, но я ожидаю, что ваши правила проверки будут увеличиваться, поскольку вы понимаете, что пользователям нельзя доверять, чтобы вводить правильные значения в формы, не заставляя их делать этоитак. По этой причине, вероятно, неразумно использовать цикл для проверки длин значений, потому что в конечном итоге вам нужно будет написать отдельные правила для определенных значений.

Возможная запись:

 class Signup
{
    public function validate(
        string $username,
        string $email,
        string $password
    ): array
    {
        $errors = [];
        $usernameLength = strlen($username);
        if ($usernameLength < 3 || $usernameLength > 50) {
            $errors[] = "Username must be between 3 and 50 characters";
        }
        $emailLength = strlen($email);
        if ($emailLength < 3 || $emailLength > 50) {
            $errors[] = "Email must be between 3 and 50 characters";
        }
        $passwordLength = strlen($password);
        if ($passwordLength < 3 || $passwordLength > 50) {
            $errors[] = "Password must be between 3 and 50 characters";
        }
        return $errors;
    }
}
 

При вызове этого метода…

 $signup = new Signup();
$errors = $signup->validate(
    $_POST['username'] ?? '',
    $_POST['email'] ?? '',
    $_POST['password'] ?? ''
);
if ($errors) {
    echo '<ul><li>' . implode('</li><li>', $errors) . '</li></ul>';
} else {
    echo 'No errors';
}
 

Ответ №2:

Вы должны добавлять элементы в массив, вместо того, чтобы перезаписывать его и возвращать во всех ветвях.

 class Signup {
    
    public $errors = [];

    public function validate($username, $email_mobile, $password) {

        if (empty($username)) {
            $this->error[] = "Username cannot be empty";
        } else {
            $strlenUsername = strlen($username);
            if ($strlenUsername < 3 || $strlenUsername > 50){
                $this->errors[] = "Username is too short or too long!";
            }
        }

        if (empty($email_mobile)) {
            $this->error[] = "Email cannot be empty";
        } else {
            $strlenEM = strlen($email_mobile);
            if ($strlenEM < 3 || $strlenEM > 50) {
                $this->errors[] = "Email is too short or too long!";
            }
        }

        if (empty($password)) {
            $this->errors[] = "Password cannot be empty";
        } else {
            $strlenPass = strlen($password);
            if ($strlenPass < 3 || $strlenPass > 50) {
                $this->errors[] = "Password is too short or too long!";
            }
        }

        return $this->errors;
    }
}
 

Если вы всегда сохраняете одни и те же ограничения для трех полей, вы можете сократить его:

 class Signup {

    public function validate($username, $email_mobile, $password) {

        $errors = [];
        $fields = [
            'Username' => $username,
            'Email' => $email_mobile,
            'Password' => $password
        ];

        foreach($fields as $key => $value) {
            if (empty($value)) {
                $errors[] = "$key cannot be empty";
            } else {
                $strlen = strlen($value);
                if ($strlen < 3 || $strlen > 50) {
                    $errors[] = "$key is too short or too long!";
                }
            }
        }

        return $errors;
    }
}
 

Приведенный выше код угадывает, что вы пытаетесь сделать, если вы просто хотели исправить, чтобы не получить никаких результатов $error , см. Исходный ответ ниже.

Оригинальный ответ.

Обновление вашего кода до этого должно дать вам ожидаемые результаты.

 class Signup {
    // Error
    public $error = array();
    public function validate($username, $email_mobile, $password) {

        if (!empty($username) || !empty($email_mobile) || !empty($password)){
            $strlenUsername = strlen($username);
            $strlenEM = strlen($email_mobile);
            $strlenPass = strlen($password);

            if ($strlenUsername < 3 || $strlenUsername > 50){
                $this->error[] = "Username is too short or too long!";
            } elseif ($strlenEM < 3 || $strlenEM > 50) {
                $this->error[] = "Email is too short or too long!";
            } elseif ($strlenPass < 3 || $strlenPass > 50){
                $this->error[] = "Password is too short or too long!";
            }

        } else {
            $this->error[] = "Please fill are required feilds";
        }

        return $this->error;
    }
}
 

Имейте в виду, что, поскольку вы используете if-else , у вас всегда будет не более одного элемента в массиве, трудно с уверенностью сказать, что вы пытаетесь сделать, поэтому я не менял логику и просто исправил самую очевидную проблему.

Если вы хотите добавить сообщения об ошибках в массив, избавьтесь от else ключевого слова в условных обозначениях.

Если вы хотите получить только одно сообщение об ошибке, рассмотрите возможность использования a string вместо an array .

Комментарии:

1. Пожалуйста, кэшируйте длину строки, чтобы php не приходилось повторять одно и то же действие для получения одного и того же результата. Я не одобряю использование !empty() || !empty() || !empty() … это либо неправильная, либо чрезмерная обработка.

2. Просто хотел кое-что сказать! Все и все это действительно хорошо! Я также рекомендую не использовать ifelse, потому что, если if правильный, остальные не будут выполнены. Tbf это foreach, но просто говорит