|
|
|
| Привет, вот есть скрипт простенького голосования:
index.php
<FORM METHOD="POST" action="add.php">
<center><TABLE BORDER=0 width="119"><TR><TD><TABLE BORDER=0 width="120">
<TR><TD><b><font face="Courier New" size="2">Любимый язык?:</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=1 style="font-weight: 700"></font><b><font size="2" face="Courier New">PHP</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=2 style="font-weight: 700"></font><b><font size="2" face="Courier New">Delphi</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=3 style="font-weight: 700"></font><b><font size="2" face="Courier New">C++</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=4 style="font-weight: 700"></font><b><font size="2" face="Courier New">Assembler</font></b></TD></TR>
<TR><TD>
<center><INPUT TYPE=Submit NAME=vote VALUE=" Отправить "><br>
<INPUT TYPE=Submit NAME=result VALUE=" Результат "></center>
</TD></TR>
</TABLE></center></TD></TR></TABLE></FORM>
|
add.php
<?php
$file = "vote.txt";
$a = file($file);
$i = 1; $fi = Count($a);
$n = 0;
while ($i <= $fi):
$a[$i] = trim(str_replace ("\n","", $a[$i]));
$n = $n+$a[$i];
$i++;
endwhile;
if ($answer != "") {
echo "<br>Результат:";
$a[$answer]++; $n++;
$rez = "Результаты голосования!\n".$a[1].
"\n".$a[2]."\n".$a[3]."\n".$a[4];
$fp = @fopen($file,"w");
if ($fp) { $counter=fputs($fp,$rez); fclose($fp); }
else { echo "Произошла ошибка записи результатов!"; }
} else { echo "<br>Результаты голосования"; }
echo "<br>PHP - <b>".$a[1]."</b>";
echo "<br>Delphi - <b>".$a[2]."</b>";
echo "<br>C++ - <b>".$a[3]."</b>";
echo "<br>Assembler - <b>".$a[4]."</b>";
echo "<br><br>Всего проголосовало: ".$n;
?>
<hr>
|
И вот решил сделать чтобы он банил ip адрес если человек уже проголосовал, тоесть чтобы он мог голосовать только 1 раз! Идея такая, Если ip адрес совпадает с тем который записан в файле с ip адресами которые уже проголосовали то он выводил только результат... А саму форму голосования уже невыводил..
И еще можно обнадежить защиту так, что при голосование у чела который голосовал устанавливалась кука :)
Помогите пожалуйста дописать код который бы записывал ip адрес в файл и если он совпадал то выводил тока результат...
В принципе вот код который все сверяет)
<?
$ips=file("ban.txt");
if(empty($_SERVER['REMOTE_ADDR']))
die("<b>Ваш IP адрес не определён!</b>");
foreach ($ips as $ip)
{
if($_SERVER['REMOTE_ADDR']==trim($ip))
die('
<center><h3><b>Ты забанен тебе сюда нельзя!</b></h3></center>
');
}
?>
|
Зарание SeHKc! :) | |
|
|
|
|
|
|
|
для: ZetRider
(09.03.2006 в 13:24)
| | лучше поспользоваться не циклом, а функцией in_array() | |
|
|
|
|
|
|
|
для: Loki
(09.03.2006 в 13:54)
| | in_array не кактит в даннос случае, т.к. у ИП-адреса допишется ещё один символ: перенос строки. | |
|
|
|
|
|
|
|
для: ZetRider
(09.03.2006 в 13:24)
| | IP-адрес посетителя хранится в элементе суперглобального массива $_SERVER['REMOTE_ADDR'], вам остаётся их только сохранять в отдельный файл
<?php
$fd = fopen("ban.txt","a");
fwrite($fd, $_SERVER['REMOTE_ADDR']."\n");
fclose($fd);
?>
|
А затем проверять нет ли в файле ip.txt текущего IP-адреса при помощи кода
<?php
// Читаем содержимое файла в массив $arr -
// каждая строка соответствует массиву
$arr = file("ban.txt");
// Проверяем не входит ли текцщий IP-адрес в массив $arr
if(in_array($_SERVER['REMOTE_ADDR'], $arr))
{
echo "Извините, голосовать можно только один раз";
}
?>
|
Собственно вы практически весь код и написали... | |
|
|
|
|
|
|
|
для: cheops
(09.03.2006 в 13:59)
| | Ну вот в том та и дело) что коды есть, а вот совместить его с голосование у меня невыходит =((( | |
|
|
|
|
|
|
|
для: ZetRider
(09.03.2006 в 14:29)
| | А файл с ip адресами вы часом не в блокноте правите? | |
|
|
|
|
|
|
|
для: Loki
(09.03.2006 в 14:56)
| | нет, средствами PHP.. Ну бывает и блокнотом, а какая разница... в курсе что бывает заместо ентера он пишет квадратик) | |
|
|
|
|
|
|
|
для: ZetRider
(09.03.2006 в 15:00)
| | просто если файл создается скриптом (или в UNIX), то trim не понадобится. | |
|
|
|
|
|
|
|
для: Loki
(09.03.2006 в 15:37)
| | а вот как их совместить та ети скрипты? =( | |
|
|
|
|
|
|
|
для: ZetRider
(09.03.2006 в 22:00)
| | Так, все сделал! все работает!))) НО! Если человек проголосовал то он пишет не втом месте на сайте гже голосование что он уже проголосовал, а закрывает всю страницу! и пишет что он уже голосовал, вот коды:
index.php
<?
$file = "log/vote_ban.txt";
$a = file($file);
$i = 1; $fi = Count($a);
$n = 0;
while ($i <= $fi):
$a[$i] = trim(str_replace ("\n","", $a[$i]));
$n = $n+$a[$i];
$i++;
endwhile;
$a[$answer]++; $n++;
$rez = "Результаты голосования!\n".$a[1].
"\n".$a[2]."\n".$a[3]."\n".$a[4];
$ips=file("ban.txt");
if(empty($_SERVER['REMOTE_ADDR']))
die("<b>Ваш IP адрес не определён!</b>");
foreach ($ips as $ip)
{
if($_SERVER['REMOTE_ADDR']==trim($ip))
die("Вы голосовали!<br>Результат:
<br>PHP - <b>$a[1]</b>
<br>Delphi - <b>$a[2]</b>
<br>C++ - <b>$a[3]</b>
<br>Assembler - <b>$a[4]</b>
<br>Всего проголосовало: $n
");
}
?>
<FORM METHOD="POST" action="add_vote.php">
<center><TABLE BORDER=0 width="119"><TR><TD><TABLE BORDER=0 width="120">
<TR><TD><b><font face="Courier New" size="2">Любимый язык?:</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=1 style="font-weight: 700"></font><b><font size="2" face="Courier New">PHP</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=2 style="font-weight: 700"></font><b><font size="2" face="Courier New">Delphi</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=3 style="font-weight: 700"></font><b><font size="2" face="Courier New">C++</font></b></TD></TR>
<TR><TD><font face="Courier New">
<INPUT TYPE=radio NAME=answer VALUE=4 style="font-weight: 700"></font><b><font size="2" face="Courier New">Assembler</font></b></TD></TR>
<TR><TD>
<center><INPUT TYPE=Submit NAME=vote VALUE=" Отправить "><br>
</center>
</TD></TR>
</TABLE></center></TD></TR></TABLE></FORM>
|
add_vote.php
<?php
$file = "log/vote.txt";
$a = file($file);
$i = 1; $fi = Count($a);
$n = 0;
while ($i <= $fi):
$a[$i] = trim(str_replace ("\n","", $a[$i]));
$n = $n+$a[$i];
$i++;
endwhile;
if ($answer != "") {
echo "<br>Результат:";
$a[$answer]++; $n++;
$rez = "Результаты голосования!\n".$a[1].
"\n".$a[2]."\n".$a[3]."\n".$a[4];
$fp = @fopen($file,"w");
if ($fp) { $counter=fputs($fp,$rez); fclose($fp); }
else { echo "Произошла ошибка записи результатов!"; }
$fd = fopen("ban.txt","a");
fwrite($fd, $_SERVER['REMOTE_ADDR']."\r\n");
fclose($fd);
} else { echo "<br>Результаты голосования"; }
echo "<br>PHP - <b>".$a[1]."</b>";
echo "<br>Delphi - <b>".$a[2]."</b>";
echo "<br>C++ - <b>".$a[3]."</b>";
echo "<br>Assembler - <b>".$a[4]."</b>";
echo "<br><br>Всего проголосовало: ".$n;
?>
<hr>
|
Проблема заключена в том, что он закрывает надписью все страницу, а как сделать чтобы он писал тока в том месте где скрипт голосования! Фреймы непредлогать) | |
|
|
|