Jump to content
  • 0

И опять о "Форме обратной связи"


chest
 Share

Question

Очень намучился с создание формы для обратной связи. если учитывать, что с Пшп вообще мало знаком, думаю что-то получилось.

Проверьте, пжлст мои Коды и дайте рекомендации.

Есть вопросы, которые меня особо интересуют:

1. что там на счет полей обязательных для ввода, все верно?

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

3. правильна ли проверка телефона? (нужно, чтобы телефон начинался с "+380")

4. правильно ли осуществляется проверка типа файла (у меня эта проверка - accept="text/txt")

5. как правильно подключить Капчту, а то у меня гадость какая-то получилась)

- ну и все, что вы можете мне посоветовать

файл с формой ****.html

 <form action="mail.php" method="post" enctype="multipart/form-data" accept="text/txt">
<div align="center">
<table width="500" cellspacing="1" cellpadding="2">
<tr bgcolor="#acd5ff">
<td>
<b>* П.І.Б.</b><br>Введіть реальне ім'я, щоб ми знали як до Вас звертатись
</td>
</tr>
<tr>
<td><input type="text" name="nick" size="39" style="border: #000 1px solid; background-color: #fff;"></b>
</td>
</tr>
<tr bgcolor="#acd5ff">
<td>
<b>* Ваш E-mail:</b><br>Введіть рельну e-mail адресу, на неї ви отримаете створений файл
</td>
</tr>
<tr>
<td><input type="text" name="email" size="39" style="border: #000 1px solid; background-color: #fff;"></b>
</td>
</tr>
<tr bgcolor="#acd5ff">
<td>
<b>* Контактний телефон:</b><br>Введіть рельний телефон, необхідний для підтверження ваших даних
</td>
</tr>
<tr>
<td><input type="text" name="phone" size="39" value="+380123456789" style="border: #000 1px solid; background-color: #fff;"></b>
</td>
</tr>
<tr bgcolor="#acd5ff">
<td>
<b>* Прикріпити файл:</b>
</td>
</tr>
<tr>
<td><input type="file" name="file" size="35" style="border: #000 1px solid; background-color: #fff;">
</b>
</td>
</tr>
<tr bgcolor="#acd5ff">
<td>
<b>Додаткова інформація</b><br>Вкажіть інформацію, що на Вашу думку сприятиме виконанню послуги
</td>
</tr>
<tr>
<td><textarea rows="2" cols="60" name="msg" style="border: #000 1px solid; background-color: #fff;scrollbar-dark-shadowcolor:#E7E8EB;scrollbar-light-shadow-color:#EFF3F4;scrollbar-base-color:#EFF3F4;scrollbar-arrow-color:#D0CFCE;scrollbar-face-color:#E7E8EB;scrollbar-shadow-color:#7D868D;scrollbar-3d-light-color:#EFF3F4;"></textarea></b>
</td>
</tr>
<tr>
<td><input type="checkbox" name="agree" value="Yes">Я згоден з правилами надяння послуги та ввів коректні дані</b>
</td>
</tr>
<tr><td>Код підтвердження:
<input type="text" id="code" name="code" size="4" maxlength="4">
<img align="absmiddle" src="captcha.php"></td></tr>
<tr>
<tr>
<td bgcolor="#042f5b">
<table width="100%">
<tr><td align="right"><input type="submit" value="Надіслати" style="background-color:#D0CFCE;border: #000 1px solid;" name="submit">
</td></tr>
</table>
</td>
</tr>
</table>
</div>
</form><br>* Ці поля, обов'язкові для заповнення
</div>

а это файл Меил.пшп

<?php 
$url = "*****.html"; //Адрес гостевой книги, ваша страница
$title = "*****"; //Заголовок сайта
$subject = "Письмо с сайта $title"; //Тема отпровляемых вам сообщений
$admail = "******"; //Ваш e-mail, на который будут отправляться письма
$back = "<a href=\"java script: history.back()\">Назад</a></p>";

if(@$_POST['nick'] or @$_POST['email'] or @$_POST['phone'] or @$_POST['agree'] or @$_POST['file'])
{
@$nick = $_POST['nick'] or die("Переконайтесь, що ввели своє ім'я!$back");
@$mail = $_POST['email'] or die("Переконайтесь, що ввели свій E-mail!$back");
@$phone = $_POST['phone'] or die("Переконайтесь, що ввели свій номер телефону!$back");
@$file = $_POST['file'] or die("Переконайтесь, що прикріпили вірний файл!$back");
@$accept = $_POST['agree'] or die("Для доступу до послуги Ви повинні погоджуватися з нашими

умовами!$back");

if(!eregi("^[a-z0-9\._-]+@[a-z0-9\._-]+\.[a-z]{2,4}\$", $email))
{
echo "Переконайтесь, що ввели коректний E-mail!$back";
exit;
}
if(!eregi("[a-z]\$", $nick))
{
echo "Переконайтесь, що ввели коректне ім'я!$back";
exit;
} if(!eregi("^[+380]+[0-9]{7,7}\$", $phone))
{
echo "Переконайтесь, що ввели коректний телефон!$back";
exit;

$content = "\nПользователь $nick!\n
Адресс: $email\n
Телефон - $phone
Отправил(а) вам письмо с сайта - \"$title\"\n
со следующим содержанием:\n\n$msg";
if(!@mail($admail, $subject, $content))
{
echo "Помилка під час відправлення повідомлення. Будь-ласка, повідомте про це адміністратора сайта

використовуючи інший вид связку.$back";
exit;
}
else
{
echo "Ваше повідомлення успішно відіслане!<Br> Ви отримаете відповідь найближчим часом ";
echo "<meta http-equiv=\"refresh\" content=\"1;URL=$url\">";
}
}
else {
die("Для отравки повідомлення заповність всі обов'язкові поля!$back");
}
?>

Edited by chest
Link to comment
Share on other sites

Recommended Posts

  • 0
<a href="java script: history.back()">

Это ересь, и php тут не при чём. onclick="history.back()" может быть?

if(!eregi("^[+380]+[0-9]{7,7}\$", $phone))
Неправильно

if (!preg_match('/^\+380\d{7}$/',$phone))

Чтобы письмо не отправлялось: if ($_POST['agree'] != 'yes') die(); Не помню, какие там значения у чекбоксов, но как-то так.

Какие проблемы с капчой? Генерируешь, запоминаешь в сессию, при выводе капчи берёшь текст из сессии, при приёме данных сравниваешь введённое с сессией, если неправильно, заново генерируешь.

Link to comment
Share on other sites

  • 0

Для начала - огромное спасибо!

проверку телефона заменил!

на счет $back - не уверен, правильно ли понял, нужно заменить

$back = "<a href=\"java script: history.back()\">Назад</a></p>";

на

"$back = "onclick="history.back()""

?

чтобы не отправлялось, тоже не уверен... менять нужно

if(@$_POST['nick'] or @$_POST['email'] or @$_POST['phone'] or @$_POST['agree'] or @$_POST['file']) 
{
@$nick = $_POST['nick'] or die("Переконайтесь, що ввели своє ім'я!$back");
@$mail = $_POST['email'] or die("Переконайтесь, що ввели свій E-mail!$back");
@$phone = $_POST['phone'] or die("Переконайтесь, що ввели свій номер телефону!$back");
@$file = $_POST['file'] or die("Переконайтесь, що прикріпили вірний файл!$back");
@$accept = $_POST['agree'] or die("Для доступу до послуги Ви повинні погоджуватися з нашими

на

if(@$_POST['nick'] or @$_POST['email'] or @$_POST['phone'] or @$_POST['agree'] or @$_POST['file']) 
{
@$nick = $_POST['nick'] or die("Переконайтесь, що ввели своє ім'я!$back");
@$mail = $_POST['email'] or die("Переконайтесь, що ввели свій E-mail!$back");
@$phone = $_POST['phone'] or die("Переконайтесь, що ввели свій номер телефону!$back");
@$file = $_POST['file'] or die("Переконайтесь, що прикріпили вірний файл!$back");
@$accept = $_POST['agree'] != 'yes' or die("Для доступу до послуги Ви повинні погоджуватися з нашими

а на счет Капчи смысл понял, а как сделать не понял)

Edited by chest
Link to comment
Share on other sites

  • 0
вот мне еще подсказали, что можно реализовать проверку на js... кто подскажет преимущества и недостатки?

преимущества js - проверка происходит на стороне клиента, соответственно разгружается сервер. Чистый js использовать не стоит, посмотрите jQuery.

Вообще лучше проверять всё введённое на js, уведомлять клиента об ошибках. Если всё нормально отправлять в обработку на php, а там уже приводить данные к нужному виду ((int) для чисел, mysql_real_escape_string для того что записываешь в базу).

И не давите ошибки с помощью "@"! Дурной тон - 1. Труднее вам же отладку проводить - 2. Всегда проверяйте isset-ом наличие существующих переменных/идексов.

Link to comment
Share on other sites

  • 0

Значит так, подключил я Js с проверкой, все работает гуд...

Теперь как правильно оформить форма файла отправки самого сообщения, пока что у меня так:

<?
session_start();
$url = "*****.html"; //????? ???????? ?????, ???? ????????
$title = "*****"; //????????? ?????
$subject = "?????? ? ????? $title"; //???? ???????????? ??? ?????????
$admail = "???@yandex.ru";
$back= "<a href="#" onclick="history.back()">?? ???????????</a></p>";
$kodik = $_POST['kodik'];
$imja = $_POST['imja'];
$pochta = $_POST['pochta'];
$fone = $_POST['fone'];
$javu = $_POST['javu'];
$yes = $_POST['aga'];
if(count($_POST)>0)
{
@$kodik = $_POST['kodik'] or die("?????????????, ?? ????? ???? ??'?!$back");
@$imja = $_POST['imja'] or die("?????????????, ?? ????? ???? E-mail!$back");
@$imja = $_POST['pochta'] or die("?????????????, ?? ????? ???? E-mail!$back");
@$fone = $_POST['fone'] or die("?????????????, ?? ????? ???? ????? ????????!$back");
@$javu = $_POST['javu'] or die("?????????????, ?? ?????????? ?????? ????!$back");

if(!preg_match("/^[B]+([A-z]{1,1})+[D]+([0-9]{5,5})/", $_POST['kodik']))
{
echo "?????????????, ?? ????? ????????? !',$back,'";
exit;
}
if(!preg_match("/^([?А-ЯЇІҐ]{1,1})+[а-яїіґ]+[  ]+([А-ЯЇІҐ]{1,1})+[а-яїіґ]/", $_POST['imja']))
{
echo "?????????????, ?? ????? ????????? !',$back,'";
exit;
}
if(!preg_match("/^[a-z0-9\._-]+@+[a-z0-9\._-]+\.+[a-z]{2,3}/", $_POST['pochta']))
{
echo "?????????????, ?? ????? ????????? !',$back,'";
exit;
}
if(!preg_match("/^\+380\d{9}$/", $_POST['fone']))
{
echo "?????????????, ?? ????? ????????? !',$back,'";
exit;
}

$content = <<<TEXT

? - {$_POST['imja']}!
????? ????????: {$_POST['fone']}
??????: {$_POST['po4ta']}
????????? ?: '{$title}'
????: {$_POST['kodik']}

TEXT;
if( !empty($_POST['javu']) )
$content .= "??????? ??????? 1\n";
if( !empty($_POST['aga']) )
$content .= "??????? ??????? 1\n";

if(!@mail($admail, $subject, $content))
{
echo "??????? ??? ??? ???????????? ????????????. ????-?????, ????????? ??? ?? ?????????????? ????? ?????????????? ????? ??? ??????.$back";
exit;
}
else
{
echo "???? ???????????? ??????? ?????????!<Br> ?? ????????? ????????? ?????????? ????? ";
echo "<meta http-equiv=\"refresh\" content=\"1;URL=$url\">";
}
}
else {
die("??? ????????? ???????????? ?????????? ??? ????'?????? ????!$back");
}
}
?>

А как правильно?

Edited by chest
Link to comment
Share on other sites

  • 0

ух блин, сколько вопросительных знаков. ничего ж не ясно!

правильно оформить форма файла отправки самого сообщения
в русском языке есть такая штука - падежи. Если правильно склонять члены предложений в своей речи, то вас будут быстрее понимать. А мысли ваши приобретут воздушную лёгкость и геометрическую правильность.
  • Like 1
Link to comment
Share on other sites

  • 0

для тех, кому не ясно - там где вопросительные знаки, простой текст, который не относится к коду.

правильно оформить форма файла отправки самого сообщения=правильно оформить форму файла отправки самого сообщения

Link to comment
Share on other sites

  • 0

то есть у вас 2 файла:

1. форма.

2. скрипт обработки/отправки

я правильно понимаю?

всё работает и осталось сформировать тело письма которое отправляет скрипт? так это у вас и происходит вроде.

Link to comment
Share on other sites

  • 0

По ходу я все-таки нечетко выразился....

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

Просто я в Пшп не силен, выжал из себя все что мог.

в помощь могу дать саму форму:

<?php
session_start();
?><html><head>
<script type="text/javascript" src="/js/jquery-1.5.1.js"></script>
<script type="text/javascript" src="/js/jquery.validation_form.js"></script>
</head><body>
<script type="text/javascript">
$(document).ready(function()
{

var options = {
important_marker: "*",
validation_form: ".validation_form",
text: ".text",
checkbox: ".checkbox",
email: ".email",
phone: ".phone",
pib: ".pib",
important: ".important",
submit: ".submit",
after_input:"span"
}
$().validateThis(options);

}
);
</script>
<table style="background: url(/img/.gif) repeat-x right bottom;"><tr><td>
<form name="validation_form" class="validation_form" action=" .php" method="post">
<fieldset style="line-height:12px;">
<table width="500">
<tr align="center"><td bordercolor="#666666">
<label><font class="text5">??? ??????:</font>
<input type="text" name="kodik" value="<?=$_GET['link']?>" class="text5" size="7">
</label></td></tr>
<tr><td>
<p>??????? ???? ????????? ?? ??'?:</p>
<input type="text" name="imja" class="text pib important" value="Send" valNull="?????? ????" size="20">
<p>??????? ??????? e-mail ??????, ?? ??? ?? ??????? ???????? ??????:</p>
<input type="text" name="pochta" class="text email important" value="Send" valNull="??? e-mail" size="20">

<p>????????? ??????? (?????????? ??? ????????????? ?????):</p>
<input type="text" name="fone" class="text phone important" value="Send" valNull="+380XXXXXXXXX" size="20">
<br>
<input type="checkbox" name="javu" class="text checkbox" value="yes">? ????? ???????? Java-????? ????? ?? ???????????? ? ?????????? "??? ?????????" (?????! <u>????????? ??????</u> ?????????)</p>
<p><input type="checkbox" name="aga" checked disabled="disabled">? ????????</p>
</td></tr>
<tr><td><font size="1"><font color="#FF0000">*</font>-????'?????? ????</font><br>
<font size="1"><font color="#FF0000">**</font> - ??? ?????? ???</font>
</td></tr>
</table>
</body>
</html>

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

И сейчас при загрузки на сервер выдается ошибка в 8й строке, то есть первая ошибка где-то в этом:

$kodik = $_POST['kodik'];
$imja = $_POST['imja'];
$pochta = $_POST['pochta'];
$fone = $_POST['fone'];
$javu = $_POST['javu'];
$yes = $_POST['aga'];

Edited by chest
Link to comment
Share on other sites

  • 0

у вас тег head два раза открыт.

:)

где-то в этом, форму в помощь....

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

хотя ничего удивительного что не работает ничего. надо навести порядок с кавычками в скрипте. он до 8-ой и не доживает умирает на кавычках скорее всего в строке №6. даже подсветка синтаксиса об этом говорит, тут и php знать не обязательно.

ещё по поводу приведенного php-кода:

1. не давите @ ошибки, а то так никогда не сможете контролировать свою программу. я уже писал об этом в начале темы.

2. зачем вы дважды инициализируете одни и те же переменные из поста? про isset() функцию почитайте.

3. какую версию php используете? в последних есть filter_var(), чумовая штука.

4. ещё про foreach() цикл почитайте. классная вещь.

Edited by Быколай
Link to comment
Share on other sites

  • 0

Очень намучился с создание формы для обратной связи.

Вот этот скрипт рабочий!

Простенько и со вкусом....

PHP:


<?php
if (isset($_POST['$name'])) {$name = $_POST['$name'];}
if (isset($_POST['$email'])) {$email = $_POST['$email'];}
if (isset($_POST['$theme'])) {$theme = $_POST['$theme'];}
if (isset($_POST['$message'])) {$message = $_POST['$message'];}

$today = date("d.m.Y");
$time = date ("H:i");

$address = 'mylogin@domen.ru'; //куда отправляете
$sub = "Сообщение по общим вопросам";
$mes = "Дата: $today \nВремя: $time \nАвтор: $name \nАдрес: $email \nТема: $theme \nСодержание: $message";

$verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = utf-8\r\nFrom: $email");
if ($verify == 'true')
{
echo "<p style='font-family:Verdana;font-weight:bold;font-size:10px;color:#3ca3ff;'>Письмо отправлено! Спасибо!";
}
else
{
echo "<p style='font-family:Verdana;font-weight:bold;font-size:10px;color:#e93400;'>Письмо не отправлено! Ошибка!";
}
?>

А вот и расширенный вариант.

Все работает...

PHP:


<?php
if (isset($_POST['$event'])) {$event = $_POST['$event'];}
if (isset($_POST['$name1'])) {$name1 = $_POST['$name1'];}
if (isset($_POST['$name2'])) {$name2 = $_POST['$name2'];}
if (isset($_POST['$name3'])) {$name3 = $_POST['$name3'];}
if (isset($_POST['$email'])) {$email = $_POST['$email'];}
if (isset($_POST['$age'])) {$age = $_POST['$age'];}
if (isset($_POST['$rad'])) {$rad = $_POST['$rad'];}
if (isset($_POST['$organization'])) {$organization = $_POST['$organization'];}
if (isset($_POST['$location'])) {$location = $_POST['$location'];}
if (isset($_POST['$phone'])) {$location = $_POST['$phone'];}
if (isset($_POST['$message'])) {$message = $_POST['$message'];}

$today = date("d.m.Y");
$time = date ("H:i");

$address = 'rdk1959@yandex.ru';
$sub = "Сообщение от участника";
$mes = "Дата: $today \nВремя: $time \nМероприятие: $event \nИмя: $name1 \nФамилия: $name2 \nОтчество: $name3 \nАдрес-email: $email \nВозраст: $age \nВид деятельности: $rad \nОрганизация: $organization \nМестонахождение организации: $location \nКонтактный телефон: $phone \nДополнительная информация: $message";

$verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = utf-8\r\nFrom:$email");
if ($verify == 'true')
{
echo "<p style='font-family:Verdana;font-weight:bold;font-size:10px;color:#3ca3ff;'>Анкета отправлена! Спасибо!";
}
else
{
echo "<p style='font-family:Verdana;font-weight:bold;font-size:10px;color:#e93400;'>Анкета не отправлена! Ошибка!";
}
?>

Сообщения типа: Анкета отправлена! Спасибо!, вызываются при помощи атрибута target и формы.

Link to comment
Share on other sites

  • 0

if($verify == 'true')

Aleksty, это не труЪ :)

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

Link to comment
Share on other sites

  • 0

Aleksty, спасибо!

Вот, по аналогия подстроил свой код


<?
session_start();
if (isset($_POST['$kodik'])) {$kodik = $_POST['$kodik'];}
if (isset($_POST['$imja'])) {$imja = $_POST['$imja'];}
if (isset($_POST['$pochta'])) {$pochta = $_POST['$pochta'];}
if (isset($_POST['$fone'])) {$fone = $_POST['$fone'];}
if (isset($_POST['$javu'])) {$email = $_POST['$javu'];}
if (isset($_POST['$aga'])) {$aga = $_POST['$aga'];}
if(count($_POST)>0)
{
if(!preg_match("/^[B]+([A-z]{1,1})+[D]+([0-9]{5,5})/", $_POST['kodik']))
{
echo "Не код !',$back,'";
exit;
}
if(!preg_match("/^([А-ЯІЇЄҐ]{1,1})+[а-яіїєґ]+[  ]+([А-ЯІЇЄҐ]{1,1})+[а-яіїєґ]/", $_POST['imja']))
{
echo "Не имя !',$back,'";
exit;
}
if(!preg_match("/^[a-z0-9\._-]+@+[a-z0-9\._-]+\.+[a-z]{2,3}/", $_POST['pochta']))
{
echo "Не адресс !',$back,'";
exit;
}
if(!preg_match("/^\+380\d{9}$/", $_POST['fone']))
{
echo "Не телефон !',$back,'";
exit;
}
$address = "?????@yandex.ru";
$subject = "Письмо";
$mes = ": $kodik \n: $imja \n: $pochta \n: $fone";

if( !empty($_POST['javu']) )
$mes .= "??????? ??????? 1\n";
if( !empty($_POST['aga']) )
$mes .= "??????? ??????? 1\n";

$verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = utf-8\r\nFrom:$email");
if ($verify == 'true')
{
echo "Ошибка при отправке.$back";
exit;
}
else
{
echo "Отослано!<Br> Ждите ответ ";
echo "<meta http-equiv=\"refresh\" content=\"1;URL=$url\">";
}
}
else {
die("Не все поля!$back");
}
?>

Только теперь, почему-то, когда проверяет данные но проходит проверку имя, выводиться echo "Не имя !',$back,'";, видно проблема в коде самой проверке, кто подскажет?

Link to comment
Share on other sites

  • 0

У меня проверка полей формы происходит не в PHP, а в javascript, так что таких проблем нет.

Могу скинуть скрипт, если надо.

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

Если скрипт нужен, то распишу более подробно.

Link to comment
Share on other sites

  • 0

а если юзер отключит js? а если XHR?

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

Link to comment
Share on other sites

  • 0

Просто если да е сократить код вот так:

<?
session_start();
if (isset($_POST['$kodik'])) {$kodik = $_POST['$kodik'];}
if (isset($_POST['$imja'])) {$imja = $_POST['$imja'];}
if (isset($_POST['$pochta'])) {$pochta = $_POST['$pochta'];}
if (isset($_POST['$fone'])) {$fone = $_POST['$fone'];}
if (isset($_POST['$javu'])) {$email = $_POST['$javu'];}
if (isset($_POST['$aga'])) {$aga = $_POST['$aga'];}
if(count($_POST)>0)
{
$address = "?????@yandex.ru";
$subject = "Письмо";
$mes = ": $kodik \n: $imja \n: $pochta \n: $fone";

if( !empty($_POST['javu']) )
$mes .= "??????? ??????? 1\n";
if( !empty($_POST['aga']) )
$mes .= "??????? ??????? 1\n";

$verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = utf-8\r\nFrom:$email");
if ($verify == 'true')
{
echo "Ошибка при отправке.$back";
exit;
}
else
{
echo "Отослано!<Br> Ждите ответ ";
echo "<meta http-equiv=\"refresh\" content=\"1;URL=$url\">";
}
}
else {
die("Не все поля!$back");
}
?>

Выводит Ошибка при отправке

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy