Javascript.RU

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

Сообщение от laimas Посмотреть сообщение
Но коли вам не нужно вложения файлов, то проверку его
if(!empty($_FILES)) {
        if(!$_FILES('error')) {
            //другие проверки файла - тип, размер и прочее что нужно      
        } else $errors += array_intersect_key($error_message, array_flip(array_keys($_FILES))); //если ошибка загрузки файла
    }

можно удалить. В почте строку

$body          .= !empty($_FILES) ? '--==boundary-1' . PHP_EOL : '--==boundary-1--' . PHP_EOL;


заменить на

$body          .= '--==boundary-1--' . HP_EOL;


Удалить начиная с if(!empty($_FILES)) { и по закрывающую }
PHP Notice:  Use of undefined constant sex - assumed 'sex' in /feedback/mails_sender3.php on line 52
PHP Notice:  Use of undefined constant email - assumed 'email' in /feedback/mails_sender3.php on line 53
PHP Notice:  Use of undefined constant message - assumed 'message' in /feedback/mails_sender3.php on line 55
PHP Fatal error:  Function name must be a string in /feedback/mails_sender3.php on line 58
Ответить с цитированием
  #22 (permalink)  
Старый 10.11.2020, 19:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Значит вы где-то удали или оставили лишнюю закрывающую фигурную скобку. В редакторе проверьте, если к примеру в таком условии

if(...) {
....

отметить открывающую фигурную скобку (курсор на нее) то будет подсвечена ее парная закрывающая тело этого условия фигурная скобка. Если скобка лишняя, то отметка ее окрасит ее в красный цвет.

Все завит от редактора, есть редакторы которые могут раскрывать/сворачивать блоки условий или прочие помещенные в фигурные скобки.

Внимательно проверьте.
Ответить с цитированием
  #23 (permalink)  
Старый 10.11.2020, 20:09
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Вроде бы все правильно
<?php
	//задержка для посмотерть как работает форма при отправке, удалить после
	sleep(2);
	 
	$check = array(
	    'sex'       => array(
	        'filter'    => FILTER_VALIDATE_INT, //пол, это вообще-то поле типа ENUM в базе со значениями: 1 - мужчина, 2 - женщина, это и надо проверять
	        'flags'     => FILTER_REQUIRE_SCALAR,
	        'options'   => array('min_range' => 1, 'max_range' => 2)
	    ),
	    'email'     => FILTER_VALIDATE_EMAIL,
	    'worker'    => FILTER_VALIDATE_INT, //сотрудник Петя может быть таким только как текст опции, но никак не ее значение, значением должен быть уникальный идентфикатор сотрудника
	    'message'   => FILTER_SANITIZE_SPECIAL_CHARS //нет смысла в strip_tags, если отправление в html формате, лучше преобразовать в html сущности
	);
	 
	$error_message = array(
	    'sex'       => 'Некорректное значение поля «Пол»!',
	    'email'     => 'Некорректное значение поля «Адрес почты»!',
	    'worker'    => 'Некорректное значение поля «Сотрудник»!',
	    'message'   => 'Некорректное значение поля «Сообощение»!',
	    'file'      => 'Ошибка получения файла!'
	);
	 
	$errors = array();

	//убираем возможные крайние пробелы
	$post = array_map('trim', $_POST);
	//если не все на месте, это не наш клиент, в этом случае можно прекртить работу и выйти
	if(array_diff_key($post, $check)) exit;
	//проверяем что прислали
	$data = filter_var_array($post, $check);
	//если есть ошибки получим их сообщения
    $errors +=  array_intersect_key($error_message, array_filter($data, function($v) { return !$v; }));

	//отправляем ошибки клиенту
	if($errors) {
	    header('Content-Type: application/json');
	    exit(json_encode(array('result'=> 'error', 'data'=>  array_values($errors))));
	}
	//имитация базы
	$sex = array(1 => 'мужчина', 'женщина');
	$worker = array(1 => 'Сергей', 'Иван', 'Николай', 'Антон', 'Виктор');
	//если нет ошибок
	if(!$errors) {
	    //получаем имя сотрудника запросом к базе по его ID, проверяя заодно есть ли такой
	    //здесь проверка имитация, проверяется наличие ключа в $worker
	    if(!$name = $worker[$data['worker']]) exit; //выход, нет такого сотрудника, форма левая
	     
	    //хороший тон, это отправление и текстовой версии, так как неизвестно в каком формате адресат принимает почту
	    $text = 'Текстовый вариант';
        //html версия
	    $html = "<p><b>Пол:</b> {$sex[$data[sex]]}</p>
	    <p><b>E-mail:</b> {$data[email]}</p>
	    <p><b>Сотрудник:</b> $name</p>
	    <p><b>Сообщение:</b> {$data[message]}</p>";
	     
	    $to             = 'zulfukar@mail.ru';
	    $headers        = 'From: =?utf-8?B?' . base64_encode($name) . '?= <' . $data('email') . '>' . PHP_EOL;
	    $headers       .= 'Reply-To: receiver@domain3.com' .  PHP_EOL;
	    $headers       .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
	    $headers       .= 'Mime-Version: 1.0' . PHP_EOL;
	    $headers       .= 'Content-Type: multipart/alternative; boundary="==boundary-2"' . PHP_EOL.PHP_EOL;
	    $body          .= '--==boundary-2' . PHP_EOL.PHP_EOL;
	    $body          .= 'Content-type: text/plain; charset="utf-8"' . PHP_EOL;
	    $body          .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL.PHP_EOL;
	    $body          .= $text . PHP_EOL; //текстовая версия
	    $body          .= '--==boundary-2' . PHP_EOL;
	    $body          .= 'Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"' . PHP_EOL.PHP_EOL;
	    $body          .= '--==boundary-1' . PHP_EOL;
	    $body          .= 'Content-type: text/html; charset="utf-8"' . PHP_EOL;
	    $body          .= 'Content-Transfer-Encoding: base64' . PHP_EOL.PHP_EOL;
	    $body          .= chunk_split(base64_encode($html)) . PHP_EOL.PHP_EOL; //html версия
	    $body          .= '--==boundary-1--' . HP_EOL;
	     
    if(!empty($_FILES)) {
	        $f = fopen($_FILES['file']['tmp_name'], 'rb');
	        $body      .= 'Content-Type: image/jpeg' . PHP_EOL; //заголовок произвольный, а вообще нужно проверять тип и его указывать, в случае изображения его можно встроить непосредственно в письмо
	        $body      .= 'Content-Transfer-Encoding:base64' . PHP_EOL;
	        $body      .= 'Content-Disposition: inline; filename="' . basename($_FILES['file']['name']) . '"' . PHP_EOL.PHP_EOL;
	        $body      .= chunk_split(base64_encode(fread($f, filesize($_FILES['file']['tmp_name']))));
	        $body      .= '--==boundary-1--' . PHP_EOL;
	    }
	     
	    $body          .= '--==boundary-2--' . PHP_EOL;
	     
	    mail($to, $body, $headers);
	     
	    //функция mail не знает о том отправлено ли письмо или нет, она лишь сообщает о факте его принятия для отправления программой sendmail
	     
	    header('Content-Type: application/json');
	    exit(json_encode(array('result'=> 'done', 'data'=>  array('Письмо отправлено'))));
	}
Ответить с цитированием
  #24 (permalink)  
Старый 10.11.2020, 21:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

<?php
$check = array(
    'sex'       => array(
        'filter'    => FILTER_VALIDATE_INT, 
        'flags'     => FILTER_REQUIRE_SCALAR, 
        'options'   => array('min_range' => 1, 'max_range' => 2)
    ),
    'email'     => FILTER_VALIDATE_EMAIL,
    'worker'    => FILTER_VALIDATE_INT,
    'message'   => FILTER_SANITIZE_SPECIAL_CHARS
);

$error_message = array(
    'sex'       => 'Некорректное значение поля «Пол»!',
    'email'     => 'Некорректное значение поля «Адрес почты»!',
    'worker'    => 'Некорректное значение поля «Сотрудник»!',
    'message'   => 'Некорректное значение поля «Сообощение»!',
);

$errors = array();

$post = array_map('trim', $_POST);
if(array_diff_key($post, $check)) exit;
$data = filter_var_array($post, $check);
$errors +=  array_intersect_key($error_message, array_filter($data, function($v) { return !$v; }));
if($errors) { 
    header('Content-Type: application/json');
    exit(json_encode(array('result'=> 'error', 'data'=>  array_values($errors))));
} else {
    
    $sex = array(1 => 'мужчина', 'женщина');
    $worker = array(1 => 'Сергей', 'Иван', 'Николай', 'Антон', 'Виктор');
    
    if(!$name = $worker[$data['worker']]) exit;
    
    $text = 'Текстовый вариант';
    $html = "<p><b>Пол:</b> " . $sex[$data['sex']] . "</p>
    <p><b>E-mail:</b> " . $data['email'] . "</p>
    <p><b>Сотрудник:</b> " . $name . "</p>
    <p><b>Сообщение:</b> " . $data['message'] . "</p>";
    
    $to             = 'pochta@mail.ru';
    $subject        = '=?utf-8?b?' . base64_encode($data['subject']) . '?=';
    $headers        = 'From: =?utf-8?B?' . base64_encode($name) . '?= <' . $data['email'] . '>' . PHP_EOL;
    $headers       .= 'Reply-To: receiver@domain3.com' .  PHP_EOL;
    $headers       .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
    $headers       .= 'Mime-Version: 1.0' . PHP_EOL;
    $headers       .= 'Content-Type: multipart/alternative; boundary="==boundary-2"' . PHP_EOL.PHP_EOL;
    $body          .= '--==boundary-2' . PHP_EOL.PHP_EOL;
    $body          .= 'Content-type: text/plain; charset="utf-8"' . PHP_EOL;
    $body          .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL.PHP_EOL;
    $body          .= $text . PHP_EOL; //текстовая версия
    $body          .= '--==boundary-2' . PHP_EOL;
    $body          .= 'Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"' . PHP_EOL.PHP_EOL;
    $body          .= '--==boundary-1' . PHP_EOL;
    $body          .= 'Content-type: text/html; charset="utf-8"' . PHP_EOL;
    $body          .= 'Content-Transfer-Encoding: base64' . PHP_EOL.PHP_EOL;
    $body          .= chunk_split(base64_encode($html)) . PHP_EOL.PHP_EOL; //html версия
    $body          .= '--==boundary-1--' . PHP_EOL;
    $body          .= '--==boundary-2--' . PHP_EOL;
    
    mail($to, $subject, $body, $headers);
    
    header('Content-Type: application/json');
    exit(json_encode(array('result'=> 'done', 'data'=>  array('Письмо отправлено'))));
}
Ответить с цитированием
  #25 (permalink)  
Старый 10.11.2020, 22:10
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

PHP Notice:  Undefined index: subject in /feedback/mails_sender3.php on line 43
PHP Notice:  Undefined variable: body in /feedback/mails_sender3.php on line 49
Изображения:
Тип файла: jpg send.jpg (62.7 Кб, 3 просмотров)
Ответить с цитированием
  #26 (permalink)  
Старый 11.11.2020, 03:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Начинайте понемногу соображать сами - вы говорили, что тему письма не нужно задавать формой, а значит что, удалить и определить свою, о чем я писал. Это разве сделано? Это не ошибки, это предупреждения, но первая приведет к тому, что вместо темы ничего не будет в письме. Втрое можно вообще игнорировать, и с отключением их вывода, что на сервере и должно быть, вы даже и знать об этом не будете.

После строки 42, определите ее
$subject = "Чего такое нужное";

и в строке 43 замените $data['subject'] на $subject.

В строке 49, начинать "сборку" этой переменной не с конкатенации а с объявления убрать точку перед =:
$body          = '--==boundary-2' . PHP_EOL.PHP_EOL;
Ответить с цитированием
  #27 (permalink)  
Старый 11.11.2020, 15:08
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

$to             = 'pocta@mail.ru';
    $subject = "Тема письма";
    $subject        = '=?utf-8?b?' . base64_encode($subject) . '?=';
    $headers        = 'From: =?utf-8?B?' . base64_encode($name) . '?= <' . $data['email'] . '>' . PHP_EOL;
    $headers       .= 'Reply-To: receiver@domain3.com' .  PHP_EOL;
    $headers       .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
    $headers       .= 'Mime-Version: 1.0' . PHP_EOL;
    $headers       .= 'Content-Type: multipart/alternative; boundary="==boundary-2"' . PHP_EOL.PHP_EOL;
    $body           = '--==boundary-2' . PHP_EOL.PHP_EOL;
    $body          .= 'Content-type: text/plain; charset="utf-8"' . PHP_EOL;
    $body          .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL.PHP_EOL;
    $body          .= $text . PHP_EOL; //текстовая версия
    $body          .= '--==boundary-2' . PHP_EOL;
    $body          .= 'Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"' . PHP_EOL.PHP_EOL;
    $body          .= '--==boundary-1' . PHP_EOL;
    $body          .= 'Content-type: text/html; charset="utf-8"' . PHP_EOL;
    $body          .= 'Content-Transfer-Encoding: base64' . PHP_EOL.PHP_EOL;
    $body          .= chunk_split(base64_encode($html)) . PHP_EOL.PHP_EOL; //html версия
    $body          .= '--==boundary-1--' . PHP_EOL;
    $body          .= '--==boundary-2--' . PHP_EOL;

result "error"
data
0 "Некорректное значение поля «Пол»!"
1 "Некорректное значение поля «Сотрудник»!"
Ответить с цитированием
  #28 (permalink)  
Старый 11.11.2020, 15:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Вы читаете то, что я пишу или? Либо вы в раздел работа, там по всем мелочам претензии и я делаю платную работу от до всего, либо будьте добры читать, думать и действовать.

А я писал, что в одной опции списка Пол я указал значение неверное и для одной опции Сотрудники, чтобы выбрав именно их, проверить работу клиент-сервер.

Найти где это написано и заменить на корректное.
Ответить с цитированием
  #29 (permalink)  
Старый 11.11.2020, 16:12
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Сообщение от laimas Посмотреть сообщение
А я писал, что в одной опции списка Пол я указал значение неверное и для одной опции Сотрудники, чтобы выбрав именно их, проверить работу клиент-сервер.
Найти где это написано и заменить на корректное.
я забыл об этом. исправил, работает.
остался один вопрос: почему после отправки письма страница не обновляется, а происходит переход на страницу /feedback/mails_sender3.php с сообщением:

result: "done"
data:
0: "Письмо отправлено"

Думаю скорее всего не работает аякс.
Ответить с цитированием
  #30 (permalink)  
Старый 11.11.2020, 16:19
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Это значит, что форма отправляется естественным способом, JS не работает. Либо jQery не подключен, либо еще какие либо причины, например, есть еще js код, и в нем ошибка, которая не позволяет выполнятся далее.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
картинки вместо текста в поле 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