« 1 2 »
Autor Zpráva
pito
Profil
Zdravím,
Mám tenhle script(počitadlo), který aznamenává ip za 24h. Nevím jak udělat aby to zaznamenavalo co každou půl hodinu.

navstevnost.php

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $explode_ip = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = $explode_ip[0];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
};
/* Jednodenní kontrola pro menší zátěž serveru */
if($_SESSION['navstevnost'] != date("d-n-y")) {
  /* Byl dnes už započítán? */
  $zadnes = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS pocet FROM poc_host WHERE ip='$ip' AND datum='".date("Y-m-d")."';"));
  if($zadnes['pocet'] == 0) {
    /* Ne? Tak ho započítáme */
    $byluz = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS pocet FROM poc_host WHERE ip='$ip';"));
    if($byluz['pocet'] == 0) {
      $pocitat = true;
      mysql_query("INSERT INTO poc_host VALUES('".$ip."', '".date("Y-m-d")."')");
    } else {
      $pocitat = true;
      mysql_query("UPDATE poc_host SET datum='".date("Y-m-d")."' WHERE ip='".$ip."'");
    }
    if($pocitat) {
      /* Návštěvnost celkem */
      if(mysql_num_rows(mysql_query("SELECT * FROM poc_celkem")) != 0) {
        $celkem = mysql_result(mysql_query("SELECT * FROM poc_celkem"), 0) + 1;
        mysql_query("UPDATE poc_celkem SET pocet=pocet+1");
      } else {
        $celkem = 1;
        mysql_query("INSERT INTO poc_celkem VALUES(1)");
      }
      /* Měsíční návštěvnost */
      $aktmesic = mysql_fetch_object(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".date("Y-m-00")."'"));
      $mesic = $aktmesic->pocet+1;
      if($mesic == 1) {
        mysql_query("INSERT INTO poc_mesic VALUES('".date("Y-m-00")."', 1)");
      } else {
        mysql_query("UPDATE poc_mesic SET pocet=pocet+1 WHERE mesic='".date("Y-m-00")."'");
      }
      /* Denní návštěvnost */
      $zaznam = mysql_fetch_object(mysql_query("SELECT * FROM poc_dnes WHERE datum='".date("Y-m-d")."'"));
      $dnes = $zaznam->pocet+1;
      if($dnes == 1) {
        mysql_query("INSERT INTO poc_dnes VALUES('".date("Y-m-d")."', 1)");
      } else {
        mysql_query("UPDATE poc_dnes SET pocet=pocet+1 WHERE datum='".date("Y-m-d")."'");
      }
    }
    $_SESSION['navstevnost'] = date("d-n-y");
  } else {
    $_SESSION['navstevnost'] = date("d-n-y");
  }
}


tohle asi nebude třeba,ale pro jistotu to tu taky dám

statistika.php

$celkem = mysql_fetch_array(mysql_query("SELECT * FROM poc_celkem;"));
$poc_celkem = $celkem['pocet'];
/* Unikátní IP */
$celkem_unikat = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS pocet FROM poc_host"));
$celkem_unikat = $celkem_unikat['pocet'];
/* Za měsíc */
$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE DATE_FORMAT(mesic,'%Y-%m')= DATE_FORMAT(NOW(),'%Y-%m');"));
$poc_mesic = $mesic['pocet'];
switch (date("n")) {
  case 1 : $mes = "leden"; break;
  case 2 : $mes = "únor"; break;
  case 3 : $mes = "březen"; break;
  case 4 : $mes = "duben"; break;
  case 5 : $mes = "květen"; break;
  case 6 : $mes = "červen"; break;
  case 7 : $mes = "červenec"; break;
  case 8 : $mes = "srpen"; break;
  case 9 : $mes = "září"; break;
  case 10 : $mes = "říjen"; break;
  case 11 : $mes = "listopad"; break;
  case 12 : $mes = "prosinec"; break;
}
/* Minulý měsíc */
$minuly_mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE DATE_FORMAT(mesic,'%Y-%m')= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 MONTH),'%Y-%m');"));
$minuly_mesic = $minuly_mesic['pocet'];
/* Tento týden */
if(date("l") == "Monday")   {$denvtydnu = -1; $tydodecist = -7;}
if(date("l") == "Tuesday")  {$denvtydnu = -2; $tydodecist = -8;}
if(date("l") == "Wednesday"){$denvtydnu = -3; $tydodecist = -9;}
if(date("l") == "Thursday") {$denvtydnu = -4; $tydodecist = -10;}
if(date("l") == "Friday")   {$denvtydnu = -5; $tydodecist = -11;}
if(date("l") == "Saturday") {$denvtydnu = -6; $tydodecist = -12;}
if(date("l") == "Sunday")   {$denvtydnu = -7; $tydodecist = -13;}
$tyden = mysql_fetch_array(mysql_query("SELECT SUM(pocet) AS pocet FROM poc_dnes WHERE datum > ADDDATE(now(), '".$denvtydnu."')"));
$poc_tyden = $tyden['pocet'];
/* Minulý týden */
$minulytyden = mysql_fetch_array(mysql_query("SELECT SUM(pocet) AS pocet FROM poc_dnes WHERE datum BETWEEN ADDDATE(now(), '".$tydodecist."') and ADDDATE(now(), '".$denvtydnu."')"));
$minulytyden = $minulytyden['pocet'];
/* Dnes */
$dnes = mysql_fetch_array(mysql_query("SELECT * FROM poc_dnes WHERE DATE_FORMAT(datum,'%Y-%m-%d')= DATE_FORMAT(NOW(),'%Y-%m-%d');"));
$poc_dnes = $dnes['pocet'];
/* Průměrně za den */
$prumer_den = mysql_fetch_array(mysql_query("SELECT avg(pocet) AS prumer FROM poc_dnes;"));
$denni_prumer = @round($prumer_den['prumer']);
?>

Celkem: <strong><?=$poc_celkem?></strong><br /> Unikátní IP: <strong><?=$celkem_unikat?></strong><br /> Za <?=$mes?>: <strong><?=$poc_mesic?></strong><br /> Minulý měsic: <strong><?=$minuly_mesic?></strong><br /> Tento týden: <strong><?=$poc_tyden?></strong><br /> Minulý týden: <strong><?=$minulytyden?></strong><br /> Dnes: <strong><?=$poc_dnes?></strong><br /> Průměrně za den: <strong><?=$denni_prumer?></strong>



předem všem díky.
Jozin
Profil
Ahoj,

začnu odspodu, co změnit:

řádek 46 a 48 jsou stejné. Vydělej je z obou větví (if i else), prostě to zapiš pod tu podmínku a přepiš na toto:
<?php
$_SESSION['navstevnost'] = time();

dále podmínka na řádku 7 bude vypadat takto:
<?php
if( $_SESSION['navstevnost'] <= time() - (30 * 60) ) {} //30 minut * 60 vteřin


Jozin.
pito
Profil
čili tak jestli jsem to pochopil:

      }
    }
    $_SESSION['navstevnost'] = date("d-n-y");
  } else {
    $_SESSION['navstevnost'] = time();
  }
}



a potom 7 řádek:
/* Jednodenní kontrola pro menší zátěž serveru */
if( $_SESSION['navstevnost'] <= time() - (30 * 60) ) {} //30 minut * 60 vteřin {
  /* Byl dnes už započítán? */
Keeehi
Profil
pito:
Začít by jsi měl tím, že si upravíš databázi. Všechno budeš ukládat jen do jedné tabulky.
Ty updaty v těch else větvích nechápu. Úplně detailně jsem to nezkoumal, ale přijdou mi tam zbytečné.

