Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание =Рэйтинга статьи=, Этап начальный 
:(
    Опции темы
клоп
Дата 19.3.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Добрый вечер!! Не найдя в Инете готового решения, решил написать сам.

Вот начальный код. В дальнейшем код конечно поменяется, - добавиться защита от накруток по IP.

Код

<?PHP

$click = $_POST["click"];
$id = $_POST["id"];
?>
<html>
<head>
        <META http-equiv=Content-Type content="text/html; charset=windows-1251">
        
</head>

<body ><center>
 <table border=0 cellspacing=0 cellpadding=0 width="100%" height=200>
<tr >
<td valign=middle>

 <table border=0 cellspacing=0 cellpadding=0>
<tr ><form method="post" action="rating.php" name="score">
<td width=100>&nbsp;&nbsp; <input name="click"  type="submit" value="Îöåíèòü"></td>
<td>
    <input  type="hidden" name="id" value="0" checked>
    <input  type="radio" name="id" value="1"></td><td width=20>&nbsp;1</td>
<td><input  type="radio" name="id" value="2"></td><td width=20>&nbsp;2</td>
<td><input  type="radio" name="id" value="3"></td><td width=20>&nbsp;3</td>
<td><input  type="radio" name="id" value="4"></td><td width=20>&nbsp;4</td>
<td><input  type="radio" name="id" value="5"></td><td width=20>&nbsp;5</td>
<td width=30>&nbsp;&nbsp;</td>
<td width=300>Оценка:<font color=#ee0000><b>&nbsp;
<?PHP

if($id != 0){
$data = "score.txt";
$fp=fopen($data,"a+")or die("Не смог открыть");
flock($fp, LOCK_EX);
fwrite($fp,"$id\n");
flock($fp, LOCK_UN);
fclose($fp);


$readdata=fopen($data,"r") or die("Не смог открыть");
        $data_array=file($data);
        $sum = count($data_array);
        $count = 0;
        for($i=0 ; $i<$sum; $i++){
     
        $count += $data_array[$i];
        
        
        } 
              
        fclose($readdata);
        $rating = $count / $sum;
        
        printf ("%.2f",$rating);
        echo "</b>&nbsp;&nbsp;(от $sum чел.)";

}else { 

$data_read = "score.txt";
$readdata=fopen($data_read,"r") or die("Не смог открыть");
        $data_array=file($data_read);
        $sum = count($data_array);
        $count = 0;
        for($i=0 ; $i<$sum; $i++){
            
        $count += $data_array[$i];
        
        
        } 
              
        fclose($readdata);
        if($sum != 0){
        $rating = $count / $sum;
        } else { $rating = 0.00;}
        printf ("%.2f",$rating);
        echo "</b>&nbsp;&nbsp;(от $sum чел.)";

 }


?>

</td>
</tr> 
</table> 
</form>


</td></tr></table> 

</body>
</html>


Все работает, все как нужно считает кроме одного момента:

Если юзер проголосует (выставит какую либо оценку) и нажмет кнопку =Оценить=, а после этого начнет жать на F5 или обновлять страницу, то скрипт будет защитывать помимо его последнего результата все те Релоады страницы, записывая их (с его последней оценкой) в файл score.txt. Как защитить скрипт от такого вида накрутки?, т.к. на этом этапе блокировка IP еще не сделана.

Это сообщение отредактировал(а) клоп - 19.3.2006, 21:09
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
PARROT
Дата 19.3.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: 23
Всего: 50



Ставь куки. Пускай жмет до посинения.
Потом можно сделать отдельно форму для голосования, отдельно вывод рейтинга.


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
CyClon
Дата 19.3.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



К голосавинием допускайте только тех, у кого известен HTTP_X_FORWARDED_FOR.


--------------------
user posted image
PM   Вверх
клоп
Дата 19.3.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Понял спасибо!! Короче нужно писать дальше с защитой по IP или с кукисами. Млина просто непонятно, если этот чёрт поставил оценку и стал F5 жать, значит значение переменной висит в памяти... как обнулить бы это?
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
PARROT
Дата 19.3.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: 23
Всего: 50



Если проголосовал, то ставишь куки с именем и значением, и больше он не сможет проголосовать, если конечно он не удалит эти куки в браузере, но надолго его не хватит.

Это сообщение отредактировал(а) PARROT - 19.3.2006, 21:27


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
DeadSoul
Дата 19.3.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



клоп, не мог бы ты исправить слово "рэйтинг"? Аргументация: поиск по форуму.


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Ciber SLasH
Дата 20.3.2006, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 3
Всего: 67



2клоп:
Цитата(клоп @ 19.3.2006, 21:08 Найти цитируемый пост)
Млина просто непонятно, если этот чёрт поставил оценку и стал F5 жать, значит значение переменной висит в памяти... как обнулить бы это?


Цитата(PARROT @ 19.3.2006, 21:25 Найти цитируемый пост)
Если проголосовал, то ставишь куки с именем и значением, и больше он не сможет проголосовать

И при загрузке страницы проверяй, установлены ли куки, если да, то "по башке" давай. smile
PM   Вверх
клоп
Дата 20.3.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Цитата(DeadSoul @ 19.3.2006, 21:31)
клоп, не мог бы ты исправить слово "рэйтинг"? Аргументация: поиск по форуму.

DeadSoul я уж заметил свой косяк в орфографии в названии топика, только не мог найти как это поправить smile
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
клоп
Дата 20.3.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Дописал защиту по IP. С кукисами пока решил не связываться. Зацените что получилось, потестируйте на своих локалках. Все работает, накруток нет.

Мне кажется что код получился какой то избыточный, что можно изменить или наоборот добавить?

Код

<?PHP
error_reporting (E_ALL ^ E_NOTICE);// убираем неопределенности


$click = $_POST["click"];
$id = $_POST["id"];
?>
<html>
<head>
        <title>Оцени статью</title>
        <META http-equiv=Content-Type content="text/html; charset=windows-1251">
        
</head>

<body ><center>
 <table border=0 cellspacing=0 cellpadding=0 width="100%" height=200>
<tr >
<td valign=middle>

 <table border=0 cellspacing=0 cellpadding=0>
<tr bgcolor=#f6f9fb ><form method="post" action="rating-ip.php" name="score">
<td width=100>&nbsp;&nbsp; <input name="click"  type="submit" value="Оценить"></td>
<td>
    <input  type="hidden" name="id" value="0" checked>
    <input  type="radio" name="id" value="1"></td><td width=20>&nbsp;1</td>
<td><input  type="radio" name="id" value="2"></td><td width=20>&nbsp;2</td>
<td><input  type="radio" name="id" value="3"></td><td width=20>&nbsp;3</td>
<td><input  type="radio" name="id" value="4"></td><td width=20>&nbsp;4</td>
<td><input  type="radio" name="id" value="5"></td><td width=20>&nbsp;5</td>
<td width=30>&nbsp;&nbsp;</td>
<td width=200>Оценка:<font color=#ee0000><b>&nbsp;
<?PHP

//---------------------------------------------------
// Получаем IP и сверяем его с голосовавшими
//---------------------------------------------------
if (getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
    else if(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
    else $ip = "Не определён";
    
$data_array=file("score.txt");
$sum=count($data_array);
$check_ip = FALSE;
for($i=0;$i<$sum;$i++)
        {
            $parse_data=explode("|",$data_array[$i]);
            $data_array[$i]=$parse_data[0];
            if($data_array[$i] === $ip){
            $check_ip = TRUE; break; // юзер уже есть в базе
        }
        }



//-----------------------------------------------------
// Если  выбрана оценка и юзер впервой жмет на оценку
//-----------------------------------------------------

if(isset($_POST['id']) && $_POST['id'] != "0" && $check_ip !== TRUE){
    
$data = "score.txt";
$fp=fopen($data,"a+")or die("Ошибка при записи файла\n");
flock($fp, LOCK_EX);
fwrite($fp,"$ip|$id\n");
flock($fp, LOCK_UN);
fclose($fp);

$data_array=file("score.txt");
$sum=count($data_array);
$count=0;
    for($line=0;$line<$sum;$line++)
        {
            $parse_data=explode("|",$data_array[$line]);
            $data_array[$line]=$parse_data[1];

            $count += $data_array[$line];

        }
            $rating = $count / $sum;
        
        printf ("%.2f",$rating);
        echo "</b>&nbsp;&nbsp;(от $sum чел.)";
}

else { 
//---------------------------------------------------
// Если не выбрана оценка или юзер голосовал
//---------------------------------------------------

$data_array=file("score.txt");
$sum=count($data_array);
$count=0;
    for($line=0;$line<$sum;$line++)
        {
            $parse_data=explode("|",$data_array[$line]);
            $data_array[$line]=$parse_data[1];

            $count += $data_array[$line];

        }

    if($sum != 0){
        $rating = $count / $sum;
            } else 
        { $rating = 0.00;}
        printf ("%.2f",$rating);
        echo "</b>&nbsp;&nbsp;(от $sum чел.)";

        }


?>

</td>
</tr> 
</table> 
</form>


</td></tr></table> 

</body>
</html>


В дальнейшем хочу все это прикрутить к сайту сделанному еще в свое время на CuteNews (версии 1.3.6)
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
CTAPbIuMABP
Дата 20.3.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 17.2.2006
Где: Киев

Репутация: 2
Всего: 1



а ты в сторону сессий никогда не смотрел?
PM WWW ICQ Skype   Вверх
клоп
Дата 20.3.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Цитата(CTAPbIuMABP @ 20.3.2006, 18:10)
а ты в сторону сессий никогда не смотрел?

Была мысль, но сессии разрушаются по окончании активности броузера. Решил на айпи реализовать, по тому как по айпи можно потом будет вычислить откуда примерно пришел юзер.
Добавлено @ 20:31
Забыл включить перед началом проверки по IP: (33 строка кода)

Код

if(!file_exists("score.txt")) touch("score.txt");


--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
клоп
Дата 21.3.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Окончательный рабочий вариант
Код

<?PHP
error_reporting (E_ALL ^ E_NOTICE);// убираем неопределенности

$click = $_POST["click"];
$id = $_POST["id"];
?>
<html>
<head>
        <title>Оцени статью</title>
        <META http-equiv=Content-Type content="text/html; charset=windows-1251">        
</head>

<body >
 <table border=0 cellspacing=0 cellpadding=0 width="100%" height=200>
<tr><td valign=middle>

 <table border=0 cellspacing=0 cellpadding=0>
<tr bgcolor=#f6f9fb ><form method="post" action="rating.php" name="score">
<td width=100>&nbsp;&nbsp; <input name="click"  type="submit" value="Оценить"></td>
<td>
    <input  type="hidden" name="id" value="0" checked>
    <input  type="radio" name="id" value="1"></td><td width=20>&nbsp;1</td>
<td><input  type="radio" name="id" value="2"></td><td width=20>&nbsp;2</td>
<td><input  type="radio" name="id" value="3"></td><td width=20>&nbsp;3</td>
<td><input  type="radio" name="id" value="4"></td><td width=20>&nbsp;4</td>
<td><input  type="radio" name="id" value="5"></td><td width=20>&nbsp;5</td>
<td width=30>&nbsp;&nbsp;</td>
<td width=200>Оценка:<font color=#ee0000><b>&nbsp;
<?PHP

if(file_exists(".htscore")) {

//---------------------------------------------------
// Получаем IP и сверяем его с голосовавшими
//---------------------------------------------------
if (getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
    else if(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
    else $ip = "Не определён";
    
$data_array=file(".htscore");
$sum=count($data_array);
$check_ip = FALSE;
for($i=0;$i<$sum;$i++)
        {
            $parse_data=explode("|",$data_array[$i]);
            $data_array[$i]=$parse_data[0];
            if($data_array[$i] === $ip){
            $check_ip = TRUE; break; // юзер уже есть в базе
        }
        }
}else{
touch(".htscore");
}
//-------------------------------------------------------------------------------------------------------
// Если выбрана оценка и юзер впервые жмет на оценку,- заносим его результат
//-------------------------------------------------------------------------------------------------------

if(isset($_POST['id']) && $_POST['id'] != "0" && $check_ip !== TRUE){
    
$data = ".htscore";
$fp=fopen($data,"a+")or die("Ошибка при записи файла\n");
flock($fp, LOCK_EX);
fwrite($fp,"$ip|$id\n");
flock($fp, LOCK_UN);
fclose($fp);
}
//-----------------------------------------------------
// Иначе, выводим результаты
//-----------------------------------------------------
$data_array=file(".htscore");
$sum=count($data_array);
$count=0;
    for($line=0;$line<$sum;$line++)
        {
            $parse_data=explode("|",$data_array[$line]);
            $data_array[$line]=$parse_data[1];
            $count += $data_array[$line];

        }            
    if($sum != 0){
        $rating = $count / $sum;
            } else { 
        $rating = 0.00;
        }                        
printf ("%.2f",$rating);
echo "</b>&nbsp;&nbsp;(от $sum чел.)";

?>

</td>
</tr> 
</form>
</table> 

</td></tr></table>
</body>
</html>

--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1039 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.