Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.11.2020, 17:49
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Не проверяет поле Select в форме "Обратная связь"
Установил на сайт скрипт Обратной связи, изменил под себя (использую как Задать вопрос), все работает, но при отправке не проверяет 2 поля <select> (выбрано в них что-то или нет).

Еще нужно прикрутить какую-нибудь капчу, чтобы спамеры не доставали.
Сам не смог справиться с этим, знаний не хватает. Помогите пожалуйста.
Заранее благодарю.

файл mails_sender.php
<?php
 
// Адрес, куда отправляем письмо
$to = 'pochta@mail.ru';
 
// Получаем данные от пользователя
// Все данные обязательно нужно проверять на правильность!
$userEmail = filter_input(INPUT_POST, 'youremail', FILTER_VALIDATE_EMAIL);
$subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$option = filter_input(INPUT_POST, 'option', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$message = strip_tags(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_MAGIC_QUOTES), '<p><a><b><div><br>');
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$sex = filter_input(INPUT_POST, 'sex', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
 
// Проверка, что данные не пустые. 
// Нас не интересуют анонимки
if (empty($userEmail)) {
    die('Отсутствует или неверен адрес почты');
// Нас не интересуют послания с пустым сообщением
} elseif (empty($message)) {
    die('Отсутствует сообщение');
} elseif (empty($sex)) {
    $sex = '[Выберите Ваш пол]';
} elseif (empty($option)) {
    $option = '[Выберите сотрудника]';
}
// elseif (empty($subject)) {
//    $subject = '[тема не указана]';}
 
 
$the_file = '';
//Если пользователь выбрал файл для отправки
if (!empty($_FILES['fileforsending']['tmp_name'])) {
    // Закачиваем файл
    $path = $_FILES['fileforsending']['name'];
    if (copy($_FILES['fileforsending']['tmp_name'], $path)) {
        $the_file = $path;
    }
}
// Если есть прикреплённый файл, то заголовки чуть другие.
// Поэтому, в зависимости от того, отправил ли пользователь файл,
// выбираем, что делать дальше
$headers = null;
 
if (empty($the_file)) {
    // эта часть кода отвечает за отправку сообщений без вложений
    // собираем заголовки
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "Content-type: text/html; charset=UTF-8";
    $headers[] = "From: $name <$userEmail>";
    $headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
    $headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: Связь с администратором!";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    // собираем текст письма
    $allmsg = "
    <p><b>Пол:</b> $sex</p>
    <p><b>E-mail:</b> $userEmail</p>
    <p><b>Сотрудник:</b> $option</p>
    <p><b>Сообщение:</b> $message</p>";
    $allmsg = " . $allmsg . ";
    // отправляем
    if (!mail($to, $subject, $allmsg, implode("\r\n", $headers))) {
        echo 'Письмо не отправлено - что-то не сработало.';
    } else {
        echo 'Ваше письмо успешно отправлено!';
    }
} else {
    // эта часть кода отвечает за отправку сообщений без вложений
    // читаем отправляемый файл в строку
    $fp = fopen($the_file, "r");
    if (!$the_file) {
        die("Ошибка отправки письма: Файл $the_file не может быть прочитан.");
    }
    $file = fread($fp, filesize($path));
    fclose($fp);
    // удаляем временный файл
    unlink($path);
    // собираем текст письма
    $allmsg = "
    <p><b>Пол:</b> $sex</p>
    <p><b>E-mail:</b> $userEmail</p>
    <p><b>Сотрудник:</b> $option</p>
    <p><b>Сообщение:</b> $message</p>";
    $allmsg = " . $allmsg . ";
    // генерируем разделитель
    $boundary = "--" . md5(uniqid(time()));
    // собираем заголовки
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "From: $name <$userEmail>";
    $headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
    $headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: Связь с администратором!";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    $headers[] = "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
    // собираем текст письма + приложенынй файл
    $multipart = array();
    $multipart[] = "--$boundary";
    $multipart[] = "Content-Type: text/html; charset=UTF-8";
    $multipart[] = "Content-Transfer-Encoding: Quot-Printed\r\n";
    $multipart[] = "$allmsg\r\n";
    $multipart[] = "--$boundary";
    $multipart[] = "Content-Type: application/octet-stream";
    $multipart[] = "Content-Transfer-Encoding: base64";
    $multipart[] = "Content-Disposition: attachment; filename = \"" . $path . "\"\r\n";
    $multipart[] = chunk_split(base64_encode($file));
    $multipart[] = "--$boundary";
    // отправляем
    if (!mail($to, $subject, implode("\r\n", $multipart), implode("\r\n", $headers))) {
        echo 'Письмо не отправлено - что-то не сработало.';
    } else {
        echo 'Отправлено письмо с вложениями.';
    }
}
Ответить с цитированием
  #2 (permalink)  
Старый 08.11.2020, 17:50
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

<div class="sub-title comadd"><h3>Задать вопрос!</h3></div>
        <div style="color: #f00;" id="result"></div>
        <img src="/feedback/ajax-loader.gif" id="load-indicator" alt="loading" style="position:absolute; z-index:1000; display:none;" />
 
<form method="post" action="/feedback/mails_sender.php" id="feedback" name="feedback" enctype="multipart/form-data">
    <div class="comment">
                <fieldset>
                        <select name="sex">
                            <option>Выберите Ваш пол *</option>
                            <option value="Мужчина">Мужчина</option>
                            <option value="Женщина">Женщина</option>
                        </select>
                </fieldset>
                <fieldset>
                        <input name="youremail" type="text" placeholder="Эл. @ почта *" size="20" />
                </fieldset>
                <fieldset>
                        <select name="option">
                            <option>Выберите сотрудника *</option>
                            <option value="Сергей">Сергей</option>
                            <option value="Иван">Иван</option>
                            <option value="Николай">Николай</option>
                            <option value="Антон">Антон</option>
                            <option value="Виктор">Виктор</option>
                        </select>
                </fieldset>
                <fieldset>
                        <textarea name="message" id="sendtext" placeholder="Текст сообщения *" style="resize: vertical; width: 98%; height: 130px; display: block;" cols="40" rows="5"></textarea>
                </fieldset>
    </div>
<table><tr><td style="padding-right:20px;">                
    <div class="send">
        <input name="to" type="hidden" value="send" />
        <button type="submit" class="sub">Отправить</button>
    </div>
</td><td>
        <input name="to" type="hidden" value="Очистить" />
        <button type="reset" class="sub">Очистить</button>
</td></tr>
</table>
</form>
 
        <script>
            // этот участок кода нужен только для отображения гифки
            // которая даёт пользователю понять, что что-то происходит
            // и нужно подождать
            $(document).ready(function () {
                $(document).ajaxStart(function () {
                    // найдем элемент с изображением загрузки и уберем невидимость:
                    var imgObj = $("#load-indicator");
                    imgObj.show();
                    // вычислим в какие координаты нужно поместить изображение загрузки,
                    // чтобы оно оказалось в серидине страницы:
                    var centerY = $(window).scrollTop() + ($(window).height() + imgObj.height()) / 2;
                    var centerX = $(window).scrollLeft() + ($(window).width() + imgObj.width()) / 2;
                    imgObj.offset({
                        left: centerX,
                        top: centerY
                    });
                });
                //скрываем изображение после окончания AJAX-запроса
                $(document).ajaxStop(function () {
                    $("#load-indicator").hide();
                });
            });
 
            // назначаем действие на такое событие как отправка формы
            $("#feedback").submit(function (evtObj) {
                evtObj.preventDefault();
                // Если элемент формы fileforsending содержит значения (т.е. выбран файл для отправки),
                // то вместо AJAX-запроса используем FormData()
                // поскольку файлы через AJAX-запросы не передаются                
 
                 {
                    var form = $(this);
                    $.ajax({
                        // Здесь файл, который обрабатывает полученные от пользователя данные и отправляет почту
                        url: "/feedback/mails_sender.php",
                        type: "POST",
                        data: form.serialize(),
                        // Действия в случае успешной отправки AJAX-запроса (а не письма!)
                        // Здесь data - полученное от mails_sender.php сообщение
                        success: function (data) {
                            if (data === "Отправлено письмо без вложений.") {
                                $("#result").html("Отправлено письмо без вложений.");
                                // Письмо отправлено, сбрасываем данные формы
                                document.getElementById("feedback").reset();
                                // Следующая строка после успешной отправки сообщения
                                // перенаправляет пользователь на любую страницу/сайт
                                // достаточно раскомментировать её и поменять адрес сайта webware.biz
                                // на ваш собственный
                                // document.location.href = "http://";
                            } else {
                                $("#result").html(data);
                            }
                        },
                        error: function (data) {
                            $("#result").html("Результат выполнения: " + data);
                        }
                    });
                }
            });
        </script>
Ответить с цитированием
  #3 (permalink)  
Старый 08.11.2020, 18:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сначала вопрос такого плана - на клиенте нет проверки формы пред отправкой и поля обязательные не имеют такого признака, то есть и нативной проверки тоже нет. В таком случае как нужно понимать это:
// Нас не интересуют анонимки
if (empty($userEmail)) {
    die('Отсутствует или неверен адрес почты');

и для других полей? Отчего такая уверенность, что это аноним, а не просто человеческий фактор - забыл, не усмотрел пользователь перед отправкой?
Ответить с цитированием
  #4 (permalink)  
Старый 08.11.2020, 18:31
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Сообщение от laimas Посмотреть сообщение
Сначала вопрос такого плана - на клиенте нет проверки формы пред отправкой и поля обязательные не имеют такого признака, то есть и нативной проверки тоже нет. В таком случае как нужно понимать это:
При отправке родные поля проверяются. Не проверяются только 2 поля select ($option и $sex), которые я добавил.
форму можно посмотреть и проверить тут, в самом низу страницы: _http://new.313news.net
Ответить с цитированием
  #5 (permalink)  
Старый 08.11.2020, 18:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от zulfukar
При отправке родные поля проверяются
Где, этого не видно в коде, следовательно, сервер оборвет выполнение сценария и что делать пользователю?
Ответить с цитированием
  #6 (permalink)  
Старый 08.11.2020, 18:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от zulfukar
if (!empty($_FILES['fileforsending']['tmp_name']))
Это тоже, мягко говоря, глупости. Проверять не это нужно, а ключ error, и если нет ошибок, тогда обработка, но ни в коем случае не:
$path = $_FILES['fileforsending']['name'];
    if (copy($_FILES['fileforsending']['tmp_name'], $path)) {
        $the_file = $path;
    }

а исключительно move_uploaded_file, ибо copy при определенных условиях может даже и не выполняться. И обязательно basename($_FILES['fileforsending']['name']); Но если это прикрепление к почте, то зачем вообще перемещать файл в какой-то каталог, проверили файл, и читайте его из временного каталога.
Ответить с цитированием
  #7 (permalink)  
Старый 08.11.2020, 18:48
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Сообщение от laimas
Где, этого не видно в коде, следовательно, сервер оборвет выполнение сценария и что делать пользователю?
я взял готовый скрипт и немного переделал его для своих нужд. Мне нужна именно такая форма и я не знаю как заставить этот код работать как надо. Поэтому и попросил помощи. Если есть возможность помогите пожалуйста.
Ответить с цитированием
  #8 (permalink)  
Старый 08.11.2020, 18:58
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Да елки палки, ну как еще вам объяснить, что вы просто кверху каком своих пользователей поставите.

die() - это эквивалент функции exit(), которая выводит сообщение, если указан текст или ничего не выводит, если указано число, но обязательно прекращает работу скрипта. То есть, если пользователь по неосторожности забыл ввести данные в какое-то поле, то die("Text") выдаст сообщение пользователю и все, далее работать ничего не будет! И где логика?

Вы уж тогда хотя бы добавьте атрибут required обязательным для заполнения полям, в этом случае сам браузер не отправит форму с пустыми полями.

Но даже в этом случае die() нужно выбросить, ибо чтобы делать выход нужно быть на 100% уверенным, что это левый запрос. Нужен диалог для "браузеров калек", которые по той или иной причине пропустят такое. Но ведь введенный пробел в поле, уже не пустое значение, но и для сервера это не значение.

Последний раз редактировалось laimas, 08.11.2020 в 19:07.
Ответить с цитированием
  #9 (permalink)  
Старый 08.11.2020, 19:09
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Сообщение от laimas
Да елки палки, ну как еще вам объяснить, что вы просто кверху каком своих пользователей поставите.
Если бы я все понимал, то наверное не спрашивал бы тут, а сам все сделал )
Я понял, что Вы хотите сказать, но это понимание никак не прибавляет мне знаний. Я в любом случае сам не смогу изменить код, так как не знаю даже азов java.
Может это звучит не очень приятно, но прошу исправить код за меня.
Ответить с цитированием
  #10 (permalink)  
Старый 08.11.2020, 19:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

И так тоже нельзя:
$headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: Связь с администратором!";

Это нужно кодировать. Времени сейчас нет свободного, есть тут знающие как, но если никто не поможет, то напишу как, но не сейчас, просто пока некогда.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
картинки вместо текста в поле Select TomTykver Элементы интерфейса 2 24.05.2015 20:40
идентифицировать select в форме djonA Общие вопросы Javascript 13 19.09.2013 00:42
Обязательное поле в пошаговой форме Antond Элементы интерфейса 1 23.12.2012 23:47
Добавить новое поле в форме Sergios Элементы интерфейса 0 02.05.2012 16:33
поле SELECT и его значение vah-smile Элементы интерфейса 6 05.11.2010 00:42