Вернуться   Форум Uinsell.Net > Веб-мастеру > Различные CMS и скрипты
Войти через OpenID

Ответ
 
Опции темы Опции просмотра

Создаём скрипт отзывов для своего сайта.
Старый 20.09.2009, 17:47   #1
WTF o_O
 
Аватар для SpaneR


Обратиться по нику

Инфо
Регистрация: 03.09.2009
Сообщений: 29
Благодарностей: 19
ICQ: 625365
По умолчанию Создаём скрипт отзывов для своего сайта.

Отправка отзыва для сайта на 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.';} 
Ну и наконец давайте отправим наше сообщение на почту:
PHP код:
if(!$err){ 

Проверили нет ли ошибок, если нет, формируем 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` ( 
`
idINT10 NOT NULL AUTO_INCREMENT PRIMARY KEY 
`
nameVARCHAR255 NOT NULL 
`
emailVARCHAR255 NOT NULL 
`
otzivTEXT NOT NULL 
`
pageVARCHAR255 NOT NULL 
`
dateVARCHAR255 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 
'В базе еще нету ни одного отзыва.';} 
?>
[Ссылки видны только зарегистрированным пользователям. Зарегистрироваться]

Последний раз редактировалось SpaneR; 04.11.2009 в 16:26.. Причина: Добавлено сообщение
  Ответить с цитированием
2 cпасибо от:

Старый 08.05.2010, 22:30   #2
Бывалый
 
Аватар для masterliness


Обратиться по нику

Инфо
Регистрация: 26.02.2010
Сообщений: 231
Благодарностей: 166
По умолчанию

можете перезалить?
  Ответить с цитированием

Старый 09.05.2010, 13:10   #3
blacklisted.
/showthread.php?t=19143
 
Аватар для helpful


Обратиться по нику

Инфо
Регистрация: 02.09.2009
Сообщений: 680
Благодарностей: 445
По умолчанию

masterliness, в #1 посте полная инструкция, что мешает самому написать?
  Ответить с цитированием

Старый 09.05.2010, 20:20   #4
Бывалый
 
Аватар для masterliness


Обратиться по нику

Инфо
Регистрация: 26.02.2010
Сообщений: 231
Благодарностей: 166
По умолчанию

хз у меня не работает((
  Ответить с цитированием

Старый 09.05.2010, 20:42   #5
Ветеран форума
 
Аватар для Bill Geits


Обратиться по нику

Инфо
Регистрация: 03.09.2009
Сообщений: 2,698
Благодарностей: 1855
ICQ: sosi
По умолчанию

SpaneR, мог бы написать что это обычная гостевая книга, а то поке не посмотрел не понял, что сиё значит!
  Ответить с цитированием

Старый 20.09.2010, 20:24   #6
Новичок
 
Аватар для andrewMazzy


Обратиться по нику

Инфо
Регистрация: 20.09.2010
Сообщений: 1
Благодарностей: 0
По умолчанию

Спасибо, статья очень помогла.
  Ответить с цитированием

Старый 28.03.2011, 10:14   #7
Гость
 
Аватар для Boolean


Обратиться по нику

Инфо

Сообщений: n/a
По умолчанию

я хоть и археолог, но топик - гавно. скрипт - дырявый.
SQL Injection:
Код:
mysql_query (" INSERT INTO otzivi (name, email, otziv, page, date)  
VALUES ('$name', '$email', '$otziv', '$page', '$date')");
в имя пишите
Код:
123456','troll@email.com',(SELECT version()),'page','tipa date') --
Full Path Disclosure:
htmlspecialchars не работает с массивами.
поределываем пост запрос что бы было "name[]" и вуаля, видим ошибку с полным раскрытием пути.
  Ответить с цитированием
2 cпасибо от:

Старый 06.09.2012, 13:51   #8
Новичок
 
Аватар для Пашка Непантуюсь


Обратиться по нику

Инфо
Регистрация: 06.09.2012
Сообщений: 1
Благодарностей: 0
По умолчанию

перрезалейте
  Ответить с цитированием

Старый 08.05.2017, 11:41   #9
Новичок
 
Аватар для vitaly123


Обратиться по нику

Инфо
Регистрация: 08.05.2017
Сообщений: 1
Благодарностей: 0
По умолчанию

  Ответить с цитированием
Ответ

Метки
email, mysql, php, primary, базы, бот, важно, данные, сервера, собрать


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Текущее время: 16:07. Часовой пояс GMT +4.



Powered by vBulletin
Copyright © 2009-2016 UinSell.Net
Лицензия зарегистрирована на: UinSell

Перевод: zCarot