Missä vika kun ilmoittaa virhe koodin?
Warning: fread() [function.fread]: Length parameter must be greater than 0 in /home/kaupu399/public_html/kavijat/laskuri.php on line 119
________________________________
<?php ################################################# # # # MVnetin kävijälaskuri # # http://www.mvnet.fi # # Versio: 2006-08-30 # # # ################################################# /* Määritellään aika minuutteina, jonka jälkeen "estetyt IP-osoitteet" -tiedosto nollataan. Vakiona arvo on yksi tunti eli 60 minuuttia. Jos siis saman IP-osoitteen omaava kävijä tulee uudestaan siville, ei häntä noteerata uudeksi kävijäksi, koska hänen IP-osoitteensa on "estetyt IP-osoitteet" -tiedostossas. Jos hän tulee uudestaan tunti sen jälkeen kun "estetyt IP-osoitteet" -tiedosto on viimeksi nollattu, noteerataan hänet uudeksi kävijäksi ja samalla "estetyt IP-osoitteet"-tiedosto nollataan.*/ $vaihtoMinuutteina = 60; /* Määritellään se tiedostokoko kilotavuina, jolloin halutaan kavijatiedot.php-tiedoston nollaantuvan. Jossain vaiheessa tämän tiedoston koko kasvaa niin suureksi, että se ylittää alla olevan rajan (oletus 500), jolloin tiedosto automaattisesti tyhjennetään. */ $kavijatiedotNollaus = 500; /* Määritellään luettelo taulukkona, johon luetteloidaan ne host-osoitteiden osat, joita ei lasketa uusiksi kävijöiksi. Jos kävijän host-osoitteessa on taulukossa mainittu tekstinpätkä, ei sitä lasketa uudeksi kävijäksi. Tämä taulukko on tarkoitettu siihen, että netin hakukoneet kuten Google eivät kasvattaisi virheellisesti kävijämääriä. Voit estää hakukoneen kasvattamasta kävijämäärää lisäämällä osan sen host-osoitteesta tähän listaan. Host-osoitteen osan pitää olla sellainen, että hakubotti tunnistetaan siitä aina. Esim. Googlen hakubotin host-osoite voi olla esim. crawl-66-249-65-205.googlebot.com, mutta tätä koko host-osoitetta ei laiteta listaan, koska tämä yksilöi vain yhden Googlen hakubotin (ja näitä Googlella on useita). Hakubotin host-osoitteen näkee esim. kävijätiedot-luettelosta etsimällä sanoja: bot, search, crawl. */ $eiLasketa = array("googlebot.com", "msnbot.msn.com", "inktomisearch.com"); /* Funktio, joka tarkistaa, onko parametrina annettu host-osoite hakurobotin osoite, jotka on määritelty yllä esitetyssä taulukossa, joka annetaan funktion toisena parametrina. */ function onHakurobotti($verrattavaHost, $array) { $onBotti = false; for ($i=0; $i<count($array); $i++) { if (eregi($array[$i], $verrattavaHost)) { $onBotti = true; break; } } return $onBotti; } /* Funktio, joka lukee parametrina annetun tiedoston sisällön ja palauttaa sen. */ function lueSisalto ($tiedosto) { return file_get_contents($tiedosto); } /* Funktio, joka lisää parametrina annettun tiedoston loppuun parametrina annetun lisättävän sisällön. */ function lisaaTiedostonLoppuun ($tiedosto, $lisattava) { ignore_user_abort(true); $fd = fopen ($tiedosto, "a"); /* Tiedostoon voi kirjoittaa vain, jos sen saa lukittua. Näin vältytään (toivottavasti) virheistä, joita tulisi, jos useampi kuin yksi yrittäisi kirjoittaa tiedostoon samaan aikaan. */ if (flock($fd, LOCK_EX)) { fwrite($fd, $lisattava); flock($fd, LOCK_UN); } fclose($fd); ignore_user_abort(false); } /* Funktio, joka ylikirjoittaa parametrina annetun tiedoston parametrina annetulla kirjoitettavalla sisällöllä. */ function ylikirjoitaSisalto ($tiedosto, $kirjoitettava) { ignore_user_abort(true); $fd = fopen ($tiedosto, "w"); fwrite($fd, $kirjoitettava); fclose($fd); ignore_user_abort(false); } /* Funktio, joka kasvattaa parametrina annetun tiedoston sisältöä yhdellä. Eli funktio ensin lukee tiedoston sisällön ja sitten lisää sisältöön 1:n ja ylikirjoittaa tiedoston sisällön tällä uudella arvolla. Jos parametrina annettua tiedostoa ei ole olemassa, luodaan se ja chmodataan muotoon 766.*/ function kasvataYhdella ($tiedosto) { ignore_user_abort(true); if (file_exists($tiedosto)) { $fd = fopen ($tiedosto, "r+"); /* Tiedostoon voi kirjoittaa vain, jos sen saa lukittua. Näin vältytään (toivottavasti) virheistä, joita tulisi, jos useampi kuin yksi yrittäisi kirjoittaa tiedostoon samaan aikaan. */ if (flock($fd, LOCK_EX)) { $aiempiArvo = fread ($fd, filesize ($tiedosto)); // Luetaan aiempi arvo $aiempiArvo++; // Kasvatetaan aiempaa arvoa yhdellä fseek($fd, 0); // Laitetaan pointteri tiedoston alkuun ftruncatea varten ftruncate($fd, 0); // Tyhjennetään tiedosto fwrite($fd, $aiempiArvo); // Kirjoitetaan uusi arvo (eli aiempiArvo + 1) flock($fd, LOCK_UN); } fclose($fd); } else { $fd = fopen ($tiedosto, "w"); chmod ($tiedosto, 0766); // Chmodataan tiedosto muotoon 766, jotta siihen voisi kirjoittaa fwrite($fd, "1"); fclose($fd); } ignore_user_abort(false); } /* Tallennetaan muuttujiin nykyinen päivämäärä ja kellonaika, kävijän IP-osoite, IP-osoitetta vastaava host, kävijän selain/käyttöjärjestelmä sekä osoite, jota kautta kävijä tuli sivuille (referer) ja haettu URL (eli mille sivulle kävijä tuli). */ $aikaLeima = date('d.m.Y H:i:s'); $ipOsoite = $_SERVER['REMOTE_ADDR']; $host = gethostbyaddr($_SERVER['REMOTE_ADDR']); $selain = $_SERVER['HTTP_USER_AGENT']; $referer = $_SERVER['HTTP_REFERER']; $requestURL = $_SERVER['REQUEST_URI']; /* Kasvatetaan latauslaskuria yhdellä aina kun sivu ladataan */ $latausMaaratFile = $kavijatURL."lataukset.txt"; // Tähän tallennetaan lataukset yhteensä kasvataYhdella ($latausMaaratFile); /* Katsotaan, onko referer-osoite, josta kävijä tuli sivulle saman sivuston sivuja. Jos referer-sivu on tämän sivuston sivuja, ei kävijä tietenkään voi olla uusi kävijä, koska hän on klikannut linkkiä tältä sivustolta. Kävijää ei siis noteerata uudeksi kävijäksi, jos referer-osoite kuuluu samaan sivustoon. kotisivunOsoite-muuttuja määritellään "Jokaisen sivun alkuun"-koodissa. Jos kyseessä on hakurobotti, joka tunnistetaan sivun alussa määritellystä host-luettelosta, ei hakurobotin käyntiä noteerata.*/ if (!eregi($kotisivunOsoite, $referer) && !onHakurobotti($host, $eiLasketa)) { /* Määritellään tiedostoja, joihin tallennetaan tietoja kävijöistä. Tiedostojen osoitteet ovat suhteellisia osoitteita. Osoitteiden edessä oleva kavijatURL-muuttuja saadaan "Jokaisen sivun alkuun" -koodista. */ $ipEstotOsoitteetFile = $kavijatURL."ipEsto/ipesteet.txt"; // Estetyt IP-osoitteet-tiedosto $ipEstotAikaFile = $kavijatURL."ipEsto/tunnit.txt"; // Estetyt IP-osoitteet-tiedoston viimeisen nollauksen kellonaika minuutteina $ipEstotPaivaFile = $kavijatURL."ipEsto/paivat.txt"; // Estetyt IP-osoitteet-tiedoston viimeisen nollauksen päivän numero $kavijaMaaratFile = $kavijatURL."kavijat.txt"; // Tähän tallennetaan kävijämäärä yhteensä $kavijatiedotFile = $kavijatURL."kavijatiedot.php"; // Tähän tallennetaan tietoja kävijöistä (kellonaika, IP-osoite, referer ...) /* Määritellään tiedostot, joihin tallennetaan päivä, viikko ja kuukausi -kohtaiset kävijämäärät. */ setlocale(LC_TIME, "fi_FI"); $paivaFile = $kavijatURL."paivat/".strftime("%Y-%m-%d").".txt"; // Päiväkohtaiset kävijämäärät $viikkoFile = $kavijatURL."viikot/".strftime("%G-vko-%V").".txt"; // Viikkokohtaiset kävijämäärät (vko 1-53) $kuukausiFile = $kavijatURL."kuukaudet/".strftime("%Y#%m").".txt"; // Kuukausikohtaiest kävijämäärät /* Määritellään tiedostot, joihin tallennetaan kävijämäärät tunneittain ja viikonpäivittäin. */ $tuntiFile = $kavijatURL."tunnit/".strftime("%H").".txt"; // Kävijämäärät tuntia kohden (00-23) $viikonpaivaFile = $kavijatURL."viikonpaivat/".date('D').".txt"; // Kävijämäärät viikonpäiviä kohden (Mon - Sun) /* Tallennetaan muuttujiin tämän päivän päiväyksen päivän numero ja kellonajan tunnit sekä minuutit. */ $tamaPaiva = getdate(); $paivaNyt = $tamaPaiva['yday']; // Vuoden päivän numero nyt (1-366) $tunnitNyt = $tamaPaiva['hours']; // Kellonajan tunnit nyt $minuutitNyt = $tamaPaiva['minutes']; // Kellonajan minuutit nyt /* Luetaan ne estetyt IP-osoitteet, joiden käyntiä ei lasketa uudeksi kävijäksi. */ $estetytIpOsoitteet = lueSisalto ($ipEstotOsoitteetFile); /* Luetaan se kellonaika minuutteina ja päivän numero, jolloin estetyt IP-osoitteet -tiedosto viimeksi nollattiin. */ $estoAikaMinuutteina = lueSisalto ($ipEstotAikaFile); $estoPaiva = lueSisalto ($ipEstotPaivaFile); /* Lasketaan erotus minuuteina: (nykyinen kellonaika) - (estetyt IP-osoitteet -tiedoston nollauksen kellonaika) */ $aikaErotus = 60*$tunnitNyt+$minuutitNyt-$estoAikaMinuutteina; /* Jos äsken laskettu erotus on suurempi tai yhtäsuuri kuin alussa määritelty vaihtoMinuutteina-muuttuja (oletus 60 minuuttia) tai jos nykyinen päivän numero on eri kuin estetyt IP-osoitteet -tiedoston nollauksen päivän numero, nollataan estetyt IP-osoitteet -tiedosto. */ if ($aikaErotus >= $vaihtoMinuutteina || $estoPaiva != $paivaNyt) { /* Kirjoitetaan uudet estetyt IP-osoitteet -tiedoston nollausajat */ ylikirjoitaSisalto ($ipEstotAikaFile, 60*$tunnitNyt+$minuutitNyt); ylikirjoitaSisalto ($ipEstotPaivaFile, $paivaNyt); /* Nollataan estetyt IP-osoitteet -tiedosto. */ ylikirjoitaSisalto ($ipEstotOsoitteetFile, ""); $estetytIpOsoitteet = ""; } /* Katsotaan, onko kävijän IP-osoite jo estettyjen IP-osoitteiden listassa. Jos ei ole, tulkitaan kävijä uudeksi kävijäksi ja lisätään yksi kävijä lisää laskureihin. Jos IP-osoite on jo estettyjen IP-osoitteiden listassa, ei kirjoiteta kävijälaskuriin uutta kävijää. */ if (!ereg($ipOsoite, $estetytIpOsoitteet)) { /* Lisätään kävijän IP-osoite estetyt IP-osoitteet -tiedostoon. */ lisaaTiedostonLoppuun ($ipEstotOsoitteetFile, $ipOsoite); /* Kasvatetaan kävijämäärien laskureita. */ kasvataYhdella ($kavijaMaaratFile); // Kaikki kävijät yhteensä kasvataYhdella ($paivaFile); // Päivämääräkohtaiset kävijämäärät kasvataYhdella ($viikkoFile); // Viikkokohtaiset kävijämäärät kasvataYhdella ($kuukausiFile); // Kuukausikohtaiset kävijämäärät kasvataYhdella ($tuntiFile); // Käivjämäärät tunneittain kasvataYhdella ($viikonpaivaFile); // Kävijämäärät viikonpäivittäin /* Kirjoitetaan tiedot kävijästä (kellonaika, IP-osoite, referer, selain/käyttöjärjestelmä ...). */ $kavijatiedotKoko = filesize ($kavijatiedotFile) / 1024; // Kävijätiedot-tiedoston koko kilotavuina if ($referer == "") $referer = "suora"; // Jos kävijä on tullut suoraan sivuille, on referer-osoite "suora". /* Kävijän tiedot kirjoietaan tiedostoon html-taulukon soluina. */ $kirjoitaTiedot = " <tr> <td>$aikaLeima</td> <td>$ipOsoite -- $host</td> <td>$referer</td> <td>$requestURL</td> <td>$selain</td> </tr> "; /* Jos kävijätiedot-sivu on kasvanut liian suureksi, nollataan se ja lisätään tiedoston alkuun peruskoodi, joka sisältää salasanakyselyn */ $peruskoodi = " <?php include(\"peruskoodi.php\"); ?>"; /* Katsotaan, onko kavijatiedot.php -sivun tiedostokoko saavuttanut sen nollausrajan. Jos tiedostokoko on suurempi tai yhtäsuuri kuin alussa määritelty nollausraja, tyhjennetään sivu ennen uuden kävijän tietojen lisäystä. Muutoin lisätään vain tiedot sivun loppuun muiden tietojen perään.*/ if ($kavijatiedotKoko >= $kavijatiedotNollaus) ylikirjoitaSisalto ($kavijatiedotFile, $peruskoodi.$kirjoitaTiedot); else lisaaTiedostonLoppuun ($kavijatiedotFile, $kirjoitaTiedot); } // Uuden kävijän tietojen ja laskurien kasvattamisen if-lauseen loppu clearstatcache (); } ?>
________________________________
Mod. korjasi kooditagit!
Laittaisitko viestiisi kooditagit? Silloin olisi paljon helpompi lukea koodia.
Ja olis järkevämpää heittää se sinne minne kuuluukin,Nettisivut ja -ohjelmointi
Kuten virheilmoituksessa lukee, freadin toisen parametrin pitää olla suurempi kuin nolla. Katso koodisi riviä 119.
Kannattais varmaan muuten harkita jotain muuta kuin tota...
Aihe on jo aika vanha, joten et voi enää vastata siihen.