Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Немного не по теме, но может кто знает (https://javascript.ru/forum/misc/68848-nemnogo-ne-po-teme-no-mozhet-kto-znaet.html)

j0hnik 13.05.2017 13:17

Немного не по теме, но может кто знает
 
кусок скрипта мейл.php
как дописать в этот цикл код который будет еще и текст инпутов получать для отправки.
$c = true;
if ( $method === 'POST' ) {
	$project_name = trim($_POST["project_name"]);
	$admin_email  = trim($_POST["admin_email"]);
	$form_subject = trim($_POST["form_subject"]);
	foreach ( $_POST as $key => $value) {
		if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) {
			$message .= "
			" . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . "
			<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
			<td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
		</tr>
		";
	}
}

laimas 13.05.2017 14:02

Цитата:

Сообщение от j0hnik
foreach ( $_POST as $key => $value) {
if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" )

Уверены, что это будет выполняться?

Цитата:

Сообщение от j0hnik
код который будет еще и текст инпутов получать

Для этого их надо передать формой под какими-то ключами. Где они?

j0hnik 14.05.2017 10:51

Цитата:

Сообщение от laimas (Сообщение 452313)
Уверены, что это будет выполняться?
Все работает!


Для этого их надо передать формой под какими-то ключами. Где они?

<?php
$method = $_SERVER['REQUEST_METHOD'];
//Script Foreach
$c = true;
if ( $method === 'POST' ) {
	$project_name = trim($_POST["project_name"]);
	$admin_email  = trim($_POST["admin_email"]);
	$form_subject = trim($_POST["form_subject"]);
	foreach ( $_POST as $key => $value) {
		if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) {
			$message .= "
			" . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . "
			<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
			<td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
		</tr>
		";
	}
}
} else if ( $method === 'GET' ) {
	$project_name = trim($_GET["project_name"]);
	$admin_email  = trim($_GET["admin_email"]);
	$form_subject = trim($_GET["form_subject"]);
	foreach ( $_GET as $key => $value) {
		if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) {
			$message .= "
			" . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . "
			<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
			<td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
		</tr>
		";
	}
}
}
$message = "<table style='width: 100%;'>$message</table>";
function adopt($text) {
	return '=?UTF-8?B?'.Base64_encode($text).'?=';
}
$headers = "MIME-Version: 1.0" . PHP_EOL .
"Content-Type: text/html; charset=utf-8" . PHP_EOL .
'From: '.adopt($project_name).' <'.$admin_email.'>' . PHP_EOL .
'Reply-To: '.$admin_email.'' . PHP_EOL;
mail($admin_email, adopt($form_subject), $message, $headers );

Вот весь скрипт, он передает все инпуты внутри тега form, а конкретнее атрибут name и value. нужно чтобы опшены селектов захватывал.
вот перехватчик
$("#form").submit(function() {
	var th = $(this);
	$.ajax({
		type: "POST",
      url: "calc.php", 
      data: th.serialize()
    }).done(function() {
        // Done Functions
        th.trigger("reset");
      });
    return false;
  });
</script>

laimas 14.05.2017 11:14

$.ajax({type: "POST", а проверяем if ( $method === 'POST' ) } else if ( $method === 'GET' ), это что?

Ваша задача принять и отправить принятое почтой. Чтобы ее отправить какие данные для этого обязательно нужны? Если $admin_email задается формой, то почему не проверятся заполнено ли этого поле и не просто заполнено, а действительно это адрес почты?

Наверное же эта проверка первичная, у вас же не понять для чего вот это

foreach ( $_POST as $key => $value) {
if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" )

что ну никак не выполняет требуемые условия.

Если клиенту определен метод оправки формы POST, то ни о каких GET и речи быть не должно, а если пришло, значит левая форма.

if($post = array_diff(array_map('trim', $_POST), [''])) {
    //массив не пуст, проверяем наличие обязательных полей
    //и только если они есть и корректные формируем почтовое отправление
} else {
    //ошибки заполнения формы, действия
}

j0hnik 14.05.2017 12:56

Цитата:

Сообщение от laimas (Сообщение 452349)
$.ajax({type: "POST", а проверяем if ( $method === 'POST' ) } else if ( $method === 'GET' ), это что?

Ваша задача принять и отправить принятое почтой. Чтобы ее отправить какие данные для этого обязательно нужны? Если $admin_email задается формой, то почему не проверятся заполнено ли этого поле и не просто заполнено, а действительно это адрес почты?

Да не обращайте на это внимание, на странице есть скрытый блок

<input type="hidden" name="project_name" value="ТГК">
<input type="hidden" name="admin_email" value="adm@36.ru">
<input type="hidden" name="form_subject" id="title">


скрипт писал не я, и PHP я не знаю, вот прошу помощи. может для кого-то это минутное дело.

laimas 14.05.2017 14:15

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

Если адрес отправки и прочие его атрибуты определены, зачем же их передавать клиенту? Выбрасывайте из кода "умельца" написавшего эту чушь скрытые поля формы и ТГК, adm@36.ru определяйте через переменные РНР. И коли form_subject определено, значит и оно должно быть РНР переменной, а type="hidden" name="form_subject" без значения так вообще бруд не понятный для чего.

И так, адрес получателя, какое-то имя и тема сообщения серверу известна. Остается открытым вопрос - что ожидать от клиента? Явно же не пустые поля, а значит по крайней мере одно из ее полей должно быть обязательным для заполнения и это условие и должно определяться в первую очередь. Как это делается я написал.

Если у вас иные представления об отправке почты сервером и вы будете настаивать на своем, то дальнейшая баталия не имеет смысла.

j0hnik 14.05.2017 14:58

насчет
type="hidden" name="form_subject" id="title"

value берется из тайтл.
var title = document.title;
	$('#title').attr({"value":title});

еще раз повторяю все работает как часы!
Просто нужно еще текст опшенов передавать, а не только их value.

Насчет закрытия сайта совет просто гениальный!! :lol:
Проблемы надо решать глобально! (нет тела, нет дела!)
да и вообще редукционизм - принцип очень интересный

laimas 14.05.2017 15:32

Ваша почта, ее принцип работы с данными извне, просто бесплатный рассадник для спама. Когда это поймете, тогда можно и по остальному ответ дать. Поддерживать же бред, который выдается за код, желания нет.

Nexus 14.05.2017 18:29

Я бы не стал использовать ни этот "js-код", ни ваш "мейл.php".
var th = $(this),data=th.serialize();
	th.find('select').each(function(){
		var val=$(this).val(),name=$(this).attr('name');
		if(!name) return;
		
		$(this).find('option').each(function(i){
			data+=encodeURIComponent('&'+name+'_option_'+i+'='+$(this).attr('value'));
		});
	});
	$.ajax({
		type: "POST",
      url: "calc.php", 
      data: th.serialize()
    }).done(function() {
        // Done Functions
        th.trigger("reset");
      });
    return false;
  });


Серверная часть не должна нуждаться в получении извне опшенов селектов расположенных на странице, т.к. она сама формирует эту страницу.
Метод получения данных не определен.
Валидация формы не осуществляется вовсе.

Vlasenko Fedor 15.05.2017 00:56

j0hnik,
откройте для себя $_REQUEST
зачем trim к полям, про валидацию писали выше
используйте хотя-бы filter_var
валидация всегда!!! должна быть и на клиенте и на сервере
$key != "project_name" && $key != "admin_email" && $key != "form_subject"
	$validKeys = ['project_name', 'admin_email', 'form_subject'];
	if(in_array($key, $validKeys)){}

Для почты распространены
PHPMailer и swiftmailer
Обои можно ставить через Composer

laimas 15.05.2017 03:26

Poznakomlus, на каком основании в данном случае должен фигурировать $_REQUEST?

$key != "project_name" && $key != "admin_email" && $key != "form_subject" - этого вообще не должно быть в форме. Ну что такое, какой-то ламер написал хрень для непонимающего, и вы туда же.

laimas 15.05.2017 15:33

Цитата:

Сообщение от Poznakomlus
Если на post и get запросы выполняются одинаковые действия то стоит рассматривать $_REQUEST

Ну вы же код смотрели и описание к нему - конкретная задача, получение асинхронного запроса методом POST. Причем тут $_REQUEST?

Ламерство не в отношении ученика, а написавшего, предлагать к учебе вредное к чему?

Vlasenko Fedor 15.05.2017 18:20

laimas,
Видать вы так-же научились читать, только что хотите видеть
Если подробно то
Цитата:

Сообщение от Poznakomlus
откройте для себя $_REQUEST

именно к коду и прдназначились
if ( $method === 'POST' ) {
	//
} else if ( $method === 'GET' ) {

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

laimas 15.05.2017 18:53

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

Цитата:

Сообщение от Poznakomlus
Вы уж простите, но с каких это времен знание глобальных переменных языка стало вредным?

Даже оружие не вредно, опасны цели его применения.

Vlasenko Fedor 15.05.2017 21:27

Цитата:

Сообщение от laimas
Но сама по себе отправка почтового сообщения методом GET означает, что ее содержимое благополучно будет кешировано у роботов

Не выдумывайте. С чего вы решили кешировать get параметры для отправки почты. Интересно когда у вас роботы в трусах ковыряются.
Или с кешом не так или запрещать не умеете.
Я вот не говорил, что правильно и каким методом отправлять, а вы опять в лужу . Выдуманное кеширование и роботы. Вы хотите что то сказать про $_REQUEST. Так вроде уже ответил.

laimas 15.05.2017 21:51

Цитата:

Сообщение от Poznakomlus
Или с кешом не так или запрещать не умеете.... Выдуманное кеширование и роботы.

Вы путаете кеширование браузером с кешированием при индексации всех запросов которыми оперирует клиент. Если интересно как это происходит, можете найти в сети и почитать, к примеру ответы Яндекса, когда ему жалуются почему приватные данные пользователя попадают в к нему в кеш.

И это не выдуманное мною. Я говорил единственное - сценарием определена отправка почты методом POST, каким боком к этому имеет отношение метод GET, а следовательно и $_REQUEST?

Если же на все наплевать и принимать и методом GET, то это плохо, утверждать же обратное еще хуже, автор многого не понимает, но на ус мотает.

Хотите советуйте так продолжать, это ваше право.

j0hnik 15.05.2017 22:07

Очень плохой скрипт говорите. =(
Единственный скрипт который выполняющий необходимые мне задачи который я нашел.
А задача собственно была такая (есть скрипты которые просчитывают тамбуры, окна, двери, навесы итд.. на каждой странице по 20-25 различных инпута, которые надо отправлять, они могут и даже будут меняться) а этот скрипт отправляет любые стоить только обернуть тегом форм, просто и быстро.
Если знаете что то подобное где не надо лезть в именно PHP код (НЕ ЛАМЕРСКИЙ) пожалуйста напишите.

laimas 15.05.2017 23:44

Цитата:

Сообщение от j0hnik
Очень плохой скрипт говорите.

Вы знаете, что есть хостпровайдеры, которые вообще запрещают использование функции mail() по причине спама. А ваш скрипт как раз рассадник для него. В нем скрытым полем передается электронный адрес, что "просечь" не сложно. То есть, зачем же мне отправлять вам (администратору) почту с какими-то "тамбуры и окна", да указать этим полем множество адресов и сообщение "Хотите увеличить ч...?". После таковых отправлений ваш хостер вряд ли будет вами доволен, а если еще и в черный список попадет, то по шапке вы получите точно.

Я ведь говорил, что адрес вы получаете извне и даже не проверяете его, ставя во главу угла второстепенное. А нужно это не слать скрытыми полями, а определить через переменные на сервере, причем сервер формирует и страницу с формой, а значит и знает ее title, выдирать ее на клиенте опять возвращая серверу, это бесполезная операция.

Уж точно вам захочется поместить на своих страницах яндекс метрики и подобные, которые будут кешировать у себя все GET запросы пользователя. А это означает, что отправка формы, которая может содержать и приватные данные, может попасть в открытый доступ. GET запросы для параметров в URL, поиска и подобного, но уж точно не для почты.

Если даже чисто выбор тамбуров и дверей на страницах, то даже в этом случае какое может быть оправдание тому, что с одной можно получить GET, а с другой POST? К чему такое разнообразие для одной конкретной задачи?

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

Как вам написать что-то, если вы не понимаете или не хотите понять, что данные извне требуют проверки, и не приводите кода свой формы?

Поймите, вас никто не пинает, когда предлагают хотя бы почитать о вопросах, которые затрагивает ваша тема.


Часовой пояс GMT +3, время: 03:36.