Tein äsken kävijälaskurin, ja nyt minun tarvitsisi saada tiedot.txt tyhjäksi aina klo 0.00. Miten tämä tapahtuu? tässä tämä minun purkka viritys:
Jos käytössäsi on Crontabit niin käytä niitä, muuten katso tämä: https://www.ohjelmointiputka.net/koodivinkit/
Kellon aikaa tutkimalla...
Time-arvoja laskemalla...
Mutta...
Tuo ei onnistu ellei sivulla ole kävijää tasan klo. 0.00
Asia, jota haluat, järjestynee sillä, että kunkin vuorokauden ensimmäinen kävijä luo vuorokausi-tiedoston, esim, 01122004.txt, edelliseltä vuorokaudelta esim. näin:
$vrk=date(d)-1; $aika=$vrk.date(mY).".txt"; if (!file_exists($aika)) { copy("tiedot.txt",$aika); }
(jos haluat säilyttää tiedot) ja tyhjentää tiedoston esim. näin:
ja sen jälkeen tallentaa omat tietonsa siihen.
Tallenna tiedoston alkuun sen muokkauspäivämäärä. Aina kun muokkaat tiedostoa, tarkista, onko tuo päivämäärä sama kuin oikea päivämäärä. Jos se on eri, tiedosto on vanhentunut ja sen voi tyhjentää. Jos tuota tiedostoa ei lueta kuin PHP-skriptistä käsin, onko sillä merkitystä, tapahtuuko tyhjennys keskiyöllä vai ensimmäisellä käyttökerralla sen jälkeen?
Eikös tuo koodisi korvaa nyt joka kerta tiedoston vanhat tiedot uusilla niin, että käyttäjiä löytyy aina vain yksi? Pitäisi varmaan avata kirjoituksen (w) sijaan appendilla (a), jolloin jatkuu kirjoitus lopusta.
En ole nyt varma fwrite-funktion käytöksestä, mutta jos se ei "w"-parametrin kanssa tyhjennä tiedostoa, voi koko roskan poistaa unlink-funktiolla.
Jatketaan nyt viellä tähän: Korvasin tuon "w"-parametrin "a":lla, mutta nyt tuli semmoinen ongelma, että pitäisi tarkistaa, löytyykö IP:tä tiedostosta, ja jos löytyy, ei kirjoiteta jne. Miten tämä tarkistus tapahtuu?
Tässä yksinkertainen koodi joka etsii merkkijonoa tiedostosta (heitän päästä, voi jäädä jokin bugi). Oletetaan että sinulla on tiedostossa ip-osoitteet omilla riveillään tyyliin:
123.456.789
43.64.123.53
54.35.22.11
Jos riveillä on muutakin tietoa, täytyy vähän muokkailla.
<?php $tiedosto="filu.txt"; //tutkittava filu $etsitaan="81.197.56.65"; //tätä etsitään $loyty=0; //1 jos löytyy $rivit=file($tiedosto); //luetaan tiedosto taulukkoon for ($i=0; i<count($rivit); i++) { //käydään taulkko läpi if ($rivit[$i]==$etsitaan) { echo "Löyty tiedostosta"; $loyty=1; break; } } if ($loyty==1) { echo "Kyllä löytyy"; } else { echo "Ei löydy"; }
Pikkuisen vielä:
Sinulla näkyy olevan Ip eka-lokerossa.
Tarkistetaan esim. näin:
<?php $fp=file("tiedot.txt"); for($i=0;$i<count($fp);$i++) { $solut=explode("|",$fp[$i]); // Tarkistetaan if($ip == $solut[0]) { echo "Tervetuloa uudelleen sivuilleni!"; } else { $tiedosto = file("tiedot.txt"); $tt = fopen("tiedot.txt", "a"); fwrite($tt, "$ip | $aika\n"); echo "Käyttäjiä näillä sivuilla on ollut " . count($tiedosto); fclose($tt); } } ?>
Tuossa on varmasti pikkuisen säätöä, kun väänsin sen tässä ja nyt...
Sieltä puuttuu puolipilkku countin jälkeen. Saa sitä muuten edes yrittää korjata syntaksivirheitä ennen kuin postaa Putkaan niistä.
Juu, noinhan se tietysti menee. Huomaa että en ole paljon PHP:hen koskenut viimeaikoina, ja tuo dollarimerkki ei enään ole "selkäytimessä" vaan hommat sujuu C++:n syntaksilla :D
Draiz korjasi koodin oikeaksi, Pekan antamasta explode()-funktiosta löytyy tietoja esim. ohjelmointikielihakemistosta.
Olenkohan sitten käsittänyt jotain väärin, koodi näyttää nyt tältä:
<?php //tiedot mitä kerätään $aika = date("d.m.Y - H:i:s"); $ip = $_SERVER['REMOTE_ADDR']; $tiedosto = file("tiedot.txt"); $tt = fopen("tiedot.txt", "a"); $tiedosto = "tiedot.txt"; //tutkittava filu $etsitaan = "$ip"; //tätä etsitään $loyty = 0; //1 jos löytyy $rivit = file($tiedosto); //luetaan tiedosto taulukkoon for ($i=0; $i <= count($rivit); i++) { //käydään taulukko läpi if ($rivit[$i]==$etsitaan) { $loyty=1; break; } } fwrite($tt, "$ip | $aika\n"); echo "Käyttäjiä näillä sivuilla on ollut " . count($tiedosto) ."Kello on nyt $aika"; fclose($tt); ?>
EDIT: Tuota tuota, sieltä löytyy $ip|$aika\n
jos kirjoitat sinne kuten mainitsit aiemmissa viesteissäsi.
<?php // käydään taulukko (eli tiedoston rivit) läpi for ($i=0; $i <= count($rivit); i++) { $rivi = explode("|", $rivit[$i]); // tässäpä pähkinä, mitä $rivi-muuttuja sisältää // kokeile vaikka print_r($rivi) // ja siitä luultavasti huomaat, millainen if-lause täytyy muodostaa // vinkkinä, että täytyy vertailla $rivi-muuttujan indeksiä etsittävään arvoon } ?>
Ja lisäksi count($tiedosto), katsopas mitä se $tiedosto sisältää. Se sisältää "tiedot.txt", oikea muuttuja olisi $rivit.
Aihe on jo aika vanha, joten et voi enää vastata siihen.