Предотвратить несколько записей с использованием PHP
Рядом со средством опроса на веб-странице представлены следующие поля ввода, которые позволяют посетителю (избирателю) вводить свои данные в лотерею для препятствия в качестве вознаграждения за свои усилия по участию в опросе.
Сценарий формы розыгрыша призов не присоединен к сценарию опроса Все входные данные в скрипте формы ввода лотереи проверяются, и информация отправляется в плоский файл. Это короткий опрос, продолжающийся всего 7 дней по различным темам, которые могут время от времени возникать на форуме маленького города. (ip также собран)
Name :<input type="text" name="visitor" /><br /><br />
Email :<input type="text" name="visitormail" /><br /><br />
Phone :<input type="text" name="visitorphone"/><br /><br />
При подаче заявки страница "Спасибо" сообщает посетителю, что его данные будут использованы один раз в лотерее для корзины. Другими словами, посетитель может вернуться назад, снова заполнить форму и отправить заявку, требуя, чтобы я проверил и отсеял несколько записей из плоского файла перед завершением рисования случайного числа для корзины!
Вопрос Есть ли простой способ установить что-то, что не дает посетителю сделать несколько попыток ввода в розыгрыш?
7 ответов
Я бы тоже записал IP (см. $_SERVER
переменная). Затем вы можете сузить дубликаты по IP. Не всегда самый надежный метод.
Другим подходом может быть печенье.
Я согласен с @David Barker в том, что люди, вероятно, найдут способ обойти то, что вы положили на место, если вы не войдете в них и не получите для них идентификатор пользователя. Тем не менее, я не согласен с ним, что ответ "да". Я думаю, что ответ "нет".
Я не вижу способа, чтобы вы могли остановить посетителя, отправляющего несколько иную информацию в несколько записей. Если вы не попросите и не подтвердите их номер социального страхования, номер паспорта или водительского удостоверения. На самом деле то же самое, вероятно, относится и к отказу от нескольких учетных записей в системе, в которую входят пользователи.
Таким образом, вам, возможно, придется признать, что люди могут иметь несколько записей в розыгрыше или отказаться от них.
Извините за отрицательный ответ, но я действительно не вижу, как вы можете достичь того, чего хотите, без огромных ресурсов в вашем распоряжении.
Изменить, чтобы объяснить мои аргументы далее:
1 - использовать имя в качестве фильтра
У меня есть простое имя "Пол Уайт", есть тысячи, если не миллионы, Пола Уайта, поэтому ограничиться одним нереально.
2 - Использовать IP-адрес
Все, что мне нужно сделать, это отсоединить мой маршрутизатор от провайдера, а затем снова подключиться. Здравствуйте, новый IP, второй вход в лотерею. Или войдите на компьютер моей старой мамы - тот же результат. Вы не можете предотвратить несколько записей, точка.
3 - Использовать номер телефона
У меня также есть 2 мобильных телефона: номер наземной линии и номер скайпа (я много путешествую), каждый раз я мог использовать другой.
4 - Используйте номер дома плюс почтовый индекс
В Великобритании (я не знаю где-нибудь еще, но подозреваю, что это похоже), один почтовый индекс применяется ко многим домам. Однако, скажем, мой номер дома - 16, я мог бы представить запись как 16, 16а, 16b... и адрес все равно будет действителен, и все, что будет отправлено по почте, все равно попадет ко мне.
5 - Подобные аргументы, относящиеся к незначительным манипуляциям для всего, что вы можете придумать
Если пользователям необходимо войти в систему, чтобы проголосовать, вы можете просто сохранить user_id и проверить, проголосовали ли они уже. Или, если они анонимны, вы можете проверить номер IP $_SERVER['REMOTE_ADDR ']
, Или вы можете сохранить куки при отправке.
Ответ - да, но вы можете так сильно сдерживать людей только теми данными, которые вам предоставлены. Люди будут (если склонны) найти способ участвовать в соревнованиях несколько раз.
Я хотел бы иметь сценарий, который читает из плоского файла и возвращает истину, если данные ввода ключа соответствуют данным, уже хранящимся в файле.
например
$input = $_REQUEST['post_data'];
$fp = fopen("poll.txt","r");
while ($ln = fgetcsv($fp, 1000, "\t") !== FALSE) {
if ($ln[4] == $input['post_data']) {
// Set exists to true
$exists = TRUE;
}
}
// Check if $exists == TRUE {
// return false;
// Else {
// write new data to file.
// }
Это считает, что ваш плоский файл разделен /t
для каждой "клетки". Также следует учесть: $ln[x], где x = положение данных в каждой строке файла.
Вы можете легко решить эту проблему, используя электронную почту в качестве ключа. Если вы используете базу данных, вы можете быстро проверить, существует ли электронная почта, например:
"SELECT COUNT(visitoremail) FROM users WHERE LOWER(visitoremail) = '" . strtolower($_REQUEST['visitormail']) . "';
Если результат больше нуля, вы не добавите их в базу данных. Точно так же, если бы количество было равно нулю, вы бы сделали INSERT со своими новыми данными.
Другим способом будет хранить все записи в вашей базе данных независимо. Тогда либо "SELECT DISTINCT visitoremail FROM users
..."или выберите все электронные письма в массив PHP, а затем выполните array_unique(visitoremails)
чтобы получить уникальные электронные письма.
Я полагаю, вы храните данные в базе данных. Затем вы можете выбрать один элемент, который должен быть уникальным (я бы порекомендовал номер телефона) и сделать его столбец уникальным ключом. Поэтому множественные вставки в базу данных не будут выполнены (вы должны предварительно проверить формат # телефона и стандартизировать его перед фактической вставкой, но это совершенно другая проблема).
Если вы отключите кнопку отправки в событии onclick, посетителю придется обновить страницу для повторной отправки формы.
Вы можете сделать что-то вроде:
var btn = document.getElementById("button-id");
btn.onclick = function() {
btn.disabled = 'disabled';
}