Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 19.02.2022
Сообщений: 4

Голосование по id возможно только один раз (локальные ip.dat файлы)

02.06.2022, 12:56. Показов 1041. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализую опрос на сайте мебель911.рф который ограничивает количество попыток опроса с одного компьютера по ip. IP Человекa который прошел опрос записывается в файл ip.dat. Но возникла проблема которую я не могу понять: При чистых файлах dat опрос проходится нормально и ip пользователя записывается, но последующие голосования с другого компьютера или телефона которые даже подключены к разным сетям не работают с выскакивающим сообщением "Вы уже голосовали". В dat файле ipшник пользователя уже не записывается после первой получившиеся попытки. Код вывода опроса выглядет вот так:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
    
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="styles/style-opros.css"> 
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/
css2?family=Lato:wght@100;300;400&family=Z
en+Maru+Gothic&display=swap" rel="stylesheet"> 
<title>Опрос завершён</title>
</head>
<body>
<div class="form-opros-body">
    <div class="otvet-block">
    <?php
 
// получаем файлы по определенному голосованию
$id =  (int) $_GET['id'];
if (!empty($_GET['vote'])){
$vote = (int) $_GET['vote'];
    if (file_exists("$id.dat")) {
 $ip= $_SERVER['HTTP_CLIENT_IP'];
 $ip_file = file_get_contents("ip$id.dat");
 $ip_abbr = explode(",", $ip_file);
 $data = file("$id.dat");
 
 // если это не просто просмотр результатов
 if ($vote) {
 foreach($ip_abbr as $value)
 if ($ip == $value) {echo "<p><b><font color=red size=18px> Вы уже голосовали! </font></b></p>";
 exit;
 }
 
 // выводим благодарность
 echo "<p><b><font color=green> Спасибо! </font></b><br /><i>*Показаны результаты с Вашим голосованием:</i><p>";
 }
 
 // если это не просмотр результатов, а голосование,
 // производим необходимые действия для учета голоса
 if ($vote) {
 $f = fopen("$id.dat","w");
 flock($f,LOCK_EX);
 fputs($f, "$data[0]");
 for ($i=1;$i<count($data);$i++) {
 $votes = explode("~", $data[$i]);
 if ($i==$vote) $votes[0]++;
 fputs($f,"$votes[0]~$votes[1]");
 fflush($f);
 flock($f,LOCK_UN);
 }
 fclose($f);
 $ip_adr = fopen("ip$id.dat","a++");
 flock($ip_adr,LOCK_EX);
 fputs($ip_adr, "$ip".",");
 fflush($ip_adr);
 flock($ip_adr,LOCK_UN);
 fclose($ip_adr);
 }
 $data = file("$id.dat");
 // выводим заголовок голосования - 1я строка файла
 echo "<b>$data[0]</b><p>";
 // печатаем список ответов и результатов - остальные строки
 for ($i=1;$i<count($data);$i++) {
 $votes = explode("~", $data[$i]); // значение~ответ
 echo "$votes[1]: <b>$votes[0]</b><br>";
 }
 $ip_file = file_get_contents("ip$id.dat");
 $ip_abbr = explode(",", $ip_file);
 echo "<br>Всего проголосовало: <b>".(count($ip_abbr)-1)."</b>";
    } else {
 echo "Такого голосования не существует.";
 exit;
    }
} else {
    if (file_exists("$id.dat")) {
 $ip= $_SERVER['REMOTE_ADDR'];
 $ip_file = file_get_contents("ip$id.dat");
 $ip_abbr = explode(",", $ip_file);
 $data = file("$id.dat");
 // если это не просто просмотр результатов
 // выводим благодарность
 echo "<p><b><font color=green> Спасибо! </font></b><br /><i>*Показаны результаты голосования:</i><p>";
    }
 // выводим заголовок голосования - 1я строка файла
 echo "<b>$data[0]</b><p>";
 // печатаем список ответов и результатов - остальные строки
 for ($i=1;$i<count($data);$i++) {
 $votes = explode("~", $data[$i]); // значение~ответ
 echo "$votes[1]: <b>$votes[0]</b><br>";
 }
 echo "<br>Всего проголосовало: <b>".(count($ip_abbr)-1)."</b>";
 
 
}
 
