За последние 24 часа нас посетили 24383 программиста и 1712 роботов. Сейчас ищут 1882 программиста ...

Мысли по улучшению PHP скрипта формы обратной связи

Тема в разделе "Вопросы от блондинок", создана пользователем burndalen, 30 апр 2011.

  1. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Добрый день,
    есть следующий скрипт PHP для формы обратной связи:

    PHP:
    1. <?php
    2.   $admin = 'email';
    3.   if ( isset( $_POST['sendMail'] ) ) {
    4.   $name  = substr( $_POST['name'], 0, 64 );
    5.   $email   = substr( $_POST['email'], 0, 64 );
    6.   $subject = substr( $_POST['subject'], 0, 64 );
    7.   $message = substr( $_POST['message'], 0, 250 );
    8.  
    9.   // обработка ошибок
    10.   $error = '';
    11.   if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
    12.   if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
    13.   if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
    14.   if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
    15.   if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
    16.   $error = $error.'<li>поле "E-mail" должно соответствовать формату [email=somebody@somewhere.ru]somebody@somewhere.ru[/email]</li>';
    17.   if ( !empty( $error ) ) {
    18.   $_SESSION['sendMailForm']['error']   = '<p>При заполнении формы были допущены ошибки:
    19. </p><ul>'.$error.'</ul>';
    20.   $_SESSION['sendMailForm']['name']    = $name;
    21.   $_SESSION['sendMailForm']['email']   = $email;
    22.   $_SESSION['sendMailForm']['subject'] = $subject;
    23.   $_SESSION['sendMailForm']['message'] = $message;
    24.   header( 'Location: '.$_SERVER['PHP_SELF'] );
    25. // перенаправление в корневую страницу если есть ошибки
    26.   die();
    27.   }
    28.  
    29.   // формирование письма
    30.   $body = "АВТОР:\r\n".$name."\r\n\r\n";
    31.   $body .= "E-MAIL:\r\n".$email."\r\n\r\n";  
    32.   $body .= "ТЕМА:\r\n".$subject."\r\n\r\n";
    33.   $body .= "СООБЩЕНИЕ:\r\n".$message;
    34.   $body = quoted_printable_encode( $body );
    35.   $theme   = '=?windows-1251?B?'.base64_encode('Заполнена форма на сайте').'?=';
    36.   $headers = "From: ".$_SERVER['SERVER_NAME']." <".$email.">\r\n";
    37.   $headers = $headers."Return-path: <".$email.">\r\n";
    38.   $headers = $headers."Content-type: text/plain; charset=\"windows-1251\"\r\n";
    39.   $headers = $headers."Content-Transfer-Encoding: quoted-printable\r\n\r\n";
    40.  
    41.   if ( mail($admin, $theme, $body, $headers) )
    42.   $_SESSION['success'] = true;
    43.   else
    44.   $_SESSION['success'] = false;
    45.   header( 'Location: '.$_SERVER['PHP_SELF'] );
    46.   die();
    47.   }
    48.  
    49.   function quoted_printable_encode ( $string ) {
    50.   // rule #2, #3 (leaves space and tab characters in tact)
    51.   $string = preg_replace_callback (
    52.   '/[^\x21-\x3C\x3E-\x7E\x09\x20]/',
    53.   'quoted_printable_encode_character',
    54.   $string
    55.   );
    56.   $newline = "=\r\n"; // '=' + CRLF (rule #4)
    57.   // make sure the splitting of lines does not interfere with escaped characters
    58.   // (chunk_split fails here)
    59.   $string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string);
    60.   return $string;
    61.   }
    62.  
    63.   function quoted_printable_encode_character ( $matches ) {
    64.   $character = $matches[0];
    65.   return sprintf ( '=%02x', ord ( $character ) );
    66.   }
    67.   ?>
    Всем хорош, но:

    а) письма приходят с него приходят в непонятной кодировке (то есть если латиницей заполнены поля, то все ок, а вот если кирилицей то беда);
    б) пользователь нажимает кнопку отправить и у него появляется белый экран и сообщение уходит (было бы здорово чтобы страница не менялась, а просто после нажатия появлялась надпись типа "Ваше сообщение успешно отправлено, мы обязательно с вами свяжемся".

    У кого какие мысли, какие строчки в скрипт добавить, а что исправить, чтобы это реализовать?!
    Спасибо.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    плохая привычка - заводить сессии для каждого посетителя. Что будет с вашим сервером, если пара скрипт на нескольких серверах станет в цикле запрашивать вашу страницу с контактной формой, не возвращая SID?
     
  3. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    не очень понимаю вы могли бы дать исправленную строку как сделать лучше я просто в этом не очень понимаю
     
  4. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    [vs], вроде как если сессия не была разрушена и сид передается через куки или через гет, то session_start подцепляет существующую сессию. а если отключены куки и через гет я тоже по какой-то причине не передаю (тот кто запрашивает - отрезает по какой-то причине сид), то буду плодить пользователей, да. а есть другие варианты?
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    единственный вариант
    убрать эту строку, и хранить оперативные данные для незалогиненных посетителей просто в куках.
    Т.е. сессию заводить только для авторизированных пользователей.
    Вместо
    писать
    PHP:
    1. setcookie('sendMailFormName', $name);
    Далее, в самом скрипте идет только запись в сессии. Эти данные в скрипте потом не используются, значит используются на других страницах:
    вот в этих страницах вместо
    PHP:
    1. $_SESSION['sendMailForm']['error']
    писать
    PHP:
    1. $_COOKIE['sendMailFromError']
    т.е. заменить всю работу с сессиями на работу с куками.
     
  6. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Насколько это актуально в виду того что на сайте всего только на двух страницах используется форма обратной связи, тупо для того, чтобы пользователь мог связаться?
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Актуально прямо пропорционально 1) посещаемости 2) количеству потенциальных недоброжелателей
    При высокой посещаемость однозначно противопоказано заводить сессию для каждого посетителя.
    прочитайте, что такое сессии и подумайте: http://phpfaq.ru/sessions
     
  8. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Согласен какой номер стройки? какую строку надо поменять на какую?
     
  9. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Не много подправив синтаксические ошибки код сейчас выглядит вот так:
    Код (Text):
    1.  
    2. <?php
    3. if(isset($_GET["mail"]))
    4.     echo 'Ваше письмо отправлено...';
    5. session_start();
    6. $admin = 'admin email';
    7. if ( isset( $_POST['sendMail'] ) ) {
    8.     $name  = substr( $_POST['name'], 0, 64 );
    9.     $email   = substr( $_POST['email'], 0, 64 );
    10.     $subject = substr( $_POST['subject'], 0, 64 );
    11.     $message = substr( $_POST['message'], 0, 250 );
    12.     }
    13.  
    14.     // обработка ошибок
    15.     $error = '';
    16.     if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
    17.     if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
    18.     if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
    19.     if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
    20.     if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
    21.         $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>';
    22.     if ( !empty( $error ) ) {
    23.         $_SESSION['sendMailForm']['error']   = '<p>При заполнении формы были допущены ошибки:
    24.         </p><ul>'.$error.'</ul>';
    25.         $_SESSION['sendMailForm']['name']    = $name;
    26.         $_SESSION['sendMailForm']['email']   = $email;
    27.         $_SESSION['sendMailForm']['subject'] = $subject;
    28.         $_SESSION['sendMailForm']['message'] = $message;
    29.         header( 'Location: '.$_SERVER['PHP_SELF'] );
    30.         // перенаправление в корневую страницу если есть ошибки
    31.         die();
    32.     }
    33.  
    34.     $body = "АВТОР:".$name." E-MAIL".$email." ТЕМА:".$subject." СООБЩЕНИЕ:".$message;
    35.     if ( mail($admin, "Заполнена форма на сайте", $body) ){
    36.         $_SESSION['success'] = true;
    37.         header( 'Location: '.$_SERVER['PHP_SELF'].'?mail=1');
    38.     }
    39.     else
    40.     {
    41.         $_SESSION['success'] = false;
    42.     header( 'Location: '.$_SERVER['PHP_SELF'] );
    43.     die();
    44.     }
    45. ?>
    Соответственно проблемы сохранились те же, а именно:

    1) проблема с кодировкой в приходящих с заполненной формы писем;
    2) пользователь получает белый экран вместо сообщения ваше письмо успешно отправлено.

    нужен help ;)
     
  10. Benjamin

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

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    1.
    Код (Text):
    1. header('Content-Type: text/html; charset=windows-1251');
    2.
    Код (Text):
    1. if ( mail($admin, "Заполнена форма на сайте", $body) ){
    2.         $_SESSION['success'] = true;
    3.         echo "Сообщение успешно отправлено";
    4.     }
     
  11. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Огромное спасибо, а вот это
    Код (Text):
    1. header('Content-Type: text/html; charset=windows-1251');
    после чего вставить или где?
     
  12. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    пока результат следующий:
    "Parse error: syntax error, unexpected '}' in /var/www/u1635271/data/www/bbapple.ru/send.php on line 39"

    и письмо не уходит, а 39 строка это:

    Код (Text):
    1.  
    2. <?php
    3. if(isset($_GET["mail"]))
    4.     echo 'Ваше письмо отправлено...';
    5. session_start();
    6. $admin = 'email';
    7. if ( isset( $_POST['sendMail'] ) ) {
    8.     $name  = substr( $_POST['name'], 0, 64 );
    9.     $email   = substr( $_POST['email'], 0, 64 );
    10.     $subject = substr( $_POST['subject'], 0, 64 );
    11.     $message = substr( $_POST['message'], 0, 250 );
    12.     }
    13.  
    14.     // обработка ошибок
    15.     $error = '';
    16.     if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
    17.     if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
    18.     if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
    19.     if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
    20.     if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
    21.         $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>';
    22.     if ( !empty( $error ) ) {
    23.         $_SESSION['sendMailForm']['error']   = '<p>При заполнении формы были допущены ошибки:
    24.         </p><ul>'.$error.'</ul>';
    25.         $_SESSION['sendMailForm']['name']    = $name;
    26.         $_SESSION['sendMailForm']['email']   = $email;
    27.         $_SESSION['sendMailForm']['subject'] = $subject;
    28.         $_SESSION['sendMailForm']['message'] = $message;
    29.         header( 'Location: '.$_SERVER['PHP_SELF'] );
    30.         // перенаправление в корневую страницу если есть ошибки
    31.         die();
    32.     }
    33.  
    34.     $body = "АВТОР:".$name." E-MAIL".$email." ТЕМА:".$subject." СООБЩЕНИЕ:".$message;
    35.     if ( mail($admin, "Заполнена форма на сайте", $body) ){
    36.         $_SESSION['success'] = true;
    37.         echo "Сообщение успешно отправлено";
    38.     }
    39.         header( 'Location: '.$_SERVER['PHP_SELF'].'?mail=1');
    40.     }
    41.     else
    42.     {
    43.         $_SESSION['success'] = false;
    44.     header( 'Location: '.$_SERVER['PHP_SELF'] );
    45.     die();
    46.     }
    47. ?>
    То есть 39 строка это " }" перед
    Код (Text):
    1. else
    2.     {
    3.         $_SESSION['success'] = false;
    4.     header( 'Location: '.$_SERVER['PHP_SELF'] );
    5.     die();
     
  13. Benjamin

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

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    Код (Text):
    1. <?php
    2. header('Content-Type: text/html; charset=windows-1251');
    3. if(isset($_GET["mail"]))
    4.     echo 'Ваше письмо отправлено...';
    5. session_start();
    6. $admin = 'email';
    7. if ( isset( $_POST['sendMail'] ) ) {
    8.     $name  = substr( $_POST['name'], 0, 64 );
    9.     $email   = substr( $_POST['email'], 0, 64 );
    10.     $subject = substr( $_POST['subject'], 0, 64 );
    11.     $message = substr( $_POST['message'], 0, 250 );
    12.    }
    13.  
    14.     // обработка ошибок
    15.     $error = '';
    16.     if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
    17.     if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
    18.     if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
    19.     if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
    20.     if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
    21.         $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>';
    22.     if ( !empty( $error ) ) {
    23.         $_SESSION['sendMailForm']['error']   = '<p>При заполнении формы были допущены ошибки:
    24.         </p><ul>'.$error.'</ul>';
    25.         $_SESSION['sendMailForm']['name']    = $name;
    26.         $_SESSION['sendMailForm']['email']   = $email;
    27.         $_SESSION['sendMailForm']['subject'] = $subject;
    28.         $_SESSION['sendMailForm']['message'] = $message;
    29.         header( 'Location: '.$_SERVER['PHP_SELF'] );
    30.         // перенаправление в корневую страницу если есть ошибки
    31.         die();
    32.     }
    33.  
    34.     $body = "АВТОР:".$name." E-MAIL".$email." ТЕМА:".$subject." СООБЩЕНИЕ:".$message;
    35.     if ( mail($admin, "Заполнена форма на сайте", $body) ){
    36.         $_SESSION['success'] = true;
    37.       echo "Сообщение успешно отправлено";
    38.     }
    39.     else
    40.    {
    41.         $_SESSION['success'] = false;
    42.     header( 'Location: '.$_SERVER['PHP_SELF'] );
    43.     die();
    44.     }
    45. ?>
     
  14. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Benjamin
    Супер, правда теперь письмо приходит вида:

    "АВТОР:Сергей E-MAILexample@domain.com ТЕМА:?????? ? ????? СООБЩЕНИЕ:Тест"

    Да и нельзя как-то сделать так чтобы напись сообщение успешно отправлено всплывало на той же странице а не переходило на белый экран?
     
  15. Benjamin

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

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    Передай $headers функции mail.
     
  16. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Можно готовым кодом мне просто так мало о чем это говорит?
     
  17. Benjamin

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

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    Тогда Вам во фриланс.
     
  18. burndalen

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

    С нами с:
    29 апр 2011
    Сообщения:
    25
    Симпатии:
    0
    Спасибо :)
     
  19. Benjamin

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

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    Всегда рад помочь :)