Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > рейтинг


Автор: Cens 8.9.2007, 17:59
Вопрос в следующем. Как мне создать рейтинг такого вида .. есть ссылки допустим + и - .. кликаем по плюсу .. добавляется один голос .. кликаем по минусу .. отнимается голос .. и все это выводится сразу .. т.е. нажали минус .. обновили страницу .. голоса одного нет.. Помогите пожалуйста

Автор: Acer 8.9.2007, 19:15
ну, это элементарно!
Сделай в таблице users (если статистика к юзерам относится) поле "rating" и сделай ссылку на плюсе и на минусе, например
index.php?rating=m1 - это типа минус 1
index.php?rating=p1 - это плюс.
А потом проверяй наличие $_GET['rating'] и делай запросы в БД

Автор: Cens 8.9.2007, 22:12
У меня без БД ... Как без бд реализовать?

Автор: console 8.9.2007, 23:45
javascript

Автор: Acer 8.9.2007, 23:58
А почему сразу JavaScript ? Если нет БД, можно просто в текстовый файлик писать...

Автор: Cens 9.9.2007, 05:13
Допустим беру с тхт ..?

Автор: ewolf 9.9.2007, 12:58
Ну, в простейшем варианте с текстовым файлом можно сделать так.

Создаешь файл votes.info с таким содержимым

Код

<?php
   $votes = array( );
?>


(да, внутри именно php)
Ставим на него права 777

Создаем файл links.info, содержащий ссылки, по которым будут вестись голосования
Код

<?php
   $links = array(
                           1 => 'http://ya.ru',
                           2 => 'http://mail.ru',
                         );
?>


Теперь создаем файл, обрабатывающий голоса, например
addvote.php
Код

<?php
   include('links.info');
   include('votes.info');
   if( $_GET['vote'] == 'm1' )
      $vote_info = -1;
   else
      $vote_info = 1;

   if( isset($links[$_GET['link_id']]) )
      $votes[$_GET['link_id']] += $vote_info;
   else
      die('Нет такой ссылки');

   $file = fopen('votes.info', 'w');
   fwrite($file, '<?php $votes = '.var_export($votes, true).'; ?>');
   fclose($file);
   // Ну, или просто file_put_contents, если у тебя php5
?>


Автор: CTAzz 9.9.2007, 17:03
Дабы не заводить похожую тему задам еще вопрос, есть тоже самое "+" и "-", как с использованием mysql сделать голосование по ип адресу?
Как вести записи в таблицу, чтобы не сильно грузить

Автор: ewolf 9.9.2007, 17:26
Ну, надо создать такую таблицу для статей

tbl_articles
article_ID | rating

И еще одну такую

tbl_voters
article_ID | voter_IP

Соотвественно написать на php код по типу такого

Код

<?php
   $article_ID = (int)$_GET['article_id'];
   $ip = $_SERVER['REMOTE_ADDR'];

   // Проверка, что пользователь с IP уже проголосовал
   $query = "SELECT voter_IP FROM tbl_voters WHERE article_ID = '{$article_ID}' AND voter_IP = '".ip2long($ip)."' LIMIT 1";
   $result = mysql_query($query);
   if( mysql_num_rows() > 0 )
      die('Извините, вы уже проголосовали');
   
   if( $_GET['vote'] == 'm1' )
      $query = "UPDATE tbl_articles SET rating = rating - 1 WHERE article_ID = '{$article_ID}' ";
   else
      $query = "UPDATE tbl_articles SET rating = rating + 1 WHERE article_ID = '{$article_ID}' ";
   mysql_query($query);   

   $query = "INSERT INTO  tbl_voters SET article_ID = '{$article_ID}', voter_IP = '".ip2long($ip)."' ";
   mysql_query($query);
?>


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

+ обратите внимание, что у некоторых пользователей может быть одинаковый IP

Автор: CTAzz 9.9.2007, 18:12
Статья в базе имеется, ну если со временем данная таблица "tbl_voters" может иметь больше миллиона значений, тем самым поиск проверки ипа и статьи может затруднится или же нет?

Автор: ewolf 9.9.2007, 18:46
Сделайте articel_ID индексом, voter_IP - естественно число. Поиск будет проходить очень быстро.

Автор: CTAzz 9.9.2007, 20:21
Спасибо за помощь, только нашел ошибку: 
не 
Код

if( mysql_num_rows() > 0 )


а 
Код

if( mysql_num_rows($result) > 0 )

Автор: Acer 10.9.2007, 12:27
Цитата(ewolf @  9.9.2007,  17:26 Найти цитируемый пост)
+ обратите внимание, что у некоторых пользователей может быть одинаковый IP

К тому же может быть, что у одного юзера могут быть разные IP(динамический).

Автор: ewolf 10.9.2007, 12:43
Цитата(CTAzz @  9.9.2007,  20:21 Найти цитируемый пост)
Спасибо за помощь, только нашел ошибку:

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

Также обрати внимание, что IP может не всегда определяеться или, как уже сказали раньше, быть разным у одного пользователя. Можно добавить доп. проверку, устанавливая куки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)