Добрый день, есть следующий скрипт PHP для формы обратной связи: PHP: <?php session_start(); $admin = 'email'; if ( isset( $_POST['sendMail'] ) ) { $name = substr( $_POST['name'], 0, 64 ); $email = substr( $_POST['email'], 0, 64 ); $subject = substr( $_POST['subject'], 0, 64 ); $message = substr( $_POST['message'], 0, 250 ); // обработка ошибок $error = ''; if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>'; if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>'; if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>'; if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>'; if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) ) $error = $error.'<li>поле "E-mail" должно соответствовать формату [email=somebody@somewhere.ru]somebody@somewhere.ru[/email]</li>'; if ( !empty( $error ) ) { $_SESSION['sendMailForm']['error'] = '<p>При заполнении формы были допущены ошибки: </p><ul>'.$error.'</ul>'; $_SESSION['sendMailForm']['name'] = $name; $_SESSION['sendMailForm']['email'] = $email; $_SESSION['sendMailForm']['subject'] = $subject; $_SESSION['sendMailForm']['message'] = $message; header( 'Location: '.$_SERVER['PHP_SELF'] ); // перенаправление в корневую страницу если есть ошибки die(); } // формирование письма $body = "АВТОР:\r\n".$name."\r\n\r\n"; $body .= "E-MAIL:\r\n".$email."\r\n\r\n"; $body .= "ТЕМА:\r\n".$subject."\r\n\r\n"; $body .= "СООБЩЕНИЕ:\r\n".$message; $body = quoted_printable_encode( $body ); $theme = '=?windows-1251?B?'.base64_encode('Заполнена форма на сайте').'?='; $headers = "From: ".$_SERVER['SERVER_NAME']." <".$email.">\r\n"; $headers = $headers."Return-path: <".$email.">\r\n"; $headers = $headers."Content-type: text/plain; charset=\"windows-1251\"\r\n"; $headers = $headers."Content-Transfer-Encoding: quoted-printable\r\n\r\n"; if ( mail($admin, $theme, $body, $headers) ) $_SESSION['success'] = true; else $_SESSION['success'] = false; header( 'Location: '.$_SERVER['PHP_SELF'] ); die(); } function quoted_printable_encode ( $string ) { // rule #2, #3 (leaves space and tab characters in tact) $string = preg_replace_callback ( '/[^\x21-\x3C\x3E-\x7E\x09\x20]/', 'quoted_printable_encode_character', $string ); $newline = "=\r\n"; // '=' + CRLF (rule #4) // make sure the splitting of lines does not interfere with escaped characters // (chunk_split fails here) $string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string); return $string; } function quoted_printable_encode_character ( $matches ) { $character = $matches[0]; return sprintf ( '=%02x', ord ( $character ) ); } ?> Всем хорош, но: а) письма приходят с него приходят в непонятной кодировке (то есть если латиницей заполнены поля, то все ок, а вот если кирилицей то беда); б) пользователь нажимает кнопку отправить и у него появляется белый экран и сообщение уходит (было бы здорово чтобы страница не менялась, а просто после нажатия появлялась надпись типа "Ваше сообщение успешно отправлено, мы обязательно с вами свяжемся". У кого какие мысли, какие строчки в скрипт добавить, а что исправить, чтобы это реализовать?! Спасибо.
плохая привычка - заводить сессии для каждого посетителя. Что будет с вашим сервером, если пара скрипт на нескольких серверах станет в цикле запрашивать вашу страницу с контактной формой, не возвращая SID?
не очень понимаю вы могли бы дать исправленную строку как сделать лучше я просто в этом не очень понимаю
[vs], вроде как если сессия не была разрушена и сид передается через куки или через гет, то session_start подцепляет существующую сессию. а если отключены куки и через гет я тоже по какой-то причине не передаю (тот кто запрашивает - отрезает по какой-то причине сид), то буду плодить пользователей, да. а есть другие варианты?
единственный вариант убрать эту строку, и хранить оперативные данные для незалогиненных посетителей просто в куках. Т.е. сессию заводить только для авторизированных пользователей. Вместо писать PHP: setcookie('sendMailFormName', $name); Далее, в самом скрипте идет только запись в сессии. Эти данные в скрипте потом не используются, значит используются на других страницах: вот в этих страницах вместо PHP: $_SESSION['sendMailForm']['error'] писать PHP: $_COOKIE['sendMailFromError'] т.е. заменить всю работу с сессиями на работу с куками.
Насколько это актуально в виду того что на сайте всего только на двух страницах используется форма обратной связи, тупо для того, чтобы пользователь мог связаться?
Актуально прямо пропорционально 1) посещаемости 2) количеству потенциальных недоброжелателей При высокой посещаемость однозначно противопоказано заводить сессию для каждого посетителя. прочитайте, что такое сессии и подумайте: http://phpfaq.ru/sessions
Не много подправив синтаксические ошибки код сейчас выглядит вот так: Код (Text): <?php if(isset($_GET["mail"])) echo 'Ваше письмо отправлено...'; session_start(); $admin = 'admin email'; if ( isset( $_POST['sendMail'] ) ) { $name = substr( $_POST['name'], 0, 64 ); $email = substr( $_POST['email'], 0, 64 ); $subject = substr( $_POST['subject'], 0, 64 ); $message = substr( $_POST['message'], 0, 250 ); } // обработка ошибок $error = ''; if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>'; if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>'; if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>'; if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>'; if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) ) $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>'; if ( !empty( $error ) ) { $_SESSION['sendMailForm']['error'] = '<p>При заполнении формы были допущены ошибки: </p><ul>'.$error.'</ul>'; $_SESSION['sendMailForm']['name'] = $name; $_SESSION['sendMailForm']['email'] = $email; $_SESSION['sendMailForm']['subject'] = $subject; $_SESSION['sendMailForm']['message'] = $message; header( 'Location: '.$_SERVER['PHP_SELF'] ); // перенаправление в корневую страницу если есть ошибки die(); } $body = "АВТОР:".$name." E-MAIL".$email." ТЕМА:".$subject." СООБЩЕНИЕ:".$message; if ( mail($admin, "Заполнена форма на сайте", $body) ){ $_SESSION['success'] = true; header( 'Location: '.$_SERVER['PHP_SELF'].'?mail=1'); } else { $_SESSION['success'] = false; header( 'Location: '.$_SERVER['PHP_SELF'] ); die(); } ?> Соответственно проблемы сохранились те же, а именно: 1) проблема с кодировкой в приходящих с заполненной формы писем; 2) пользователь получает белый экран вместо сообщения ваше письмо успешно отправлено. нужен help
1. Код (Text): header('Content-Type: text/html; charset=windows-1251'); 2. Код (Text): if ( mail($admin, "Заполнена форма на сайте", $body) ){ $_SESSION['success'] = true; echo "Сообщение успешно отправлено"; }
Огромное спасибо, а вот это Код (Text): header('Content-Type: text/html; charset=windows-1251'); после чего вставить или где?
пока результат следующий: "Parse error: syntax error, unexpected '}' in /var/www/u1635271/data/www/bbapple.ru/send.php on line 39" и письмо не уходит, а 39 строка это: Код (Text): <?php if(isset($_GET["mail"])) echo 'Ваше письмо отправлено...'; session_start(); $admin = 'email'; if ( isset( $_POST['sendMail'] ) ) { $name = substr( $_POST['name'], 0, 64 ); $email = substr( $_POST['email'], 0, 64 ); $subject = substr( $_POST['subject'], 0, 64 ); $message = substr( $_POST['message'], 0, 250 ); } // обработка ошибок $error = ''; if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>'; if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>'; if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>'; if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>'; if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) ) $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>'; if ( !empty( $error ) ) { $_SESSION['sendMailForm']['error'] = '<p>При заполнении формы были допущены ошибки: </p><ul>'.$error.'</ul>'; $_SESSION['sendMailForm']['name'] = $name; $_SESSION['sendMailForm']['email'] = $email; $_SESSION['sendMailForm']['subject'] = $subject; $_SESSION['sendMailForm']['message'] = $message; header( 'Location: '.$_SERVER['PHP_SELF'] ); // перенаправление в корневую страницу если есть ошибки die(); } $body = "АВТОР:".$name." E-MAIL".$email." ТЕМА:".$subject." СООБЩЕНИЕ:".$message; if ( mail($admin, "Заполнена форма на сайте", $body) ){ $_SESSION['success'] = true; echo "Сообщение успешно отправлено"; } header( 'Location: '.$_SERVER['PHP_SELF'].'?mail=1'); } else { $_SESSION['success'] = false; header( 'Location: '.$_SERVER['PHP_SELF'] ); die(); } ?> То есть 39 строка это " }" перед Код (Text): else { $_SESSION['success'] = false; header( 'Location: '.$_SERVER['PHP_SELF'] ); die();
Код (Text): <?php header('Content-Type: text/html; charset=windows-1251'); if(isset($_GET["mail"])) echo 'Ваше письмо отправлено...'; session_start(); $admin = 'email'; if ( isset( $_POST['sendMail'] ) ) { $name = substr( $_POST['name'], 0, 64 ); $email = substr( $_POST['email'], 0, 64 ); $subject = substr( $_POST['subject'], 0, 64 ); $message = substr( $_POST['message'], 0, 250 ); } // обработка ошибок $error = ''; if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>'; if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>'; if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>'; if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>'; if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) ) $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>'; if ( !empty( $error ) ) { $_SESSION['sendMailForm']['error'] = '<p>При заполнении формы были допущены ошибки: </p><ul>'.$error.'</ul>'; $_SESSION['sendMailForm']['name'] = $name; $_SESSION['sendMailForm']['email'] = $email; $_SESSION['sendMailForm']['subject'] = $subject; $_SESSION['sendMailForm']['message'] = $message; header( 'Location: '.$_SERVER['PHP_SELF'] ); // перенаправление в корневую страницу если есть ошибки die(); } $body = "АВТОР:".$name." E-MAIL".$email." ТЕМА:".$subject." СООБЩЕНИЕ:".$message; if ( mail($admin, "Заполнена форма на сайте", $body) ){ $_SESSION['success'] = true; echo "Сообщение успешно отправлено"; } else { $_SESSION['success'] = false; header( 'Location: '.$_SERVER['PHP_SELF'] ); die(); } ?>
Benjamin Супер, правда теперь письмо приходит вида: "АВТОР:Сергей E-MAILexample@domain.com ТЕМА:?????? ? ????? СООБЩЕНИЕ:Тест" Да и нельзя как-то сделать так чтобы напись сообщение успешно отправлено всплывало на той же странице а не переходило на белый экран?