?>
</div>
</div>
 
</body>
</html>
Вот сам вопрос:

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
    
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="styles/style-opros.css"> 
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/
css2?family=Lato:wght@100;300;400&family=Z
en+Maru+Gothic&display=swap" rel="stylesheet"> 
<title>Вопрос 1</title>
</head>
<body>
<div class="form-opros-body">
<form action="golos2.php" method="get" target='_blank' class="form-opros">
<!-- указываем в value цифру нужного нам голосования, для которого уже создали файлы //-->
<input type="Hidden" name="id" value="1">
<div class="question">Как вы оцениваете проделанную работу фирмы?</div>
<div class="radio">
    <input class="custom-radio" type="radio" id="color-1" name="vote" value="1" checked>
    <label for="color-1">Отлично</label>
  </div>
 
  <div class="radio">
    <input class="custom-radio" type="radio" id="color-2" name="vote" value="2">
    <label for="color-2">Хорошо</label>
  </div>
  <div class="radio">
    <input class="custom-radio" type="radio" id="color-3" name="vote" value="3">
    <label for="color-3">Было сложно</label>
  </div>
 
  <div class="radio">
    <input class="custom-radio" type="radio" id="color-4" name="vote" value="4">
    <label for="color-4">Не очень</label>
  </div>
<button type="Submit" value=" Ответить" οnclick = "window.close ();"  style="margin-top:10px;">
 
</form>
 
</div>
 
</body>
</html>
Спасибо если кто поможет
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2022, 12:56
Ответы с готовыми решениями:

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

Голосование один раз
Всем доброго времени суток! Есть код php &lt;?php if(!isset($_GET)){ $id = 1; } ...

Как сделать голосование лишь один раз ?
Всем привет ! Сделал голосование на своем сайте, все норм работает, но столкнулся с такой проблемой. Как сделать, что-бы пользователь смог...

4
113 / 115 / 19
Регистрация: 03.06.2022
Сообщений: 756
03.06.2022, 08:31
Лучший ответ Сообщение было отмечено EliseySPB как решение

Решение

Здравствуйте, ip-адрес может и совпадать, если 2 пользователя пользуются одним прокси/впн-сервером.

ip-адрес может храниться не только в переменной $_SERVER['HTTP_CLIENT_IP'];

попробуйте добавить строку
file_put_contents("fail.txt", var_export($_SERVER,1)."\n\n", 8);

и посмотреть содержимое файла fail.txt пройдя опрос с двух разных ip-адресов
1
Заблокирован
03.06.2022, 09:59
Цитата Сообщение от alfredplohoi Посмотреть сообщение
ip-адрес может храниться не только в переменной $_SERVER['HTTP_CLIENT_IP']
ip там и не хранится, ip находится в $_SERVER['REMOTE_ADDR']

