Как сделать промо код для формы обратной связи?

Aidos

Новичок
Как работает сама форма обратной связи сейчас, она сохраняет информацию в бд mysql, и отправляет письмо клиенту что он успешно отправил запрос.

Что мне нужно получить от новой формы, это возможность вводить промо код для скидки.

1. Один промо код.
2. Ограниченное кол-во ее использования.
3. Другое письмо для человека который ввел промо код.

Подскажите кто чем может )
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Что писал, как писал, где код? Без этого нет разговора ;)
 

CoolKid

Новичок
1. Создаешь табличку в БД promo_codes и хранишь в ней два поля, собственно сам промо-код с уникальным индексом и поле is_used ENUM('Y','N') по умолчанию 'N' (если он используется один раз) либо uses_count(TINYINT) по умолчанию 0 (если подразумевается многократное, но ограниченное использование)

2. Заполняешь эту таблицу генераций промо-кодов

3. В форме добавляешь <input type="text" name="promo" value="" />

4. При валидации (обработке) формы делаешь запрос

Код:
"SELECT COUNT(*) FROM promo_codes WHERE code = '$promo_code_from_form' AND uses_count < <максимальное кол-во использований>"
либо
Код:
"SELECT COUNT(*) FROM promo_codes WHERE code = '$promo_code_from_form' AND is_used = 'N'
если результатами этих запросов будет 0 - значит код уже был использован.

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

Aidos

Новичок
c0dex,
Код:
create table test_table(
id int(11) not null auto_increment,
name varchar(255) not null,
email varchar(255) not null,
phone varchar(255) not null,
data date not null,
primary key (id)
);

<form action="save_form.php" method="post" name="test_form">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
  <td colspan="2" align="center"><strong>Отправка запроса</strong></td>
</tr>
<tr>
  <td width="150">Имя :</td>
  <td><input type="text" name="test_name" maxlength="30" /></td>
</tr>
<tr>
  <td width="150">E-Mail :</td>
  <td><input type="text" name="test_mail" maxlength="30" /></td>
</tr>
<tr>
  <td width="150">Телефон :</td>
  <td><input type="text" name="test_phone" maxlength="30" /></td>
</tr>
<tr>
  <td colspan="2" align="center">
  <input type="submit" class="buttons" value="Отправить запрос" />
  <input type="reset" class="buttons" value="Очистить" />
  </td>
</tr>
</table>
</form>


<?

/* Соединяемся с базой данных */
$hostname = "localhost"; // название/путь сервера, с MySQL
$username = "root"; // имя пользователя (в Denwer`е по умолчанию "root")
$password = ""; // пароль пользователя (в Denwer`е по умолчанию пароль отсутствует, этот параметр можно оставить пустым)
$dbName = "test_base"; // название базы данных

/* Таблица MySQL, в которой будут храниться данные */
$table = "test_table";

/* Создаем соединение */
mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");

/* Выбираем базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die (mysql_error());

/* Определяем текущую дату */
$cdate = date("Y-m-d");

/* Составляем запрос для вставки информации в таблицу
name...date - название конкретных полей в базе;
в $_POST["test_name"]...  - в этих переменных содержатся данные, полученные из формы */
$query = "INSERT INTO $table SET name='".$_POST['test_name']."', email='".$_POST["test_mail"]."',
phone='".$_POST["test_phone"]."', data='$cdate'";

/* Выполняем запрос. Если произойдет ошибка - вывести ее. */
mysql_query($query) or die(mysql_error());

/* Закрываем соединение */
mysql_close();


?>
<?php
if (isset($_POST['test_name'])) {$name = $_POST['test_name'];}
if (isset($_POST['test_mail'])) {$email = $_POST['test_mail'];}
if (isset($_POST['test_phone'])) {$phone = $_POST['test_phone'];}

$to = "$email"; /*Укажите ваш адрес электоронной почты*/
$headers = "Content-type: text/plain; charset = windows-1251";
$subject = "Запрос";
$message = "Имя пославшего: $name \nЭлектронный адрес: $email \nТелефон: $phone";
$send = mail ($to, $subject, $message, $headers);
if ($send == 'true')
{
echo "<b>Спасибо за отправку вашего сообщения!<p>";
echo "<a href=index.html>Нажмите,</a> чтобы вернуться на главную страницу";
}
else
{
echo "<p><b>Ошибка. Сообщение не отправлено!";
}
?>
 
Последнее редактирование:

antson

Новичок
Партнер клуба
Aidos,
Уязвимость SQL инъекция:
$query = "INSERT INTO $table SET name='".$_POST['test_name']."', email='".$_POST["test_mail"]."',
phone='".$_POST["test_phone"]."', data='$cdate'";

между /* Закрываем соединение */ и if (isset($_POST['test_name'])) не совсем понятно это один файл ? или два ?
буду считать что это все один ;)
save_form.php

в таком случае по f5 - повтор вставки в таблицу и высылки писем.
возможность забить очередь sendmail простыми get запросами урла. Достаточно просто на популярном форуме вставить [img src=твой сайт/send_form.php]

если капча не любишь, то как минимум добавить CSRF защиту (скрытое поле в форме и эталонное значение в сессии)
за одно отвалятся тупые спамерные боты, в которых не реализована работа с куками.

нет конроля допустимых значений(мик / макс длина)
Не фильтруется html - значит xss уязвимость.

Весь скрипт на уровне : я в первый раз скопипастил код из документации.





?>
<?php


?>
<?php
 
Сверху