Как недопустить запуск пхп скрипта дважды?

Discussion in 'PHP' started by DesignerMix, 12 Mar 2007.

  1. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    Как неопустить запуск пхп скрипта дважды?

    Мне просто позарез необходим кусочек кода недопускающий запуск одного и итогоже скрипта (в моём случае опроса) на одном и томже компьютере дважды, или пусть запускается, но юзеру вместо вопросов выведется строчка "Хрен тебе".

    Ps:Просто у меня есть такая проблема: юзверь не должен одновременно быть на одном и том-же сайте, просто там стоит опрос и опрашиваемый как правило узнаёт правильный ответ на вопрос просто открыв тотже сайт и тыкнув на ответ находит правильный вариант, а затем закрывает второе окно и вставляет в первое верный ответ.
     
  2. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    кукисы и запоминание ip. И вообще что эта тема делает в этом разделе? Перенес в PHP.
     
    1 person likes this.
  3. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    А можно поконкретнее. Мнебы кусочек кода по сравнению куков, ip, сессии и выводе определённой странички...
     
  4. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    а почему бы тебе самому этим незаняться? Есть отличный сайт по теме. http://php.su русский. Там все хорошо описано. Здесь помогают решать проблемы а не решают их за тебя.
     
  5. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Code:
    <?php
      ///////////////////////////////////////////////////
      // Web-приложения для книги "Профессиональный сайт на PHP 5"
      // 2004 (C) IT-студия SoftTime (http://www.softtime.ru)
      // Симдянов И.В. (simdyanov@softtime.ru)
      // Голышев С.В. (glsv@softtime.ru)
      // Кузнецов М.В. (kuznetsov@softtime.ru)
      ///////////////////////////////////////////////////
    
      // Устанавливаем соединение с базой данных
      include "../admin/config.php";
      $title="Голосование";      
      include "../util/top.php";  
      ?>
      <h1 class=artnamepage>Голосование</h1>   
      <?
      // Учитываем голос
      if(!empty($_POST['id_answer']))
      {
        $id_answer = $_POST['id_answer'];
        // Получаем ip-адрес посетителя
        // Это необходимо для реализации защиты от накруток
        $forward = getenv(HTTP_X_FORWARDED_FOR);
        $ip = urldecode(getenv(HTTP_CLIENTIP));
        if (($forward != NULL)&&($forward != $REMOTE_ADDR)) $ip = $ip."/".$forward;
        // Проверяем наличие IP-адреса посетителя в таблице poll_ip
        // В ней содержатся IP-адреса последних проголосовавших посетителей
        $isip = "SELECT * FROM poll_ip 
                 WHERE ip = '$ip' 
                 AND puttime > now() - interval '2' minute";
        $ipresult = mysql_query($isip);
        // Удаляем устаревшие записи в таблице poll_ip
        // (IP-адреса посетителей голосовавших более 2 минут назад)
        $delip = "DELETE FROM poll_ip 
                  WHERE puttime < now() - interval '2' minute";
        mysql_query($delip);
        // Проверка на ошибки при выполнении запроса 
        if($ipresult)
        {
          // Если результат запроса не содержит записей,
          // то посетитель с данных ip-адресом не учавствовал в голосовании
          // за последние 2 минуты и его голос должен быть засчитан 
          if(mysql_num_rows($ipresult)<1)
          {
            // Заносим ip-адрес посетителя в таблицу poll_ip
            mysql_query("INSERT INTO poll_ip VALUES(0, '$ip', now())");
            // Заносим результат голосования посетителя в таблицу answer
            $query = "SELECT hit FROM answer 
                      WHERE id_answer = $id_answer";
            $num = mysql_query($query);
            if($num)
            {
              $number = mysql_fetch_array($num);
              $query = "UPDATE answer SET hit = ".($number['hit']+1)." 
                        WHERE id_answer = $id_answer";
              mysql_query($query);
            } else puterror("Ошибка при обращении к блоку голосования");
          }
          else
          {
            echo "<p class=msg><b>Вы уже голосовали за последние 2 минуты. Ваше голосование не будет засчитано.</b></p>";
          }
        }
      }
      else
      {
        echo "<p class=msg><b>Вы не выбрали вариант ответа</b></p>";
      }
      // Отображаем результаты голосования
      $query = "SELECT * FROM poll 
                WHERE archive = 'active' AND hide = 'show'";
      $pol = mysql_query($query);
      if ($pol)
      {
        $poll = mysql_fetch_array($pol);
        // Отображаем вопрос голосования
        echo "<h3 class=artzag>".$poll['name']."</h3>";
        // Просматриваем ответы на вопрос голосования 
        // и статистику голосования по ним
        $query = "SELECT * FROM answer 
                  WHERE id_poll = ".$poll['id_poll']." 
                  ORDER BY pos";
        // Подсчитываем сумму всех проголосовавших в текущем голосовании
        $total = "SELECT SUM(hit) FROM answer 
                  WHERE id_poll = ".$poll['id_poll'];
        $ans = mysql_query($query);
        $tot = mysql_query($total);
        if($ans && $tot)
        {
          $totl = mysql_fetch_array($tot);
          $totalhits = $totl['SUM(hit)'];
          if($totalhits == 0) $totalhits = 1;
          // Выводим заголовок таблицы с результатами голосования
          echo "<table border=1>
      	       <tr><td>Ответ</td><td>Проголосовало</td><td>%</td></tr>";
          while($answer = mysql_fetch_array($ans))
          {
            // Выводим результаты голосования
            echo "<tr>
                    <td>".$answer['name']."</td>
                    <td>".$answer['hit']."</td>
                    <td>".sprintf("%01.1f%s", $answer['hit']/$totalhits*100,'%')."</td>
                  </tr>";
          }
          echo "</table>";
          echo "Общее число проголосовавших составляет: ".$totl['SUM(hit)']."<br><br>";
          // Ссылка на просмотр архива
          echo "<a href=archive.php>Посмотреть архив голосований</a><br>";
        } else puterror("Ошибка при обращении к блоку голосования");
      } else puterror("Ошибка при обращении к блоку голосования");
    include "../util/bottom.php";   
    ?>
    
     
  6. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    Код выше это работа c ip. Всмысле это голосование которое разворотишь и получиться код для работы с ip адресом как в твоем случае.
     
  7. DesignerMix

    DesignerMix Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    35
    Likes Received:
    11
    Reputations:
    5
    И за сайт и за код спасибо, многое почерпнул!