Добавлено через 13 минут
я могу свой ip сменить простым выключением-включением-перезагрузкой роутера
0
0 / 0 / 0
Регистрация: 19.02.2022
Сообщений: 4
03.06.2022, 15:24  [ТС]
Сделал как вы сказали, вот содержимое
array (
'UNIQUE_ID' => 'YpnyxHOxosXwQ2ZrgCcyLwAAAAA',
'MMDB_ADDR' => '85.172.38.9',
'GEOIP_ADDR' => '85.172.38.9',
'MMDB_INFO' => 'result found',
'GEOIP_COUNTRY_NAME' => 'Russia',
'GEOIP_REGION' => 'KDA',
'GEOIP_CITY' => 'Anapa',
'GEOIP_LONGITUDE' => '37.32000',
'GEOIP_CONTINENT_CODE' => 'EU',
'GEOIP_LATITUDE' => '44.89000',
'GEOIP_POSTAL_CODE' => '353440',
'GEOIP_COUNTRY_CODE' => 'RU',
'PERL_USE_UNSAFE_INC' => '1',
'HTTP_HOST' => 'xn--911-9cdtb6be2m.xn--p1ai',
'HTTP_X_SERVER_ADDR' => '91.106.207.43',
'HTTP_X_FORWARDED_PROTO' => 'http',
'HTTP_X_REAL_IP' => '85.172.38.9',
'HTTP_UPGRADE_INSECURE_REQUESTS' => '1',
'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36',
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'HTTP_REFERER' => 'http://xn--911-9cdtb6be2m.xn--p1ai/golos3.php?id=1&vote=2',
'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE' => 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'PATH' => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
'SERVER_SIGNATURE' => '<address>Apache/2.4.51 (Unix) Server at xn--911-9cdtb6be2m.xn--p1ai Port 80</address>
',
'SERVER_SOFTWARE' => 'Apache/2.4.51 (Unix)',
'SERVER_NAME' => 'xn--911-9cdtb6be2m.xn--p1ai',
'SERVER_ADDR' => '91.106.207.43',
'SERVER_PORT' => '80',
'REQUEST_SCHEME' => 'http',
'REMOTE_ADDR' => '85.172.38.9',
'DOCUMENT_ROOT' => '/home/e/elisey6i/elisey6i.beget.tech/public_html',
'CONTEXT_PREFIX' => '',
'CONTEXT_DOCUMENT_ROOT' => '/home/e/elisey6i/elisey6i.beget.tech/public_html',
'SERVER_ADMIN' => 'webmaster@xn--911-9cdtb6be2m.xn--p1ai',
'SCRIPT_FILENAME' => '/home/e/elisey6i/elisey6i.beget.tech/public_html/vote.php',
'REMOTE_PORT' => '48743',
'GATEWAY_INTERFACE' => 'CGI/1.1',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'REQUEST_METHOD' => 'GET',
'QUERY_STRING' => 'id=1&vote=1',
'REQUEST_URI' => '/vote.php?id=1&vote=1',
'SCRIPT_NAME' => '/vote.php',
'PHP_SELF' => '/vote.php',
'REQUEST_TIME_FLOAT' => 1654256324.473268985748291015625,
'REQUEST_TIME' => 1654256324,
'argv' =>
array (
0 => 'id=1&vote=1',
),
'argc' => 1,
)

