Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: lastAction v0.2
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
strife
Witam,

Ostatnio pokusiłem się o napisanie klasy która tak jak na forum będzie wyświetlała Ostanią Akcję wykonaną przez użytkowników, oto kod:
  1. <? 
  2. //+----------------------------------------------------- 
  3. //| lastAction v0.2 
  4. //+----------------------------------------------------- 
  5. //| Description: Klasa wyswietla ostatnie wykonane 
  6. //| akcje przez uzytkownikow w ciagu ostatnich x 
  7. //| minut. 
  8. //+----------------------------------------------------- 
  9. //| Instalacja 
  10. //+----------------------------------------------------- 
  11. //| CREATE TABLE `action` ( 
  12. //| `sid` char(255) NOT NULL default '', 
  13. //| `action` char(255) default NULL, 
  14. //| `ip` char(255) default NULL, 
  15. //| `time` int(11) default NULL, 
  16. //|  PRIMARY KEY  (`sid`) 
  17. //| ) 
  18. //| INSERT INTO `action` SET 
  19. //| `sid` = 'maxonline' 
  20. //+----------------------------------------------------- 
  21. //| author: strife <strifee(at)gmail(dot)com> 
  22. //+----------------------------------------------------- 
  23.  
  24.  
  25.   session_start(); 
  26.  
  27.   class lastAction 
  28.   { 
  29.       var $activeTime; 
  30.  
  31.       function dbConnect( $host, $database, $user, $pass ) 
  32.       { 
  33.           mysql_connect( $host, $user, $pass ) or die(); 
  34.           mysql_select_db( $database ) or die(); 
  35.       } 
  36.       function execute( $action) 
  37.       { 
  38.           $this -> clearOld(); 
  39.  
  40.           $uSid = session_id(); 
  41.            
  42.           if ( ! empty ( $uSid ) ) 
  43.           { 
  44.            
  45.               $uIp  = $_SERVER['HTTP_X_FORWARDED_FOR']; 
  46.  
  47.               if (! $uIp) 
  48.               { 
  49.                   $uIp = $_SERVER['REMOTE_ADDR']; 
  50.               } 
  51.  
  52.               $q = mysql_query(&#092;"SELECT * FROM action WHERE sid = '\" . $uSid . \"' \"); 
  53.  
  54.               if ( ! mysql_fetch_array( $q ) ) 
  55.               { 
  56.  
  57.                    mysql_query(&#092;"INSERT 
  58.                                 INTO action 
  59.                                 SET  sid    = '\" . $uSid . \"', 
  60.                                      ip     = '\" . $uIp . \"', 
  61.                                      time   = &#092;" . time() . \", 
  62.                                      action = '\" . $action . \"' 
  63.                                &#092;"); 
  64.               } 
  65.               else 
  66.               { 
  67.  
  68.                   mysql_query(&#092;"UPDATE action 
  69.                                SET ip     = '\" . $uIp . \"', 
  70.                                    time   = &#092;" . time() . \", 
  71.                                    action = '\" . $action . \"' 
  72.                                WHERE sid = '\" . $uSid . \"' 
  73.                               &#092;"); 
  74.               } 
  75.                
  76.           } 
  77.  
  78.  
  79.       } 
  80.       function clearOld() 
  81.       { 
  82.        
  83.           $p = time() - $this -> activeTime; 
  84.  
  85.           mysql_query(&#092;"DELETE 
  86.                        FROM action 
  87.                        WHERE time < &#092;" . $p . \" 
  88.                        AND sid <> 'maxonline' 
  89.                       &#092;"); 
  90.        
  91.       } 
  92.       function online() 
  93.       { 
  94.           $z = mysql_fetch_array( mysql_query(&#092;"SELECT 
  95.                                                COUNT(sid) 
  96.                                                AS online 
  97.                                                FROM action 
  98.                                                WHERE sid <> 'maxonline' 
  99.                                              &#092;") 
  100.                                  ); 
  101.                                   
  102.           return $z['online']; 
  103.  
  104.       } 
  105.       function maxonline() 
  106.       { 
  107.         $p = mysql_fetch_array( mysql_query(&#092;"SELECT sid, time, action 
  108.                                              FROM action 
  109.                                              WHERE sid = 'maxonline' 
  110.                                              &#092;") 
  111.                                ); 
  112.  
  113.         if ( $p ) 
  114.         { 
  115.             $k = $this -> online(); 
  116.  
  117.             if ( $k > $p['time'] ) 
  118.             { 
  119.                 mysql_query(&#092;"UPDATE action 
  120.                              SET time = &#092;" . $k . \", 
  121.                              action = '\" . time() . \"' 
  122.                              WHERE sid = 'maxonline' 
  123.                              &#092;"); 
  124.  
  125.                 $o = mysql_fetch_array( mysql_query(&#092;"SELECT time, sid, action 
  126.                                                      FROM action 
  127.                                                      WHERE sid = 'maxonline' 
  128.                                                    &#092;") 
  129.                                       ); 
  130.  
  131.                 $result = array( $o['time'], (int)$o['action'] ); 
  132.  
  133.                 return $this -> maxonline = $result; 
  134.             } 
  135.             else 
  136.             { 
  137.                 $o = mysql_fetch_array( mysql_query(&#092;"SELECT time, sid, action 
  138.                                                      FROM action 
  139.                                                      WHERE sid = 'maxonline' 
  140.                                                    &#092;") 
  141.                                       ); 
  142.  
  143.                 $result = array( $o['time'], (int)$o['action'] ); 
  144.  
  145.                 return $this -> maxonline = $result; 
  146.  
  147.             } 
  148.  
  149.         } 
  150.  
  151.       } 
  152.       function display() 
  153.       { 
  154.  
  155.           $q = mysql_query(&#092;"SELECT * 
  156.                             FROM action 
  157.                             WHERE sid <> 'maxonline' 
  158.                             ORDER BY time DESC 
  159.                             &#092;"); 
  160.  
  161.           while( $resVar = mysql_fetch_array( $q) ) 
  162.           { 
  163.               $czas = date(&#092;" H:i:s \", $resVar['time']); 
  164.               $data = date(&#092;" d-m-Y \", $resVar['time']); 
  165.  
  166.               $res .= '<tr> 
  167.                         <td>' . $resVar['ip'] . '</td> 
  168.                         <td>' . $resVar['action'] . '</td> 
  169.                         <td>' . $czas . $data . '</td> 
  170.                       </tr>'; 
  171.  
  172.           } 
  173.  
  174.           echo '<style> 
  175.                 html, body{ 
  176.                     margin: 0; 
  177.                     padding: 0; 
  178.                     font-family: Tahoma, Helvetica, sans-serif; 
  179.                 } 
  180.                 table td{ 
  181.                    font-size: 11px; 
  182.                    background: #FAFAFA; 
  183.                    border: 1px solid black; 
  184.                    padding: 4px; 
  185.                  
  186.                 } 
  187.                 .head{ 
  188.                    background: #EAEAEA; 
  189.                    font-weight: bold; 
  190.  
  191.                 } 
  192.            
  193.                 </style> 
  194.                '; 
  195.            
  196.            
  197.           $str = '<table align=\"center\" cellpadding=\"0\" cellspacing=\"2\" width=600> 
  198.                     <tr> 
  199.                       <td class=\"head\">Adres IP</td> 
  200.                       <td class=\"head\">Co robi?</td> 
  201.                       <td class=\"head\">Czas</td> 
  202.                     </tr> 
  203.                     ' . $res . 
  204.                   </table>'; 
  205.                    
  206.           echo $str; 
  207.  
  208.       } 
  209.  
  210.   } 
  211.    
  212.    
  213.   $z = new lastAction; 
  214.   $z -> dbConnect( 'localhost', 'poligon', 'root', 'krasnal' ); 
  215.  
  216.   $z -> activeTime = 30;           // 30 sekund 
  217.  
  218.   $z -> execute( &#092;"Cos tam robi na glownej stronie\" ); 
  219.  
  220.   $z -> display(); 
  221.  
  222. ?>

dbConnect - łączenie z bazą, host, baza, user i hasło.
activeTime - W sekundach podajemy użytkowników aktywnych przez ostatnie $x sekund.
execute - Tutaj ustawiamy jaka akcja została wykonana przez użytkownika, np. można to użyć w ten sposób:
  1. <?php
  2.  
  3. switch ($_GET['action'])
  4. {
  5.   case news:
  6.   $z -> execute('Oglada Newsy');
  7.   break;
  8.   case down:
  9.   $z -> execute('Oglada Download');
  10.   break;
  11.   default:
  12.   $z -> execute('Oglada glowna strone');
  13.   break;
  14. }
  15.  
  16. ?>

display - jest to przykładowa metoda obrazująca działanie skryptu.
online - zwraca ile jest użytkowników online na stronie.
maxonline - zwraca ile użytkowników było najwięcej na stronie.

Koniec. Chciałbym abyście, ocenili to i napisali co poprawić etc. Mam nadzieję że komuś sie to przyda. Pozdrawiam!

Aktualizacja 31.12.2005
Poprawiłem trochę kod, dodałem metodę która pokazuje ile jest użytkowników online w ciągu ostatnich x sekund.

Jeśli ktoś będzie miał problem z przekopiowaniem kodu ze strony załączam też phps http://dev.club.webhost.pl/source/lastAction.phps

Aktualizacja 05.01.2006
Cytat(http://blog.club.webhost.pl/lastaction-v02/)
Wprowadzone zostały dosyć istotne zmiany w stosunku do poprzedniej wersji, a mianowicie przy pustej sesji nie jest tworzony ani update'owany rekord.

Co więcej w klasie powstała nowa metoda, która pokazuje ile użytkowników najwięcej było online, pokazana jest data i liczba.

Efekty mojej pracy można zobaczyć http://poligon.club.webhost.pl/lastAction/, natomiast nowe źródło nowej wersji skryptu można zobaczyć pod tym adresem: http://dev.club.webhost.pl/source/lastAction-0-2.phps


Pozdrawiam!
SongoQ
  1. <?php
  2.  
  3. switch ($_GET['action'])
  4. {
  5. case news:
  6. $session -> update('Oglada Newsy');
  7. break;
  8. case down:
  9. $session -> update('Oglada Download');
  10. break;
  11. default:
  12. $session -> update('Oglada glowna strone');
  13. break;
  14. }
  15.  
  16. ?>


Przeniesc do klasy, + rozszerzeyc o klasy do obslugi baz danych, lub podpic jakas gotowa.
AxZx
witam

do czego taka klase mozna uzyc?

do tego zeby ktos siedzial i ogladal ile osob siedzi np w dziale download w danej chwili czy jak ?

bo nie rozumiem
Spirit86
dla zaspokojenia ciekawości np. :]
GrayHat
po lekkim przerobieniu moze posluzyc jako np wyswietlanie ilosci osob online na danej podstronie.

  1. <?
  2. $session -> update($_GET['id']);
  3. $now = $time();
  4. $query = &#092;"SELECT r_ip FROM action WHERE `r_time` > \".$now.\"-300', `r_where` = '\".$_GET['id'].\"'\";
  5. $db->query($query);
  6. echo &#092;"Artykul przeglada aktualnie \".$db->num_rows().\" osob.\";
  7. ?>


kod moze miec literowki bo pisalem z pamieci
konstruktor
ad.1: Czy to działa?
strife
Cytat(konstruktor @ 2005-12-31 12:39:06)
ad.1: Czy to działa?

http://poligon.club.webhost.pl/lastAction/ ? Co masz na myśli, nie działa Ci ten skrypt, że tak piszesz ? blink.gif

@SongoQ - To miał być tylko przykład użycia, nie ma potrzeby dodowania tego do klasy, natomiast jeśli chodzi o rozbudowanie o sterownik do bazy to nie widzę potrzeby przy tak małym skrypcie ładować tutaj coś takiego, jeśli ktoś się uprze może sobie przecież ten skrypt przerobić jak mu się spodoba i dodać to i tamto. Jednak dziękuje za opinie smile.gif

Pozdrawiam!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.