прикрутить проверку по ip к кнопке

Тема в разделе "PHP", создана пользователем zavu, 19 июл 2011.

Модераторы: latteo
  1. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    В общем, есть простейшая кнопка. Нажал ее юзер, в бд посчитался +1. Нужно, чтобы нажимать могли ее только раз в сутки, больше ничего от нее не надо. Все примеры, которые находила в гугле - это голосования и прочие рейтинги здоровые, с +/-, а мне бы чего попроще, без наворотов =(

    Вот кнопка:

    Код:
    <form method="post" action=""> <input type="submit" name="flover" value="Цветок"> </form>
    
    if(isset($_POST['flover'])){
         $sql = "UPDATE `characters` SET `flover`=`flover` + 1 WHERE id = $pps";
       mysql_query($sql,$db);
    }
    function click(){
       $sql = "SELECT flover FROM characters WHERE id = $pps LIMIT 1";
       $res = mysql_query($sql,$db);
       $mas = mysql_fetch_array($res);
       return $mas['flover'];
    }
     
  2. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Проверку по айпишнику замутить можно конечно
    PHP:
    //вычисляем ip
     
    if (!empty($_SERVER['HTTP_CLIENT_IP']))
     {
       
    $sip=$_SERVER['HTTP_CLIENT_IP'];
     }
     elseif (!empty(
    $_SERVER['HTTP_X_FORWARDED_FOR']))
     {
      
    $sip=$_SERVER['HTTP_X_FORWARDED_FOR'];
     }
     else
     {
       
    $sip=$_SERVER['REMOTE_ADDR'];
     }
    но есть прокси=>прокси=>прокси..., анонимные прокси и т.д. и это может стать камнем преткновения... Возможно лучшим вариантом будет оставлять у клиента куки со сроком действия до следующих суток... И при наличии такого куки кнопочку деактивировать... Это тоже не панацея (куки можно потереть или зайти с нескольких браузеров) но все же...
    Как вариант можно совметить проверку на куки и айпишник, но это малость геморройный процесс...
     
  3. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    А вот этот кусок с айпи куда вставить? И нужна будет табличка БД для него? Если можно, для чайников пояснения =)))

    С куками был вот такой примерно вариант:

    Код:
    if (!isset($_COOKIE['cookie']))
    {
     echo "<input type="submit" name="flover" value="Цветок">";
    }
    Но чета как-то оно не смотрится вообще =/
     
  4. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    На самом деле смысл не в том, смотрится или нет, а работает или нет и как работает!
    При варианте с куки затраты на кодинг минимальные(указанный тобой код и все...) А вот при проверке на айпишник нужно:
    1) Определить айпишник (код который привёл я или альтернативная функция)
    2) Проверить есть ли такой айпишник в базе
    3) Если есть такой айпишник, то когда с него последний раз кликали по кнопке
    4) Если сегодня с него не кликали или айпишника в базе нет, то показываем кнопку
    5) После клика по кнопке, обрабатываем данные формы и записываем айпишник и время клика в отдельную таблицу базы (опять же если такой айпишник в базе есть, то только обновляем время, а если такого нет, то делаем полностью новую запись)
    Все это отдельные и порой громоздкие скрипты + привязка к базе данных... Вот и определись для начала что в данном случае наиболее целесообразно. А дальше будет видно...
     
  5. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    Куки, конечно, проще. Но в случае явной накрутки никак не отследить, откуда там чего взялось =/
    А если взять средний вариант? Проверку поставить по кукам, но одновременно просто записывать в БД айпишник того, кто жал кнопку в профиле? На мелкие накрутки мне все равно, зато весь топ я всегда смогу проверить на предмет - это куча народа зашла, или один айпишник куку стирал?
    При таком пассивном отслеживании вряд ли много народа сообразят одновременно и куку чистить и проксить. Ну а кто захочет, и так все что угодно обойдет =)
    Таким образом, реализация будет примерно такая:

    1. проверить куку.
    2. если кука позволила голосовать, взять айпишник.
    3. занести его в БД (айди того, за кого голосовали/ айпи/ дата голосования).

    Как такой вариант? И как его сделать?
     
  6. betatest

    betatest

    Регистр.:
    3 дек 2007
    Сообщения:
    517
    Симпатии:
    127
    самы простой и надежный способ на данный момент
    http://fairvote.ru/
     
  7. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    betatest - исключено. Никаких посторонних ссылок на сайты и левых сервисов. Слава богу, выделенный сервер мне это позволяет.
     
  8. betatest

    betatest

    Регистр.:
    3 дек 2007
    Сообщения:
    517
    Симпатии:
    127
  9. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    Вы, видимо, плохо прочитали первый пост.
    Я гуглила эти ваши ссылки, и многие другие.
    Мне не нужны голосования, мне нужна одна единственная функция на определение айпи и занесении его в бд применительно к моей простой кнопке.
    "Выдрать" из готовых голосований эту маленькую часть у меня не получается, поэтому я и пишу здесь как бы...
     
  10. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    В файл который генерит форму вставить ваше:
    PHP:
    if (!isset($_COOKIE['cookie']))
    {
     echo 
    "<form method='POST' action='file.php'><input type="submit" name="flover" value="Цветок"> ...... </form>";
     }
    В файл, обрабатывающий форму, вставить:
    PHP:
    if($_POST['flover']){
    //вычисляем ip
    if (!empty($_SERVER['HTTP_CLIENT_IP']))
     {
       
    $sip=$_SERVER['HTTP_CLIENT_IP'];
     }
     elseif (!empty(
    $_SERVER['HTTP_X_FORWARDED_FOR']))
     {
      
    $sip=$_SERVER['HTTP_X_FORWARDED_FOR'];
     }
     else
     {
       
    $sip=$_SERVER['REMOTE_ADDR'];
     }  
    //пишем лог кликов в БД
    mysql_query("INSERT INTO ip_table SET `ip`='".$sip."', `time`='".time()."', `id_vote`='".$_POST['id_vote']."'");
    //+ блок подсчета количества кликов
    }
     
    zavu нравится это.