Вернуться на страницу трюков

Формы: обработка данных, повторное заполнение при F5, невозможно отправить Header.

Это всё взаимосвязано. Начнём по пунтам, но с конца. В начале у нас есть форма с данными, смотрим:
<form action="" method="post">
    Введите ФИО: <input type="text" name="fio" value="">
    <input type="submit" name="formsend" value="Отправить">

Наша цель: пользователь введёт фио, запрос обрабатывается и добавляется в Базу данных.

Для успешной работы формы нам необходимо сформировать страницу в правильном виде.

Правило №1: запрос отправляется сам на себя (action=""). Это делается с той целью, что если какая-то ошибка при заполнении формы, человеку она выводилась снова, но с заполненными данными.

Правило №2: структура построения страницы должна быть такова: в начале обработка ПХП (без вывода любой информации на экран), а потом вывод данных на экран. Необходим для редиректа (header) страницы на другую. Все делается для того, чтобы пользователь при нажатии на F5 не мог отправить результаты формы снова. То есть обычный редирект страницы саму на себя мы получим очищение POST данных, отправленных формой.

Правило №3: теперь, когда вверху у нас код, надо сделать правильную проверку на нажатие кнопки. Кнопка имеет имя: "formsend", поэтому проверка на пустоту кнопки сможет определить, была ли нажата кнопка формы или нет. Особенно актуально, если на странице несколько кнопок в одной форме, каждая из которых будет вызывать своё действие. Смотрим проверку:
<?php
if(!empty($_POST['formsend']))


Правило №4: для передачи прошедшего результата операции нам достаточно использовать сессию, если же неудачно, хватит и обычного массива.

Смотрим реализацию приведённого в начале кода:
<?php session_start();
// mysql_connect, выставляем кодировку , другие функции БЕЗ ВЫВОДА данных (echo, print и т.д.)

$error = array();

$good = !empty($_SESSION['good']) ? $_SESSION['good'] : '';

if(!empty($_POST['formsend']))
{
// инициализируем переменные:
    $fio = trim($_POST['fio']) == '' ? trim($_POST['fio']) : '';

// следующую проверку делаем для всех наших данных
    if(empty($fio))
        $error['fio'] = 'Вы не ввели ФИО';

// Если одна из предыдущих проверок не прошла, то в массив будут добавлены данные,
// а значит ключей массива будет больше 0 и проверка не пройдет.
    if(count($error) == 0)
    {
        $res = mysql_query(); // запрос
        if($res == true)
        {
            $_SESSION['good'] = '<h3>Операция прошла успешно</h3>';
            header("Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']); // редирект сам на себя
            exit();
        }
        else
            $good = '<h3>Запрос к БД не прошел, свяжитесь с администрацией</h3>';
    }
}
?>
<form action="" method="post">
    <?php echo $good; ?>
    <input type="text" name="fio" value="<?php echo htmlspecialchars($_POST['fio']); ?>"> 
        <?php echo $error['fio']; ?>
    <input type="submit" name="formsend">
</form>
Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы