Отправка отзыва для сайта на PHP
На самом деле скрипт и его реализация не столь сложна как может показаться

, так что приступим. Для начала нам нужно сделать форму для отправки сообщения, делается это с помощью HTML форм. Вот так будет выглядеть наш вариант:
PHP код:
<form name="f_add_otziv" action="" method="post">
Имя: <input name="name" type="text" value=""><br>
E-mail: <input name="email" type="text" value=""><br>
Сообщение: <textarea name="otziv" rows=5 cols=20 wrap="off"></textarea><br>
Надеюсь Вы не бот? <input name="chek" type="checkbox" value="nobot"><br>
<input type="submit" name="add_otziv" value="Отправить">
</form>
Вот простая форма. Если Вам надо, можете добавить еще какие то поля. Только обратите внимание, на то что у каждого элемента формы, должно быть свое уникальное имя! А теперь давайте обработаем полученные данные от формы, для отправки их на почту админу. Во первых определимся когда будет вызван обработчик формы. Запрос должен обработаться после нажатия кнопки Отправить. Потому делаем проверку, есть нажатие или нету (правильнее сказать, просто проверяем есть в переменной add_otziv какое либо значение). Делается это оператором Если (IF):
PHP код:
<?php
if($_POST['add_otziv']) {
/*обрабатываем запрос*/
}?>
Обратите внимание на то что написанно POST. Этот параметр зависит от типа передачи данных из формы: method="post". Т.е. Если Вы передаете данные через get, то проверка будет выглядеть так:
PHP код:
if($_GET['add_otziv]) {
/*обрабатываем запрос*/
}
С этим разобрались. Теперь для безопасности сделаем следующее:
PHP код:
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$otziv = htmlspecialchars($_POST['otziv']);
$chek = htmlspecialchars($_POST['chek']);
Поясняю что мы делаем. Мы передаем переменным со схожими именами данные из формы, переданные методом POST. А htmlspecialchars() преобразует спец символы, в текстовый вид. Т.е. например символ > будет записан как >. Делается это для того что бы в поля нельзя было вставить скрипт, точнее вставлен он будет, но не обработается, потому что он будет передан как текст.
Двигаемся дальше. Теперь я хочу добавить дополнительные параметры для отправки Дату и с какой страницы был отправлен отзыв. Осуществляется это так:
PHP код:
$page = $_SERVER['REQUEST_URI'];
$date = date("d.m.Y - H:i");
В переменную $page будет передана информация которая находится после
[Ссылки видны только зарегистрированным пользователям. Зарегистрироваться], т.е. если страница на которой находится скрипт называется text.php, то переменная $page примет значение /text.php. Да и еще почему именно $_SERVER['REQUEST_URI'], этот параметр передает не только название страницы, но и все ее параметры, это важно если у Вас к одной странице привязан вывод данных из БД например по id, в таком случае в переменную передастся /text.php?id=номер.
Теперь начинаем обрабатывать наши данные. Для начала проверим, поставлен ли 'чек бокс'. Если стоит и он равен nobot, то скрипт выполняется дальше, иначе выведем ошибку.
PHP код:
if($chek == 'nobot'){
/*Выполняем скрипт*/
}else{
$err='Вы не человек :( ';
}
Ну и заодно проверим все ли данные ввел пользователь. Просто после проверки 'чек бокса' дописываем следующее:
PHP код:
if($name != '' AND $email != '' AND $otziv != ''){
/*продолжаем выполнение кода*/
}else{
$err = 'Вы заполнили не все поля!';
}
Думаю все понятно. Давайте посмотрим что у нас получается если собрать все вместе:
PHP код:
<?php
if($_POST['add_otziv']) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$otziv = htmlspecialchars($_POST['otziv']);
$chek = htmlspecialchars($_POST['chek']);
$page = $_SERVER['REQUEST_URI'];
$date = date("d.m.Y - H:i");
if($chek == 'nobot'){
if($name != '' AND $email != '' AND $otziv != ''){
/*Выполняем скрипт дальше*/
}else{
$err = 'Вы заполнили не все поля!';
}
}else{
$err='Вы не человек :( ';
}
}?>
Проверили на то что отправляет сообщение человек. Думаю надо проверить еще правильность ввода почтового ящика. Ставим вот этот код после проверки на не пустые поля:
PHP код:
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
{$err = 'Неверно введен е-mail.';}
Ну и наконец давайте отправим наше сообщение на почту:
Проверили нет ли ошибок, если нет, формируем HTML сообщение.
PHP код:
if(!$err){
$massege = "<html><head></head><body>
Новый отзыв на сайте! <br><br>
К странице http://www.имя_сайта.ru".$page.", написали отзыв:<br><br>
<table width=100% border=0>
<tr><td width=10></td>
<td><b>".$name."</b> (".$email.")<br>".$date."
<br>".$otziv."
</td>
</tr></table><br>
</body></html>";
}
Тут все ясно думаю. Но отмечу о том как вставлять переменные сюда. Сначала закрываем текст кавычкой, затем присоединяем переменную с помощью точки и далее пишем имя переменной, снова ставим точку и пишем открывающую кавычку. Выглядит это так: ".$page."
Сформируем заголовок для письма:
PHP код:
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Мой сайт <admin@мой_сайт.ru>\r\n";
Указали что типа сообщения будет html, с кодировкой Юникода, второй строчкой пишем от чьего имени отправляется это письмо, там можно указать все что Вам захочется.
Ну и само отправление:
PHP код:
if(mail("admin@мой_сайт.ru", "Новый отзыв с Вашегосайта", $massege, $headers))
{$err='Отзыв отправлен';}else{$err='Ошибка в отправлении';}
Указываем первым параметром куда отправлять письмо, затем тема письма, сам отзыв и заголовок письма.
Собираем весь скрипт воедино и помещаем на самый верх страницы с формой:
PHP код:
<?php
if($_POST['add_otziv']) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$otziv = htmlspecialchars($_POST['otziv']);
$chek = htmlspecialchars($_POST['chek']);
$page = $_SERVER['REQUEST_URI'];
$date = date("d.m.Y - H:i");
if($chek == 'nobot'){
if($name != '' AND $email != '' AND $otziv != ''){
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
{$err = 'Неверно введен е-mail.';}
if(!$err){
$massege = "<html><head></head><body>
Новый отзыв на сайте! <br><br>
К странице http://www.имя_сайта.ru".$page.", написали отзыв:<br><br>
<table width=100% border=0>
<tr><td width=10></td>
<td><b>".$name."</b> (".$email.")<br>".$date."
<br>".$otziv."
</td>
</tr></table><br>
</body></html>";
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Мой сайт <admin@мой_сайт.ru>\r\n";
if(mail("admin@мой_сайт.ru", "Новый отзыв с Вашего сайта", $massege, $headers))
{$err="Спасибо за отзыв".$name;}else{$err='Ошибка в отправлении';}
}
}else{
$err = 'Вы заполнили не все поля!';
}
}else{
$err='Вы не человек :( ';
}
}
?>
А теперь то о чем я еще не говорил, во всех ошибках я создавал переменную $err. Давайте ее выведем. В любо случае в ней что то окажется, например если письмо отправится, то ей будет передано сообщение о том что письмо ушло.
Для этого немного поработаем еще с формой. Зададим ей, чтоб она скрывалась при обработке скрипта и если все нормально, на месте формы отобразится сообщение.
PHP код:
<?if(!$_POST['add_otziv']) {?>
<form name="" action="" method="post">
Имя: <input name="name" type="text" value=""><br>
E-mail: <input name="email" type="text" value=""><br>
Сообщение: <textarea name="otziv" rows=5 cols=20 wrap="off"></textarea><br>
Надеюсь Вы не бот? <input name="chek" type="checkbox" value="nobot"><br>
<input type="submit" value="Отправить">
</form>
<?}else{
echo $err;
}?>
Т.е. если переменная отправленная кнопкой не пуста, то форма скрывается и будет выведен результат работы скрипта.
[Ссылки видны только зарегистрированным пользователям. Зарегистрироваться]
Добавляем отзыв в БД
Что нам для этого потребуется? Ну собственно сама база и доступ к ней (хост, логин и пароль).
И так берем сделанный в прошлом уроке скрипт обработки отправки сообщения.
PHP код:
<?php
if($_POST['add_otziv']) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$otziv = htmlspecialchars($_POST['otziv']);
$chek = htmlspecialchars($_POST['chek']);
$page = $_SERVER['REQUEST_URI'];
$date = date("d.m.Y - H:i");
if($chek == 'nobot'){
if($name != '' AND $email != '' AND $otziv != ''){
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
{$err = 'Неверно введен е-mail.';}
if(!$err){
$massege = "<html><head></head><body>
Новый отзыв на сайте! <br><br>
К странице http://www.имя_сайта.ru".$page.", написали отзыв:<br><br>
<table width=100% border=0>
<tr><td width=10></td>
<td><b>".$name."</b> (".$email.")<br>".$date."
<br>".$otziv."
</td>
</tr></table><br>
</body></html>";
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Мой сайт <admin@мой_сайт.ru>\r\n";
if(mail("admin@мой_сайт.ru", "Новый отзыв с Вашего сайта", $massege, $headers))
{$err="Спасибо за отзыв".$name;}else{$err='Ошибка в отправлении';}
}
}else{
$err = 'Вы заполнили не все поля!';
}
}else{
$err='Вы не человек :( ';
}
}
?>
Первое что нам необходимо сделать, это подключиться к базе. Для этого используем следующий код (его надо вставить перед if($_POST['add_otziv'])):
PHP код:
include("config.inc.php");
$link_1 = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
mysql_select_db($DB, $link_1) or die ('Не могу выбрать БД');
В файле config.inc.php будут следующие данные:
PHP код:
<?php
$DBSERVER = "адрес сервера";
//Пользователь и пароль
$DBUSER = "Пользователь";
$DBPASS = "Пароль";
//База данных
$DB = "Название базы";
?>
Если Вы сделаете все правильно и запустите страницу, то отобразится форма. Если что то не правильно, появится предупреждение об ошибке.
Отлично, теперь нам нужно создать таблицу в нашей БД, в которую будут заноситься данные. Обычно для этого используется PhpMyAdmin предоставляемый хостером. И так у нас будет 5 полей с данными и 1 поле это id, итого 6.
Просто выполните этот запрос во вкладке SQL:
PHP код:
CREATE TABLE `otzivi` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 255 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`otziv` TEXT NOT NULL ,
`page` VARCHAR( 255 ) NOT NULL ,
`date` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
Обращаю Ваше внимание что таблица была создана в кодировке Юникод (utf-8). В нашем случае id является уникальным полем и имеет параметр авто инкремента (т.е. увеличение значения от на единицу). Осталось только занести в базу данные. После того как отправили сообщение, допишем следующий код:
PHP код:
mysql_query (" INSERT INTO otzivi (name, email, otziv, page, date)
VALUES ('$name', '$email', '$otziv', '$page', '$date')");
Определяем куда заносить данные, это таблица otzivi, и перечисляем в какие поля какие данные заносим. Вот полный код получившегося скрипта:
PHP код:
<?
include("config.inc.php");
$link_1 = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
mysql_select_db($DB, $link_1) or die ('Не могу выбрать БД');
if($_POST['add_otziv']) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$otziv = htmlspecialchars($_POST['otziv']);
$chek = htmlspecialchars($_POST['chek']);
$page = $_SERVER['REQUEST_URI'];
$date = date("d.m.Y - H:i");
if($chek == 'nobot'){
if($name != '' AND $email != '' AND $otziv != ''){
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
{$err = 'Неверно введен е-mail.';}
if(!$err){
//формируем html сообщение
$massege = "<html><head></head><body>
Новый отзыв на сайте! <br><br>
К странице http://www.ИМЯ_САЙТА.ru".$page.", написали отзыв:<br><br>
<table width=100% border=0>
<tr><td width=10></td>
<td><b>".$name."</b> (".$email.")<br>".$date."
<br>".$otziv."
</td>
</tr></table><br>
</body></html>";
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Мой сайт <admin@ИМЯ_САЙТА.ru>\r\n";
if(mail("admin@ИМЯ_САЙТА.ru", "Новый отзыв с Вашего сайта", $massege, $headers))
{$err="Спасибо за отзыв".$name;}else{$err='Ошибка в отправлении';}
mysql_query (" INSERT INTO otzivi (name, email, otziv, page, date)
VALUES ('$name', '$email', '$otziv', '$page', '$date')");
}
}else{
$err = 'Вы заполнили не все поля!';
}
}else{
$err='Вы не человек :( ';
}
}
?>
Не забываем поместить файл с настройками БД в дну папку со скриптом или измените путь к нему.
[Ссылки видны только зарегистрированным пользователям. Зарегистрироваться]
Вывод данных отзывов из БД
И напоследок давайте выведем данные которые мы занесли при отправке.
Создадим для этого новый файл, я его обзову view.php
Снова нам нужно подсоединиться к базе, как делали в прошлом уроке. Заострять внимание не стану:
PHP код:
include("config.inc.php");
$link_1 = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
mysql_select_db($DB, $link_1) or die ('Не могу выбрать БД');
Но у нас таблица записана в utf-8, потому для избежания проблем с выводом данных пишем после подключения следующее:
PHP код:
$query='SET NAMES utf8';
$res = mysql_query($query);
Подключение есть. Достаем из базы нужные данные. Я вытащу следующие: Имя, отзыв и дата, адрес почты вытаскивать не стану.
PHP код:
$otzivi = mysql_query ("SELECT name, otziv, date
FROM otzivi
ORDER BY id DESC");
$myrow_otzivi = mysql_fetch_array ($otzivi);
Этим запросом, мы выбираем нужные нам поля из таблицы отзывов. А ORDER BY id DESC сортирует наши отзывы по id (т.е. самое большое id это последний отзыв) таким образом что последний отзыв будет выведен первым.
Выводить отзывы будем при помощи цикла, вот так:
PHP код:
do{
...
}while($myrow_otzivi = mysql_fetch_array ($otzivi));
Наш цикл будет выполняться до тех пор, пока не будут выведены все данные из базы.
Ну и теперь в цикл поместим табличку для вывода отзыва. Т.е. таблиц будет столько же, сколько и отзывов. Если хотите сделать одну таблицу, просто вынесите открывающий и закрывающий код таблицы за цикл.
PHP код:
do{
echo "<table border=1 width=300>";
echo "<tr><td><b>".$myrow_otzivi['name']."</b> ".$myrow_otzivi['date']."<td></tr>";
echo "<tr><td>".$myrow_otzivi['otziv']."<td></tr>";
echo "</table>";
}while($myrow_otzivi = mysql_fetch_array ($otzivi));
Для вывода нужных данных используется конструкция: $myrow_otzivi['date'].
Отлично! Ну и напоследок, сделаем проверку, есть ли в БД что выводить, если нету то выводим сообщение о том что еще нету отзывов.
PHP код:
if($myrow_otzivi['name']){
/*код цикла*/
}else{
echo 'В базе еще нету ни одного отзыва.';}
Вот получившийся код:
PHP код:
<?php
include("config.inc.php");
$link_1 = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
mysql_select_db($DB, $link_1) or die ('Не могу выбрать БД');
$query='SET NAMES utf8';
$res = mysql_query($query);
$otzivi = mysql_query ("SELECT name, otziv, date
FROM otzivi
ORDER BY id DESC");
$myrow_otzivi = mysql_fetch_array ($otzivi);
if($myrow_otzivi['name']){
do{
echo "<table border=1 width=300>";
echo "<tr><td><b>".$myrow_otzivi['name']."</b> ".$myrow_otzivi['date']."<td></tr>";
echo "<tr><td>".$myrow_otzivi['otziv']."<td></tr>";
echo "</table>";
}while($myrow_otzivi = mysql_fetch_array ($otzivi));
}else{
echo 'В базе еще нету ни одного отзыва.';}
?>
[Ссылки видны только зарегистрированным пользователям. Зарегистрироваться]