1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Форма обратной связи (критика)

Тема в разделе "Web Coding", создана пользователем lolshik, 6 мар 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. lolshik

    lolshik

    Регистр.:
    21 фев 2008
    Сообщения:
    316
    Симпатии:
    127
    Написал небольшой скрипт формы обратной связи на php.
    Чем отличается ото всех остальных?
    Если пользователь ввёл неверные данные, то ему не придётся вводить их заново. Он увидит ошибку, и поправит неправильные данные, не вводя заново все остальные.

    Общая логика
    Код:
    <?php
    
    if (isset($_POST['submit_check'])) { //форма была отправлена
    
    	if ($form_errors = validate_form()) { // Если $form_errors присвоился не пустой массив
    	                                      // то показываем ошибки.
    		show_form($form_errors);
    		}
    
    	else {
    		process_form();
    		}
        }
    
    else {
    	show_form();
    	}
    
    Функции

    Код:
    function validate_form() {
    
    
    	$errors = array();
        $_POST['name'] = trim($_POST['name']);
        $_POST['email'] = trim($_POST['email']);
    
    	if (mb_strlen($_POST['name'],'utf8') == 0) {
    		$errors[] = "Вы не заполнили имя";
    		}
    	if (!preg_match('/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i',$_POST['email'])) {
    		$errors[] = 'Введите правильный e-mail.';
    		}
    	if (mb_strlen($_POST['message']) < 10) {
    		$errors[] = 'Введите текст сообщения.';
    		}
    
    
    	return $errors;
    	}
    
    function show_form($errors = '') {
    
    if (!empty($errors)) {
    
        echo "<br><center><div class='warning'><font size='2'color='#FF0000'><b>Обнаружены ошибки:</b></font><br>";
    
    	 foreach ($errors as $value) {
    		print $value."<br>";
    	}
    	echo "</div></center>";
    
    
    
    
    
    
    
    
    	show_form_content();
    	}
    else {
    
    
    print <<<HERE
    
    <table align='center' class='table_form' width='400px'>
    <form method='post' action="$_SERVER[PHP_SELF]">
    <tr><td colspan='2'>Введите вопрос и данные для связи :</td></tr>
    <tr><td width='200'>Ваше имя</td>
    <td width='*'><input type='text' name='name' value=''></td></tr>
    <tr><td>E-Mail</td><td><input type='text' name='email' value=''></td></tr>
    <tr><td>Ваш вопрос или комментарий</td><td><textarea rows='5' cols='30' name='message'></textarea></td></tr>
    <input name='submit_check' type='hidden' value='1'>
    <td><input type='submit' name='submit' class='formbutton' value='Отправить'></td></tr></form></table>
    
    HERE;
    }
    }
    
    
    function show_form_content() {
    
    print <<<HERE
    <table align='center' class='table_form' width='400px'>
    <form method='post' action="$_SERVER[PHP_SELF]">
    <tr><td colspan='2'>Введите вопрос и данные для связи :</td></tr>
    <tr><td width='200'>Ваше имя</td>
    <td width='*'><input type='text' name='name' value='$_POST[name]'></td></tr>
    <tr><td>E-Mail</td><td><input type='text' name='email' value='$_POST[email]'></td></tr>
    <tr><td>Ваш вопрос или комментарий</td><td><textarea rows='5' cols='30' name='message'>$_POST[message]</textarea></td></tr>
    <input name='submit_check' type='hidden' value='1'>
    <td><input type='submit' name='submit' class='formbutton' value='Отправить'></td></tr></form></table>
    
    
    HERE;
    
    
    }
    
    function process_form() {
    
        $name = $_POST['name'];
        $email = $_POST['email'];
        $msg = $_POST['message'];
    
        $name=trim($name);
        $email=trim($email);
        $msg=trim($msg);
    
    
    	if (mail("$email", "С веб сайта", "$msg"));
    
    	print "<br><table align='center' class='table_form' width='350px'>
               <tr>
               <td>Cпасибо $_POST[name]. Сообщение успешно отправлено. <br>Мы ответим Вам максимально быстро.
               </td></tr></table>";
    	}
    
    Конструктивная критика превествуется.
     
  2. RomAndry

    RomAndry Постоялец

    Регистр.:
    21 ноя 2007
    Сообщения:
    102
    Симпатии:
    24
    навскидку:
    1. if ($form_errors == validate_form())
    2. print <<<HERE .... HERE;
    нет смысла 2 раза повторять форму, сохраните как переменную.
    3. почитайте phpfaq.ru там много интересного
     
  3. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    если из критики, то добавлю к вышенаписанному, что не print, a echo.

    а вообще познакомтесь с сайтом phpclasses.org, чтоб впоследующем не изобретать велосипед.
     
  4. vovaNux

    vovaNux Постоялец

    Регистр.:
    10 апр 2007
    Сообщения:
    125
    Симпатии:
    16
    Мне кажется, что лучше сначала задействовать проверку яваскриптом, а потом уже на пхп. Для яваскрипта есть много готовых решений (вот, самое простое - _http://www.w3schools.com/js/js_form_validation.asp). На пхп действительно лучше классы задействовать, потому что на тему form validation уже очень многое написано и лучше едва ли получится
     
  5. vilk108

    vilk108

    Регистр.:
    17 дек 2007
    Сообщения:
    174
    Симпатии:
    41
    а какая разница?
     
  6. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Для вывода рекомендовано использовать echo. В твоем случае лучше форму сохранить в отдельный файл и загружать из скрипта так дизайн легче править
     
  7. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    print - функция, echo - оператор.

    операторы выполняются быстрее функций.
     
  8. Alexandre

    Alexandre Создатель

    Регистр.:
    13 авг 2007
    Сообщения:
    10
    Симпатии:
    0
    Да print редко кто использует.
     
  9. lobzik

    lobzik

    Регистр.:
    8 авг 2006
    Сообщения:
    311
    Симпатии:
    49
    2PHP_Master
    echo - конструкция.

    2Alexandre
    Обоснуйте. Жаль я не могу модерит в этом разделе :mad:

    2lolshik
    PHP:
    if (mb_strlen($_POST['name'],'utf8') == 0) {
            
    $errors[] = "Вы не заполнили имя";
            }
    Думаю, вместо вызова функции подсчета длины строки и сравнения с нулем, использовать конструкцию empty(). Все равно после "тримания" в переменной не может быть только один пробел. Заодно все же стоит проверить длину.
    А можно сделать так...:ah:
    PHP:
    empty($_POST['name'][5]) //здесь 5 - минимальная длина
    Но это врятли подайдет, надо ограничивать максимальную длину и не должен быть на пятом месте ноль, но это все мелочи :D
     
Статус темы:
Закрыта.