Php как вывести ошибки валидации формы

Приветствую. Пишу валидацию есть вопросы! Хочется написать красиво, но не получается выводить ошибки. Давайте так я скину пример и ниже опишу в чём суть.

Вот кусок кода:

class UserController
{
    /**
     * Action для страницы "Регистрация"
     */
    public function actionRegister()
    {
        // Переменные для формы
        $login = false;
        $email = false;
        $password = false;
        $result = false;

        // Обработка формы
        if (isset($_POST['submit'])) {
            // Если форма отправлена
            // Получаем данные из формы
            $login = $_POST['login'];
            $email = $_POST['email'];
            $password = $_POST['password'];

            // Флаг ошибок
            $errors = false;

            // Валидация полей
            if (!User::checkName($login)) {
                $errors[] = 'Имя не должно быть короче 2-х символов';
            }
            if (!User::checkEmail($email)) {
                $errors[] = 'Неправильный email';
            }
            if (!User::checkPassword($password)) {
                $errors[] = 'Пароль не должен быть короче 6-ти символов';
            }
            if (User::checkEmailExists($email)) {
                $errors[] = 'Такой email уже используется';
            }

            if ($errors == false) {

                //генерируем соль
                $salt = User::generateCode(5);
                
                //получает хеш-сумму пароля и соли
                $password = md5($password.$salt);
                
                // Если ошибок нет
                // Регистрируем пользователя
                User::register($login, $email, $password, $salt);

                header("Location: /");
            }
        }

        // Подключаем вид
        require_once(VIEW . '/user/register.php');
        return true;
    }
 }

После нажатия кнопки формы данные проходят валидацию. Если какое либо поле не проходит проверку то в массив $errors = false;попадает значение ну допустим это $errors[] = ‘Имя не должно быть короче 2-х символов’;

Данная функция которая проверяет длину строки находится в моделе User и имеет вид:

/**
     * Проверяет имя: не меньше, чем 2 символа
     */
    public static function checkName($login)
    {
        if ($login >= 2) {
            return true;
        }
        return false;
    }

Я хочу проверять не только длину строки но и скажем чтобы были только латинские буквы и кроме этого отсечь все цифры подчёркивания и прочее.

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

По сути функция должна иметь такой вид:

public static function checkName($login)
    {
      if(!preg_match("/^[a-zA-Z]{1,20}$/"), $login){
            $errors[] = 'Логин должен быть из латинских символов и не более 20 символов';
    }elseif(!$login >= 2){
           $errors[] = 'Логин не должен быть короче 2-х символов';
    }else{
   return true;
} 
 }

Когда я писал красиво имелось введу вот это(то что находится в экшене):

if (!User::checkName($login)) {
                $errors[] = 'Имя не должно быть короче 2-х символов';
            }

Тут с выводом ошибок проблем нет.

Хочется чтобы валидация логина была одной функцией, но у меня не получается из модели передать ошибки в массив $errors[] который находится в контроллере =) UserController

Вот что делать кинуть этот код в контроллер? Ну будет же некрасиво… Подскажите как быть?

Я постарался максимально подробно описать чего я хочу. Ну насколько подробно у меня это вышло. =)

crautcher Проблема с обработкой ошибочного заполнения формы. На данный момент имеется форма добавления объявления. Ситуация такая , если пользователь ошибся или не заполнил одну графу , а остальные правильно , открывается страница с сообщением о неверно заполненной графе и предлагается вернуться обратно и заполнить ее.

ОДНАКО , вот и наступает проблема. Все те поля ,которые были правильно заполнены оказываются пустыми. И приходится по новой заполнять их.
Помогите пожалуйста , кто нибудь((( за спасибо или за пиво)). Нужно применить сессии и чтобы при ошибке в той же форме рядом с «ошибочной» графой выводилось предупреждение об ошибке. Сам пробовал , не получается. Самоучка(((

Добавлено через 2 минуты
crautcher, Спасибо Вам огромное , буду пробовать. Просто никогда не применял сам сессии. Если что-то не получится я еще обращусь к Вам)) Но Надеюсь , что справлюсь. Еще раз , благодарю . Радости не будет предела.

Добавлено через 9 минут

Цитата
Сообщение от crautcher
Посмотреть сообщение

Затем выводи, где нужно $_SESSION[‘LastError’]

Это в форме я так понимаю ? Рядом с «ошибочным» полем ? Можете на одном примере показать ? К примеру графа «имя»

За последние 24 часа нас посетили 10349 программистов и 1244 робота. Сейчас ищут 664 программиста …

Страница 1 из 7


  1. Titos

    С нами с:
    18 янв 2018
    Сообщения:
    4
    Симпатии:
    0

    Пишу валидацию есть вопросы! Хочется написать красиво, но не получается выводить ошибки. Давайте так я скину пример и ниже опишу в чём суть.

    Вот кусок кода:

    1.      * Action для страницы «Регистрация»
    2.     public function actionRegister()
    3.         if (isset($_POST[‘submit’])) {
    4.             // Получаем данные из формы
    5.             $login = $_POST[‘login’];
    6.             $email = $_POST[’email’];
    7.             $password = $_POST[‘password’];
    8.             if (!User::checkName($login)) {
    9.                 $errors[] = ‘Имя не должно быть короче 2-х символов’;
    10.             if (!User::checkEmail($email)) {
    11.                 $errors[] = ‘Неправильный email’;
    12.             if (!User::checkPassword($password)) {
    13.                 $errors[] = ‘Пароль не должен быть короче 6-ти символов’;
    14.             if (User::checkEmailExists($email)) {
    15.                 $errors[] = ‘Такой email уже используется’;
    16.                 $salt = User::generateCode(5);
    17.                 //получает хеш-сумму пароля и соли
    18.                 $password = md5($password.$salt);
    19.                 // Регистрируем пользователя
    20.                 User::register($login, $email, $password, $salt);
    21.         require_once(VIEW . ‘/user/register.php’);

    После нажатия кнопки формы данные проходят валидацию. Если какое либо поле не проходит проверку то в массив $errors = false; попадает значение ну допустим это $errors[] = ‘Имя не должно быть короче 2-х символов’;

    Данная функция которая проверяет длину строки находится в моделе User и имеет вид:

    1.      * Проверяет имя: не меньше, чем 2 символа
    2.     public static function checkName($login)

    Я хочу проверять не только длину строки но и скажем чтобы были только латинские буквы и кроме этого отсечь все цифры подчёркивания и прочее.

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

    По сути функция должна иметь такой вид:

    1. public static function checkName($login)
    2.             $errors[] = ‘Логин должен быть из латинских символов и не более 20 символов’;
    3.            $errors[] = ‘Логин не должен быть короче 2-х символов’;

    Когда я писал красиво имелось введу вот это(то что находится в экшене):

    1. f (!User::checkName($login)) {
    2.                 $errors[] = ‘Имя не должно быть короче 2-х символов’;

    Тут с выводом ошибок проблем нет.

    Хочется чтобы валидация логина была одной функцией, но у меня не получается из модели передать ошибки в массив $errors[] который находится в контроллере =) UserController

    Вот что делать кинуть этот код в контроллер? Ну будет же некрасиво… Да и данные должны же обрабатываться в моделе. Подскажите как быть?

    Я не знаю. Буду рад любому дельному совету.


  2. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969

    1. Логин емейл пароль. Пароль ладно, а логин и емейл зачем разделять? Почта должна быть и так уникальна — вот тебе и логин. А дальше уже можно юзеру дать возможность дополнительно выбрать себе уникальный юзернейм.
    2. Пароль хочу сам себе назначать. Не твоё это дело какие мне пароли нравятся. Хочу единичку ткнуть и ок нажать. Дай мне!
    3. Не храни мою единичку в открытом виде! Используй функции хэширования паролей и храни хэш пароля а не его значение. Ну пожалуйста!
    4. Соль при этом можешь не хранить, так как нормальная функция хэширования пароля и так умеет соль. Ты ей строки, а она тебе подсоленные хэши. Удобно же!


  3. romach

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719

    В слаке вон вообще паролей нет, написал почту — получил ссылку для входа. Идеально же.


  4. keren

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42

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


  5. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969

    @keren валидация на сервере при этом не отменяется.


  6. Titos

    С нами с:
    18 янв 2018
    Сообщения:
    4
    Симпатии:
    0

    4 ответа и ни одного дельного совета. Я же не прошу сделать за меня! Я не знаю за что взяться! Этот проект — велосипед. Сам я продвинуться не могу. Так что давайте без флуда. Я старался для вас всё расписать имейте совесть!


  7. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969

    @Titos мой список из четырёх пунктов видел? Тебе из них как минимум научиться не хранить пароль в открытом виде.


  8. keren

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42

    А давайте без «давайте», у вас тема как называется?
    Если у вас проблема:

    То наверное вам нужно почитать про функцию include


  9. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.604
    Симпатии:
    1.292
    Адрес:
    Лень

    1.         if (isset($_POST[‘submit’])) {
    2.             // Получаем данные из формы
    3.             $login = $_POST[‘login’];
    4.             $email = $_POST[’email’];
    5.             $password = $_POST[‘password’];

    vs

    1. if ( $_SERVER[‘REQUEST_METHOD’] === ‘POST’ )
    2.        ‘filter’ => FILTER_VALIDATE_REGEXP,
    3.          ‘regexp’ => ‘/^[A-Za-z0-9_-]{3,25}$/’
    4.      ’email’ => FILTER_VALIDATE_EMAIL,
    5.      ‘password’ => FILTER_DEFAULT

    Объявляем переменную с булевым значением, а используем ее как контейнер с массивами данных. Ошибка с типами.не нужнаpassword_hash ( $pass, PASSWORD_DEFAULT );
    password_verify
    — Добавлено —

    Porno5 тоже может иметь всех, в трусах можно длину измерить и регулярно гонять лишний раз своего лысого.


  10. voral

    voral
    Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104

    Хацкерам плевать что умеет HTML5 они будут долбить сайт не используя браузер


  11. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.523
    Симпатии:
    1.744

    Передай в функцию ссылку на массив $errors, и будет тебе счастье


  12. keren

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42

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


  13. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.604
    Симпатии:
    1.292
    Адрес:
    Лень

    функция имя( $парам1, &$еррор )


  14. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.523
    Симпатии:
    1.744

    1. function f(array &$errors) {
    2.       $errors[] = «Пользователь идиот»;
    3. for ($i = 0; $i < 10; $i++) {


  15. Fell-x27

    Команда форума
    Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА

    Ключевой момент «чтобы не гонять лишний раз на сервер». Валидация на стороне клиента — ни в коем случае не мера защиты. Это не более, чем мера добавления удобства для пользователя и снижения количества «ложных» запросов. Снижения, а не сведения к 0. Все эти валидации, при желании, обходятся без малейшего напряга прям в браузере.


  16. Titos

    С нами с:
    18 янв 2018
    Сообщения:
    4
    Симпатии:
    0

    Видел. Я честно говоря части не понял. Не удалось Вам донести суть =). В общем с завтрашнего дня буду штудировать.


  17. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969

    Там как раз только суть и есть. Или ты из тех кому готовый год надо на блюдечке?


  18. AlNick

    AlNick
    Активный пользователь

    С нами с:
    19 авг 2017
    Сообщения:
    64
    Симпатии:
    3

    Насчёт длины пароля не согласен. Но все проверки данных, которые можно делать на стороне клиента, нужно там делать. В Вашем примере
    это длина логина и пароля. А остальные проверки уже на сервере. А хэшировать конечно нужно


  19. romach

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719

    Проверки на стороне клиента могут быть любые, но они носят исключительно декоративный характер.

    p.s. а пароля вообще быть не должно. Сделайте авторизацию через соц.сети-гуглы, ну или спросите мыло что бы прислать на него одноразовую ссылку на вход. Ну и логин, да, ничего не бесит больше чем логин. Есть почта, что вам ещё надо то? ) Извиняюсь, накипело )


  20. AlNick

    AlNick
    Активный пользователь

    С нами с:
    19 авг 2017
    Сообщения:
    64
    Симпатии:
    3

    Большое спасибо Вам, что Вы решили за меня, как мне делать авторизацию


  21. Fell-x27

    Команда форума
    Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА

    И тогда, если ты не залогинен в почте/гугле/соцсетях, тебе придется вбивать логин и пароль там.

    Мне больше нравятся логины. Почт у меня много, а логинов нет. И логин короче почты. Изначально на проекте был вход только по логину. У части народа бомбило от того, что нет входа по почте. Переделка на вход по почте вызвала бы бомбеж у тех, кому удобнее с логином. В итоге сейчас можно входить и так и так, указываешь в поле либо логин, либо почту, а сервак сам разберется. Имхо — лучшее решение.
    — Добавлено —

    Да что ты вообще понимаешь в жизни и криптоустойчивости, мальчик? Не понимаешь ничего в кибербезопасности — не лезь, а делай то, что говорят профи:
    [​IMG]
    — Добавлено —
    Тот случай, когда ты вбиваешь люто сложный пароль на учетку, под которой крутится некоторое бабло, а эта дрянь просит тебя его УПРОСТИТЬ и не дает зарегаться.

    Вот правда, в сбере, в отделе разработок реально работают люди, которые думают, что хэш-функции не все равно?


  22. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.604
    Симпатии:
    1.292
    Адрес:
    Лень

    У тебя зарядка на мобике заканчивается, покорми люлюку


    askanim и mahmuzar нравится это.


  23. keren

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42

    Вот как раз понимают что не надо шутить с баблом и совать туда как попало кодируемые многобайтные иероглифы.


  24. Fell-x27

    Команда форума
    Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА

    Еще один знаток принципов работы хэш-функций подъехал?
    Расскажешь мне, как многобайтные иероглифы могут помешать при правильном хранении пароля? Дам тысячу рублей, если раскроешь мне уязвимости, которые так можно эксплуатировать при том же password_hash(). Если таковых не раскроется, ты мне должен будешь тысячу. По рукам?

Страница 1 из 7

Summary: in this tutorial, you’ll learn about PHP form validation, how to validate form data, and how to show error messages if the user inputs are invalid.

Introduction to PHP form validation

When processing a form, it’s critical to validate user inputs to ensure that the data is in a valid format.

There are two types of validations: client-side & server-side:

The client-side validation is performed in the web browsers of the users. To validate data at the client side, you can use HTML5 validation or JavaScript. The client-side validation aims to assist legitimate users in entering data in the valid format before submitting it to the server.

However, client-side validation doesn’t prevent malicious users from submitting data that can potentially exploit the application.

The server-side validation validates data in the web server using PHP. To validate data in PHP, you can use the filter_var() and filter_input() functions.

PHP form validation example

We’ll build an email subscription form that includes a validation feature. The form has the name and email input elements and a submit button:

PHP form validation

If you don’t enter the name and/or email and click the subscribe button, the form will show the error messages. Also, if you enter an invalid email address, the form will show a different error message.

Notice that we don’t use the client-side validation for this form to make it easier to test. In practice, you should also use client-side validation.

Organize the directory and files

First, create a file and directory structure as follows:

.
├── css
│   └── style.css
├── inc
│   ├── get.php
│   ├── post.php
│   ├── header.php
│   ├── footer.php
│   └── .htaccess
└── index.phpCode language: plaintext (plaintext)

The following table describes the purpose of each file:

File Directory Description
index.php . Contain the main logic of the form
header.php inc Contain the header code
footer.php inc Contain the footer code
get.php inc Contain the email subscription form
post.php inc Contain the code for handling form submission
style.css css Contain the CSS code

header.php

The following shows the header.php file:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>Subscribe</title>
</head>
<body>
    <main>Code language: HTML, XML (xml)

The header.php file link to the style.css file in the css directory.

footer.php

And the footer.php only contains the enclosing tags that correspond to the opening tags in the header.php file:

</main>
</body>
</html>Code language: HTML, XML (xml)

index.php

The index.php file contains the main logic of the form:

<?php

require __DIR__ . '/inc/header.php';

$errors = [];
$inputs = [];

$request_method = strtoupper($_SERVER['REQUEST_METHOD']);

if ($request_method === 'GET') {
    // show the form
    require __DIR__ . '/inc/get.php';
} elseif ($request_method === 'POST') {
    // handle the form submission
    require    __DIR__ .  '/inc/post.php';
    // show the form if the error exists
    if (count($errors) > 0) {
        require __DIR__ . '/inc/get.php';
    }
}

require __DIR__ .  '/inc/footer.php';
Code language: HTML, XML (xml)

How the index.php works.

First, load code from both header.php and footer.php files using the require construct at the top and bottom of the file to generate the header and footer.

Second, define the $errors array to store error messages and the $inputs array to store the entered form values. If an input element has invalid data, the index.php will show the entered value stored in the $inputs.

Third, show the form if the HTTP request method is GET by loading the get.php file. Once you enter the

Finally, load the code in the post.php to handle the form submission if the HTTP request method is POST. If the form has any errors, the $errors will not empty. In this case, show the form again with the error messages stored in the $errors array and entered values stored in the $inputs arrays.

get.php

The get.php file contains the form:

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
    <header>
        <h1>Get FREE Updates</h1>
        <p>Join us for FREE to get email updates!</p>
    </header>
    <div>
        <label for="name">Name:</label>
        <input type="text" name="name" id="name" placeholder="Full Name" value="<?php echo $inputs['name'] ?? '' ?>" class="<?php echo isset($errors['name']) ? 'error' : ''  ?>">
        <small><?php echo $errors['name'] ?? '' ?></small>
    </div>
    <div>
        <label for="name">Email:</label>
        <input type="text" name="email" id="email" placeholder="Email Address" value="<?php echo $inputs['email'] ?? '' ?>" class="<?php echo isset($errors['email']) ? 'error' : '' ?>">
        <small><?php echo $errors['email'] ?? '' ?></small>
    </div>
    <button type="submit">Subscribe</button>
</form>Code language: HTML, XML (xml)

How the get.php works.

  • First, fill the name and email input elements with the entered values stored in the $inputs array only if these values exist.
  • Second, show the error messages stored in the $errors array if they exists.

post.php

The following shows the code of the post.php file. The post.php validates the form data using the filter_input() and filter_var() functions.

<?php

const NAME_REQUIRED = 'Please enter your name';
const EMAIL_REQUIRED = 'Please enter your email';
const EMAIL_INVALID = 'Please enter a valid email';

// sanitize and validate name
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$inputs['name'] = $name;

if ($name) {
    $name = trim($name);
    if ($name === '') {
        $errors['name'] = NAME_REQUIRED;
    }
} else {
    $errors['name'] = NAME_REQUIRED;
}


// sanitize & validate email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$inputs['email'] = $email;
if ($email) {
    // validate email
    $email = filter_var($email, FILTER_VALIDATE_EMAIL);
    if ($email === false) {
        $errors['email'] = EMAIL_INVALID;
    }
} else {
    $errors['email'] = EMAIL_REQUIRED;
}
?>

<?php if (count($errors) === 0) : ?>
    <section>
        <h2>
            Thanks <?php echo htmlspecialchars($name) ?> for your subscription!
        </h2>
        <p>Please follow the steps below to complete your subscription:</p>
        <ol>
            <li>Check your email (<?php echo htmlspecialchars($email) ?>) - Find the message sent from webmaster@phptutorial.net</li>
            <li>Click to confirm - Click on the link in the email to confirm your subscription.</li>
        </ol>
    </section>

<?php endif ?>Code language: HTML, XML (xml)

How it works.

First, define some constants to store the error messages. In a real-world application, you can store all the messages in a separate file:

const NAME_REQUIRED = 'Please enter your name';
const EMAIL_REQUIRED = 'Please enter your email';
const EMAIL_INVALID = 'Please enter a valid email';
Code language: JavaScript (javascript)

Second, sanitize and validate the name using the filter_input() function. If the name is empty, add an error message to the $errors array.

// sanitize and validate name
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$inputs['name'] = $name;

if ($name) {
    $name = trim($name);
    if ($name === '') {
        $errors['name'] = NAME_REQUIRED;
    }
} else {
    $errors['name'] = NAME_REQUIRED;
}Code language: PHP (php)

Third, sanitize and validate email using the filter_input() and filter_var() functions. If the email is empty or invalid, add the corresponding error message to the $errors array.

// sanitize & validate email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$inputs['email'] = $email;
if ($email) {
    // validate email
    $email = filter_var($email, FILTER_VALIDATE_EMAIL);
    if ($email === false) {
        $errors['email'] = EMAIL_INVALID;
    }
} else {
    $errors['email'] = EMAIL_REQUIRED;
}Code language: PHP (php)

Finally, if the form has no error, show the confirmation message:

<?php if (count($errors) === 0) : ?>
    <section>
        <h2>
            Thanks <?php echo htmlspecialchars($name) ?> for your subscription!
        </h2>
        <p>Please follow the steps below to complete your subscription:</p>
        <ol>
            <li>Check your email (<?php echo htmlspecialchars($email) ?>) - Find the message sent from webmaster@phptutorial.net</li>
            <li>Click to confirm - Click on the link in the email to confirm your subscription.</li>
        </ol>
    </section>
<?php endif ?>Code language: HTML, XML (xml)

To complete the form, you can save the contact data to a database or call an API of an email marketing service to add the contact to your list.

Summary

  • Use filter_input() and filter_var() functions to validate and sanitize data.

Did you find this tutorial useful?

Такая задача: проверяя введённые данные на стороне сервера, прервать выполнение скрипта отправки и вывести соответствующее сообщение об ошибке (такое как «введённое имя слишком короткое», «неправильно введён номер телефона» и т. д.).

Чего я не понимаю — как вернуть какое-либо значение при завершении выполнения скрипта, чтобы его можно было перехварить в php-файле с формой ввода. Я себе это представляю как-то так:

<!-- action.php - файл проверки данных и отправки сообщения -->
<form id="FeedbackFrom" name="FeedbackFrom" method="post" action="request.php">

    <input type="text" id="name"  name="name">  

    <?php
        if ($_GET['mail'] == 0 && $errorCode == "TooShortName") {
            echo "<p class="error"> Введённое имя слишком короткое </p>";
        }
        else if ($_GET['mail'] == 0 && $errorCode == "TooShortName") {
            echo "<p class="error"> Введённое имя слишком длинное </p>";
        }
    ?>

    <input type="email" id="email"  name="email">

    <?php
        if ($_GET['mail'] == 0 && $errorCode == "InvalidMail") {
            echo "<p class="error"> Адрес электронной почты ведён неправильно </p>";
        }
    ?>

    <input type ="submit" id="Submitt"/>

</form>
  • Есть exit, но он ничего не возвращает. Код ошибки там ловится какими-то извращенскими способами; непонятно, как поймать его в блоке if.
  • Есть исключения и конструкция try-catch. Но во-первых, нужно создавать отдельный класс для каждой ошибки, во-вторых как это «поймать» при аварийном завершении request.php?

задан 27 сен 2016 в 8:31

Боков Глеб's user avatar

Боков ГлебБоков Глеб

9982 золотых знака24 серебряных знака59 бронзовых знаков

<?php
$error = array();

$name = '';
$email = '';

// Если пришло значение
if(isset($_POST['name'])){
  $name = $_POST['name']; 
  // Если там пусто
  if(!$_POST['name']){
     $error['name'] = 'Пустое имя';
  }
}
// Если пришло значение
if(isset($_POST['email'])){
  $email = $_POST['email'];
  // Если там пусто
  if(!$_POST['email']){
     $error['email'] = 'Пустой email';
  }
}


if(isset($_POST['name']) && isset($_POST['email']) && (!$error)){
  mail($_POST['email'], 'Вы правильно заполнили форму', 'Ok' );
  die(); // Тут должен быть редирект на другую страницу
}


?>


<form id="FeedbackFrom" name="FeedbackFrom" method="post" action="request.php">

<input type="text" id="name"  name="name" value="<?php echo $name; ?>">  
<?php
if(isset($error['name'])){
  echo '<p class="error">' . $error['name'] . '</p>'; 
}
?>

<input type="email" id="email"  name="email" value="<?php echo $email; ?>">
<?php
if(isset($error['email'])){
  echo '<p class="error">' . $error['email'] . '</p>'; 
}
?>
    <input type ="submit" id="Submitt"/>
</form>

ответ дан 27 сен 2016 в 8:52

Mrak's user avatar

Если вкратце — как вариант в этих блоках ставить метку что есть ошибки заполнения

if ($_GET['mail'] == 0 && $errorCode == "TooShortName") {
    $form_invalid = true;
    echo "<p class="error"> Введённое имя слишком короткое </p>";
}

И в конце файла

if ( empty($form_invalid) ) {
    // http://www.w3schools.com/php/filter_sanitize_email.asp
    $email = filter_var($email, FILTER_SANITIZE_EMAIL);  
    mail($_POST['email'], 'Вы правильно заполнили форму', 'Ok' );
    header('Location: action.php?mail_send=true');
    die(); // Тут должен быть редирект на другую страницу, иначе при каждой перезагрузке станицы будет отправляться письмо
}

Но как по мне лучше использовать AJAX, это гораздо удобнее.

ответ дан 27 сен 2016 в 9:19

MaxWell99's user avatar

3

Понравилась статья? Поделить с друзьями:
  • Php исправить ошибки в скрипте
  • Php загружает файлы с ошибкой
  • Php если ошибка include то
  • Php если будет ошибка то вывести этот файл
  • Php глобальная переменная с ошибками