array (
'UNIQUE_ID' => 'Ypny2yQg35WLTUX-G1dvCwAAAAg',
'MMDB_ADDR' => '188.170.174.188',
'GEOIP_ADDR' => '188.170.174.188',
'MMDB_INFO' => 'result found',
'GEOIP_COUNTRY_NAME' => 'Russia',
'GEOIP_REGION' => 'KDA',
'GEOIP_CITY' => 'Krasnodar',
'GEOIP_LONGITUDE' => '38.97500',
'GEOIP_CONTINENT_CODE' => 'EU',
'GEOIP_LATITUDE' => '45.03550',
'GEOIP_POSTAL_CODE' => '350000',
'GEOIP_COUNTRY_CODE' => 'RU',
'PERL_USE_UNSAFE_INC' => '1',
'HTTP_HOST' => 'xn--911-9cdtb6be2m.xn--p1ai',
'HTTP_X_SERVER_ADDR' => '91.106.207.43',
'HTTP_X_FORWARDED_PROTO' => 'http',
'HTTP_X_REAL_IP' => '188.170.174.188',
'HTTP_UPGRADE_INSECURE_REQUESTS' => '1',
'HTTP_DNT' => '1',
'HTTP_USER_AGENT' => 'Mozilla/5.0 (Linux; Android 9; SM-G950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36',
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'HTTP_REFERER' => 'http://xn--911-9cdtb6be2m.xn--p1ai/golos3.php?id=1&vote=3',
'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE' => 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'PATH' => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
'SERVER_SIGNATURE' => '<address>Apache/2.4.51 (Unix) Server at xn--911-9cdtb6be2m.xn--p1ai Port 80</address>
',
'SERVER_SOFTWARE' => 'Apache/2.4.51 (Unix)',
'SERVER_NAME' => 'xn--911-9cdtb6be2m.xn--p1ai',
'SERVER_ADDR' => '91.106.207.43',
'SERVER_PORT' => '80',
'REQUEST_SCHEME' => 'http',
'REMOTE_ADDR' => '188.170.174.188',
'DOCUMENT_ROOT' => '/home/e/elisey6i/elisey6i.beget.tech/public_html',
'CONTEXT_PREFIX' => '',
'CONTEXT_DOCUMENT_ROOT' => '/home/e/elisey6i/elisey6i.beget.tech/public_html',
'SERVER_ADMIN' => 'webmaster@xn--911-9cdtb6be2m.xn--p1ai',
'SCRIPT_FILENAME' => '/home/e/elisey6i/elisey6i.beget.tech/public_html/vote.php',
'REMOTE_PORT' => '55583',
'GATEWAY_INTERFACE' => 'CGI/1.1',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'REQUEST_METHOD' => 'GET',
'QUERY_STRING' => 'id=1&vote=4',
'REQUEST_URI' => '/vote.php?id=1&vote=4',
'SCRIPT_NAME' => '/vote.php',
'PHP_SELF' => '/vote.php',
'REQUEST_TIME_FLOAT' => 1654256347.85048198699951171875,
'REQUEST_TIME' => 1654256347,
'argv' =>
array (
0 => 'id=1&vote=4',
),
'argc' => 1,
)

Добавлено через 42 минуты
Цитата Сообщение от alfredplohoi Посмотреть сообщение
Здравствуйте, ip-адрес может и совпадать, если 2 пользователя пользуются одним прокси/впн-сервером.

ip-адрес может храниться не только в переменной $_SERVER['HTTP_CLIENT_IP'];

попробуйте добавить строку
file_put_contents("fail.txt", var_export($_SERVER,1)."\n\n", 8);

и посмотреть содержимое файла fail.txt пройдя опрос с двух разных ip-адресов
СПАСИБО. Поменял REMOTE_ADDR на HTTP_X_REAL_IP и всё заработало как часы! Спасибо БОЛЬШОЕ alfredplohoi и ArtsiomRyzhanki!!!
0
113 / 115 / 19
Регистрация: 03.06.2022
Сообщений: 756
03.06.2022, 16:22
EliseySPB, и вам спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2022, 16:22
Помогаю со студенческими работами здесь

Как реализвать голосование таким образом, чтобы человек мог голосовать один раз в сутки?
Вопрос собственно такой, как реализвать голосование таким образом, чтобы человек мог голосовать один раз в сутки? Есть вариант заставить...

Программа не компилируется (не запускается) во второй раз (то есть только один раз)
почему у меня всего лишь один раз могу запустить программу через команду Run, когда хочу еще раз нажать Run не получается через средство...

Почему если несколько раз вызвать функцию она сработает только один раз
#include &lt;iostream&gt; using namespace std; int main() { int func(); { cout &lt;&lt; &quot;AAA&quot;; return 1; ...

Не могу разместить один компонент несколько раз в другом (Корректно работает только один)
Есть компонент кастомного Select, но при попытке поместить 3 таких на страницу с разными параметрами, корректно работает только один: ...

Прочитать из файла (input.dat) список имён. В файл (output.dat) перенести только уникальные имена
Помогите, пожалуйста, с программой. Паскаль. Необходимо прочитать из файла (input.dat) список имён. В файл (output.dat) перенести только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru