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


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