Když to pak upravíš, tak vkládání lidí po 30 minutách uděláš takto:
$result = mysql_query("SELECT 1 FROM tabulka WHERE ip = '$ip' AND casova_znacka > NOW() - INTERVAL 30 MINUTE;"));
if(mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO tabulka VALUES('$ip', NOW())");

A teď ty statisky:
SELECT COUNT(1) FROM tabulka WHERE casova_znacka > NOW() - INTERVAL 1 MONTH; -- měsíční
SELECT COUNT(1) FROM tabulka WHERE casova_znacka > NOW() - INTERVAL 1 WEEK; -- týdenní
SELECT COUNT(1) FROM tabulka WHERE casova_znacka > NOW() - INTERVAL 1 DAY; -- denní

Jenom upozornění, statistiku to počítá jako celý den, týden, měsíc. Jinak řečeno, že to nepočítá dnešní statistiku jako kolik lidí přišlo od dnešní půlnoci, ale kolik lidí přišlo během posledních 24 hodin. Pokud by jsi to chtěl počítat tak, že vždy o půlnoci tam bude nula, tak by to bylo potřeba upravit.
pito
Profil
Keeehi:
Chtěl bych aby to bylo od půlnoci počitání znovu.
Nevím přesně jak nastavit tu DB. Ty tabulky co mám dát dohromady?
Jo a ještě ta casova_znacka znamena, že si tam můžu dát př. DAY,WEEK nebo MONTH?
Keeehi
Profil
casova_znacka je název sloupce. Tento sloupec je typu DATETIME.

pito:
Nevím přesně jak nastavit tu DB. Ty tabulky co mám dát dohromady?
Lepší bude vytvořit si tabulku novou.

SELECT COUNT(1) FROM tabulka WHERE casova_znacka > CURDATE(); -- denní
Týdenní a měsíční upravím později, teď na to nemám čas.
pito
Profil
Keeehi:
jsem trochu mimo
pito
Profil
Jozin:
zkoušel jsem to,ale nějak mi to nefunguje
Keeehi
Profil
pito:
jsem trochu mimo
To jsi mi toho tedy řekl. Takže čemu nerozumíš, nebo co ti nejde udělat?
pito
Profil
To co jsem psal uplně na začátku tak mám nechat tak a udělat to celé znovu tak jak píšeš ty jiné scripty?
Prvně tedy ta tabulka v DB:

Bude nějak takhle?

CREATE TABLE pocitadlo (
datum date NOT NULL default '0000-00-00',
ip int(11) NOT NULL,
PRIMARY KEY (datum)
);

potom příkaz do DB

<? php
include("db.php");
$ip = $_SERVER['REMOTE_ADDR'];
$result = mysql_query("SELECT 1 FROM tabulka WHERE ip = '$ip' AND casova_znacka > NOW() - INTERVAL 30 MINUTE;"));
if(mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO tabulka VALUES('$ip', NOW())");
    ?>


tak?
Keeehi
Profil
CREATE TABLE pocitadlo ( 
datum datetime NOT NULL, 
ip varchar(41) NOT NULL
);

<?php
include("db.php");
$ip = $_SERVER['REMOTE_ADDR'];
$result = mysql_query("SELECT 1 FROM pocitadlo WHERE ip = '$ip' AND datum > NOW() - INTERVAL 30 MINUTE;");
if(mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO pocitadlo (ip, datum) VALUES('$ip', NOW())");

$navstevnost_mesicni = mysql_result(mysql_query("SELECT COUNT(1) FROM pocitadlo WHERE datum > CURDATE() - DAYOFMONTH(CURDATE())+1;"),0);
$navstevnost_tydenni = mysql_result(mysql_query("SELECT COUNT(1) FROM pocitadlo WHERE datum > CURDATE() - DAYOFWEEK(CURDATE())+2;"),0);
$navstevnost_denni = mysql_result(mysql_query("SELECT COUNT(1) FROM pocitadlo WHERE datum > CURDATE();"),0);
echo "Měsíční návštěvnost je: $navstevnost_mesicni<br>\n";
echo "Týdenní návštěvnost je: $navstevnost_tydenni<br>\n";
echo "Dnešní návštěvnost je: $navstevnost_denni<br>\n";
?>
pito
Profil
chyba: Parse error: syntax error, neočekávané T_VARIABLE in / home / www / stolarskeprace.cz / www / pocitadlo.php on line 4

tedy něco tady:
$result = mysql_query("SELECT 1 FROM pocitadlo WHERE ip = '$ip' AND datum > NOW() - INTERVAL 30 MINUTE;"));
Keeehi
Profil
pito:
Na konci, jak tam jsou dvě závorky, tak tam má být jen jedna.
pito
Profil
Keeehi:
Moc Ti děkuji. Ještě bych se chtěl zeptat kdybych chtěl udělat takový výpis.

Den | počet
1.5. 25
2.5. 31
3.5. 12
...atd.

něco jsem zkoušel ale,nefunguje nevím jak sloučít ty datumy dohromady jako jeden.
Tedy jak je v tabulce
ip,datum
xxx.xxx.xx.xx 2005-05-19
xxx.xxx.xx.xx 2005-05-19
xxx.xxx.xx.xx 2005-05-20

19.5. 2
20.5. 1

tady je script který jsem zkoušel.

<?
require "config.php";	
$vyber = MySQL_Query("SELECT * ,DATE_FORMAT(datum,'%d.%m.') as datum FROM pocitadlo order by datum")
or die(mysql_error()); 

$hlavicky = $radky = '';
while ($zaznam2=MySQL_Fetch_Array($vyber)): 
  $hlavicky .= "<th scope='col'>$zaznam2[datum]</th>";
  $radky .= "<td>$zaznam2[ip]</td>";
endwhile;

echo "
  <table class='stats' rel='line' cellpadding='0' cellspacing='0' width='100%'>
  <thead><tr><td>&nbsp;</td>$hlavicky</tr></thead>
  <tbody><tr><th>počet</th>$radky</tr></tbody>
</table>";
?>
pito
Profil
to je divne každých 10min. mi naskakuje v DB furt a ta jedna ip adresa,ale neni to moje adresa. Nemohlo se to nějak poblaznit? Pochybuji že by nějaký uživatel byl 24h každých 10min. na webu.
Keeehi
Profil
pito:
Jak to máme vědět? Kdyby jsi ji sem alespoň napsal, ale takto se máme chytit čeho? Udělej z databáze kompletní výpis toho co máš o dané IP, vytvoř z toho tabulku a někam ji umísti, ať se ti na to může někdo podívat.
Dále můžeš pro tuto speciální IP udělat výjimku, a ukládat její každou návštěvu. Tak dostaneš lepší představu o tom, kdo/co by to mohlo být.
pito
Profil
šlo by udělat aby nezapisovalo tu ip do db
Keeehi
Profil
pito:
To by samozřejmě šlo, avšak teď by jsi měl zapisovat pokaždé, získat o ní co nejvíce informací. A pak se rozhodnout co s ní.
pito
Profil
[#14] pito
nevíš prosím tě jak udělám ten výpis?
Keeehi
Profil
pito:
Použij něco na administraci databází. Něco by mělo být připraveno už na hostingu, nebo můžeš použít třeba adminer.
pito
Profil
ja myslel,ale výpis na tohle [#14] pito
Keeehi
Profil
Aha.

Zkus toto:
<?
require "config.php";    
$vyber = MySQL_Query("SELECT count(*) as pocet ,DATE_FORMAT(datum,'%d.%m.') as datum FROM pocitadlo GROUP BY datum ORDER BY datum") or die(mysql_error()); 

$hlavicky = $radky = '';
while ($zaznam2=MySQL_Fetch_Array($vyber)){
  $hlavicky .= "<th scope='col'>$zaznam2[datum]</th>";
  $radky .= "<td>$zaznam2[pocet]</td>";
}

echo "
  <table class='stats' rel='line' cellpadding='0' cellspacing='0' width='100%'>
  <thead><tr><td>&nbsp;</td>$hlavicky</tr></thead>
  <tbody><tr><th>počet</th>$radky</tr></tbody>
</table>";
?>
pito
Profil
to neni dobre vypise to vsechny ty datumy a to nechci.Neco tak aby to delalo:

Tabulka DB
ip,datum
xxx.xxx.xx.xx 2005-05-19
xxx.xxx.xx.xx 2005-05-19
xxx.xxx.xx.xx 2005-05-20

vypis
19.5. 2
20.5. 1
pito
Profil
moje icq 293016745 :)
Keeehi
Profil
pito:
GROUP BY datum
vyměnit za
GROUP BY DATE_FORMAT(datum,'%Y%d%m')
Pak už by to snad mělo jít.

Zapomněl jsem, že sloupec je datetime (doufám, že jste to změnil). Částečně za to můžete vy, jelikož záznamy v DB nejsou xxx.xxx.xx.xx 2005-05-19 ale xxx.xxx.xx.xx 2005-05-19 12:45:14
pito
Profil
ok funkcni. Nějak,ale přestalo fungovat počitání za týden. (viz. na webu Odkaz) to druhé pod Toplistem
Keeehi
Profil
Asi takto:
$navstevnost_tydenni = mysql_result(mysql_query("SELECT COUNT(1) FROM pocitadlo WHERE datum > CURDATE() - (DAYOFWEEK(CURDATE())+5)%7;"),0);
Pokud tam náhodou není pokaženého něco jiného nebo jsem to nepokazil teď já.
pito
Profil
Ještě jedna věc kdybych chtěl vypsat měsíce tak to udělám podobně asi jak jsem psál dřív [#1] pito u statistika.php že?

tedy:
Tabulka DB
ip,datum
xxx.xxx.xx.xx 2005-05-19 11:45:14
xxx.xxx.xx.xx 2005-05-19 12:40:17
.......atd.
xxx.xxx.xx.xx 2005-06-03 09:45:12
......atd.

vypis
Květen 152
červen 178
.....
Keeehi
Profil
Ano:
Prostě z toho vynecháte dny:
GROUP BY DATE_FORMAT(datum,'%Y%m')

U roků byste vynechal dny a měsíce.
pito
Profil
to je asi špatně :) :(

<?
require "config.php";
$vyber = MySQL_Query("SELECT count(*) as pocet ,DATE_FORMAT(datum,'%m') as datum FROM pocitadlo GROUP BY DATE_FORMAT(datum,'%Y%m') ORDER BY datum") or die(mysql_error());
$pocitadlo = $datum['pocet'];
switch (date("m")) {
case 1 : $mes = "leden"; break;
case 2 : $mes = "únor"; break;
case 3 : $mes = "březen"; break;
case 4 : $mes = "duben"; break;
case 5 : $mes = "květen"; break;
case 6 : $mes = "červen"; break;
case 7 : $mes = "červenec"; break;
case 8 : $mes = "srpen"; break;
case 9 : $mes = "září"; break;
case 10 : $mes = "říjen"; break;
case 11 : $mes = "listopad"; break;
case 12 : $mes = "prosinec"; break;
}


$hlavicky = $radky = '';
while ($zaznam2=MySQL_Fetch_Array($vyber)){
$hlavicky .= "<th scope='col'>$zaznam2[datum]</th>";
$radky .= "<td>$zaznam2[pocet]</td>";
}

echo "
<table class='stats' rel='line' cellpadding='0' cellspacing='0' width='100%'>
<thead><tr><td>&nbsp;</td>$hlavicky</tr></thead>
<tbody><tr><th>počet</th>$radky</tr></tbody>
</table>";
?>
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0