Avatar billede netspinner Nybegynder
24. juli 2006 - 16:20 Der er 43 kommentarer og
4 løsninger

Logge IP, dato og tid

Hej, jeg anvender pt. nedenstående script for at logge IP-adresser på mit web site. Hvordan udvider jeg scriptet til også at logge dato og tid for besøg for den enkelte IP?

<?
$ip = $_SERVER['REMOTE_ADDR'];
$file = fopen("ips.txt", "a");
fwrite($file, "$ip\n");
fclose($file);
?>

I øvrigt vil jeg gerne kunne lave en lille statistik-side, hvor oplysningerne for de enkelte besøg streames i en tabel. I den forbindelse vil jeg også gerne have det nye (IP, dato og tid) script udviklet til at gemme data i en SQL-database.
Avatar billede jaw Nybegynder
24. juli 2006 - 16:22 #1
Sådan her f.eks.:

<?
$ip = $_SERVER['REMOTE_ADDR'];
$dato = date("d:m:Y H.i.s");
$file = fopen("ips.txt", "a");
fwrite($file, $ip."\t".$dato."\n");
fclose($file);
?>
Avatar billede netspinner Nybegynder
24. juli 2006 - 16:29 #2
Den kigger lige på... indtil videre tak for dit input :)
Avatar billede netspinner Nybegynder
24. juli 2006 - 16:35 #3
Virker jo perfekt :) Har du tjek på MySQL og tid til også omskrive scriptet, så det benytter database?
Avatar billede jaw Nybegynder
24. juli 2006 - 16:39 #4
Tjah, en tabel med 2 felter - ip, datotid (type varchar(15), datetime)

mysql_connect("Host", "user", "pass") or die(mysql_error());
mysql_select_db("databasenavn") or die(mysql_error());

$ip = $_SERVER['REMOTE_ADDR'];
$dato = date("d:m:Y H.i.s");

mysql_query("INSERT INTO tabelnavn (ip, datotid) VALUES ('".$ip."', '".$dato."')") or die(mysql_error());

Det må være den simpleste måde.
Avatar billede netspinner Nybegynder
24. juli 2006 - 17:32 #5
Mange tak!
Den gemmer IP korrekt i "ip" feltet. Men alle data i "datotid" feltet gemmes som "0000-00-00 00:00:00"??
Avatar billede netspinner Nybegynder
24. juli 2006 - 17:41 #6
Min tabel ser således ud:

CREATE TABLE `iplogging` (
`ip` VARCHAR( 15 ) NOT NULL ,
`datotid` DATETIME NOT NULL
);
Avatar billede showsource Seniormester
24. juli 2006 - 17:48 #7
Grunden til det, er fordi hvis det ikke er en dato i år-måned-dag-time-min-sek format, gemmes det ikke, når det er datetime
Men du kan bruge NOW()
mysql_query("INSERT INTO tabelnavn (ip, datotid) VALUES ('".$ip."', NOW())") or die(mysql_error());

Umiddelbart ville jeg nok også lave en kolonne, "id" som er autoincrement og primary
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 17:58 #8
$db_connect = mysql_connect("Host", "user", "pass") or die(mysql_error());
mysql_select_db("databasenavn") or die(mysql_error());

$ip = $_SERVER[REMOTE_ADDR];
$dato = date("d-m-y H:i:s", time());

$insertSQL = ("INSERT INTO tabelnavn (ip, dato) VALUES('$ip', '$dato'));
$Result = mysql_query($insertSQL, $ht_connect) or die(mysql_error());'

CREATE TABLE `test` (
`id` INT( 9 ) NOT NULL AUTO_INCREMENT ,
`ip` VARCHAR( 255 ) NOT NULL ,
`dato` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 17:59 #9
Vi prøver lige igen:P

$db_connect = mysql_connect("Host", "user", "pass") or die(mysql_error());
mysql_select_db("databasenavn") or die(mysql_error());

$ip = $_SERVER[REMOTE_ADDR];
$dato = date("d-m-y H:i:s", time());

$insertSQL = ("INSERT INTO tabelnavn (ip, dato) VALUES('$ip', '$dato'));
$Result = mysql_query($insertSQL, $db_connect) or die(mysql_error());'

CREATE TABLE `Hvad_Du_Vil_Kalde_Din_Tabel` (
`id` INT( 9 ) NOT NULL AUTO_INCREMENT ,
`ip` VARCHAR( 255 ) NOT NULL ,
`dato` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
Avatar billede netspinner Nybegynder
24. juli 2006 - 18:00 #10
Tak, nu har jeg en masse at gå ud fra... :) showsource og supersquirrel, I må gerne kaste et svar hver.
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 18:02 #11
Here you go :)
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 18:03 #12
DOH

her
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 18:04 #13
Ved ikke om jeg kastede svar eller ej .p

Anyways, næste gang du skal have gemt datoen i en mySQL database, så er det smart at lave dato til en varchar(255) :)
Avatar billede showsource Seniormester
24. juli 2006 - 18:07 #14
Man kan jo bruge alle dato muligheder i Mysql, hvis man bruger datetime.
Og lige et svar også :O)
Avatar billede netspinner Nybegynder
24. juli 2006 - 18:08 #15
supersquirrel > Jeps, du har kastet samme indlæg med kode + svar 2 gange ;)
Hvorfor vil du umiddelbart anbefale at bruge varchar(255) ved dato?


(mangler lige svar fra showsource)
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 18:10 #16
Det er nemt, og det virker *G*

-> brug mit nederste svar ;o)
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 18:13 #17
Må man spørge hvad det er for en side du er ved at lave? Bare en privat, or?
Avatar billede netspinner Nybegynder
24. juli 2006 - 18:18 #18
Ja, det er det. Jeg skulle lige have PHP- og MySQL-koden i orden først, det kan jeg takke jer for :), og så skal jeg selv i gang med at lave en mindre statistik-side i HTML, hvor jeg forener HTML med SQL-forespørgsler. Det er meningen, at jeg skal kunne sortere i IP og dato. Jeg vil nemlig gerne have lidt statistik på mit site i stedet for en tæller...

Lognings-scriptet er placeret på hovedsiden, men jeg kan se at hver gang jeg er inde på en underside og kommer tilbage til hovedsiden, opdateres denne og dataene bliver registreret igen. Kan man undgå dette på simpel vis?
Avatar billede showsource Seniormester
24. juli 2006 - 18:24 #19
Du kan bruge sessions, og før du laver din INSERT, tjekker du om en session er sat.

Men nu du er ved det, hvorfor så ikke logge siden brugeren kikker på?
Avatar billede netspinner Nybegynder
24. juli 2006 - 18:26 #20
Tænkte nok at det var sessions der var den nemmeste / bedste løsning...
Logge siden - nemt at tilføje til det eksisterende script? :)
Avatar billede showsource Seniormester
24. juli 2006 - 18:31 #21
Tilføjer kolonnen "url" som er varchar(255) i din tabel

mysql_query("INSERT INTO tabelnavn (ip, datotid, url) VALUES ('".$_SERVER["REMOTE_ADDR"]."', NOW(), '".$_SERVER["REQUEST_URI"]."')") or die(mysql_error());

Du kan så include scriptet på hver side du har. Evt med en .htaccess hvis du kan bruge det p ådit host
Avatar billede showsource Seniormester
24. juli 2006 - 18:34 #22
.htaccess
Hvis du kan bruge .htaccess, kan du lægge en i roden af dit domain med flg.

php_value auto_prepend_file  /den/fulde/harddisk sti/til/stastistik.php

Så behøver du ikke include filen i hvert document.
Avatar billede supersquirrel Nybegynder
24. juli 2006 - 18:39 #23
Du kan lave det på en ret simpel måde :)

Tilføj denne kollone til din tabel:
side varchar(255)

derefter retter du denne kode:

$db_connect = mysql_connect("Host", "user", "pass") or die(mysql_error());
mysql_select_db("databasenavn") or die(mysql_error());

$ip = $_SERVER[REMOTE_ADDR];
$dato = date("d-m-y H:i:s", time());

$insertSQL = ("INSERT INTO tabelnavn (ip, dato) VALUES('$ip', '$dato'));
$Result = mysql_query($insertSQL, $db_connect) or die(mysql_error());'


til:


$db_connect = mysql_connect("Host", "user", "pass") or die(mysql_error());
mysql_select_db("databasenavn") or die(mysql_error());

$ip = $_SERVER[REMOTE_ADDR];
$side = "Skriv sidens navn her";
$dato = date("d-m-y H:i:s", time());

$insertSQL = ("INSERT INTO tabelnavn (ip, dato, side) VALUES('$ip', '$dato', '$side'));
$Result = mysql_query($insertSQL, $db_connect) or die(mysql_error());'

Den stump kode skal du så bare insætte på hver side, og ret lige "Skriv sidens navn her" til hver enkel side :)
Avatar billede hanklitvej Nybegynder
24. juli 2006 - 18:53 #24
I stedet for at skrive navn til hvert site, hvorfor så ikke bare benytte REQUEST_URI  ?
Avatar billede netspinner Nybegynder
24. juli 2006 - 18:56 #25
Damn, det er jo meget simpelt :)
Jeg takker for jeres indlæg - kan man give ekstra point?
Avatar billede hanklitvej Nybegynder
24. juli 2006 - 18:59 #26
nej, men jeg tror ikke at os som skriver efter accepteret svar gør det for at få point ;)
Avatar billede netspinner Nybegynder
24. juli 2006 - 19:05 #27
Jeg leger bare lige julemand her i juli... nå, pjat til side.
Avatar billede showsource Seniormester
24. juli 2006 - 21:52 #28
Nu er jeg så lidt nysgerrig, hvordan ser din kode ud?
Avatar billede netspinner Nybegynder
24. juli 2006 - 22:19 #29
Altså min endelige PHP-kode?
Avatar billede showsource Seniormester
24. juli 2006 - 22:28 #30
jow da! :O)
Avatar billede hanklitvej Nybegynder
24. juli 2006 - 22:32 #31
jah man kan jo altid lære noget af at se ting som virker :=)
Avatar billede netspinner Nybegynder
24. juli 2006 - 22:39 #32
<?
$db_connect = mysql_connect("min_host", "mit_brugernavn", "mit_kodeord") or die(mysql_error());
mysql_select_db("mit_brugernavn") or die(mysql_error());

$ip = $_SERVER['REMOTE_ADDR'];
$side = "Hovedsiden > main.php";
$datotid = date("d-m-y H:i:s", time());

$insertSQL = ("INSERT INTO iplogging (ip, datotid, side) VALUES ('$ip', '$datotid', '$side')");
$Result = mysql_query($insertSQL, $db_connect) or die(mysql_error());
?>



Og tabellen:

CREATE TABLE `iplogging` (
`id` INT( 9 ) NOT NULL AUTO_INCREMENT ,
`ip` VARCHAR( 255 ) NOT NULL ,
`side` VARCHAR( 255 ) NOT NULL ,
`dato` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
Avatar billede showsource Seniormester
24. juli 2006 - 22:40 #33
Eller andre som søger på noget lign. vil jo kunne få glæde af det
Avatar billede netspinner Nybegynder
24. juli 2006 - 22:41 #34
I phpMyAdmin ser det rigtig lækkert ud, for det er giver en perfekt statistik :)
Jeg nu mangler jeg bare at have lavet selve statistik-siden og integrere en funktion, der optæller antal besøg på de enkelte sites.
Avatar billede showsource Seniormester
24. juli 2006 - 22:58 #35
Ok du, har selv rodet med PHP i 5-6 år, og da der kom noget tid ind i billedet, brugte jeg time() til at finde det ene eller det andet i Db'en

Min erfaring siger mig at du får langt større gavn af at bruge et datetime felt i Db'en, fordi du så kan bruge de dato funktioner som findes i mysql

Når du ikke bruger et datetime felt i DB'en, skal du altid til at lave noget PHP for f.eks. at beregne forskellen mellem to tidspunkter, i stedet for at gøre det i en query

Startende her:
http://dev.mysql.com/doc/refman/4.1/en/index.html

Og kan sgutte lige finde et godt ex. eks! :O(
Er ikke hjemme, og bruger en andes comp p.t.
Avatar billede showsource Seniormester
24. juli 2006 - 22:59 #36
statistik i phpmyadmin? Where???
Avatar billede netspinner Nybegynder
24. juli 2006 - 23:00 #37
Ja, den med datoen er jeg også i tvivl om, men jeg bryggede jo på supersquirrels eksempel. Men jeg skulle bare have det til at virke her i dag, og det gør det skam også. Det er jo nemt at replace VARCHAR med DATETIME.
Avatar billede netspinner Nybegynder
24. juli 2006 - 23:04 #38
Jeg mente bare, at jeg fik et godt overblik over dataene i tabellen ;)
Det skal jo bruges til lidt statistik fremover.
Avatar billede showsource Seniormester
24. juli 2006 - 23:06 #39
Yes, men så brug NOW() ved insert, for ikke blot at få 000-00-00 00:00:00 i DB'en
Avatar billede showsource Seniormester
24. juli 2006 - 23:09 #40
Hvis du har 10000 rows i DB'en, vil du ikke få noget godt overblik i phpmyadmin.
Men du kan godt lave et PHP script som lister måneder-år i en selectboks som findes i DB'en, og på den måde lave noget mere overskueligt statistik
Avatar billede netspinner Nybegynder
24. juli 2006 - 23:12 #41
Ja, meningen er at jeg i HTML opretter en dynamisk tabel, der lister hele databasens indhold. Man skal så kunne sortere efter IP, dato og side. Lige nu har jeg kun testet med nogle få klik, men det er nok til at se, at det virker som det skal. F.eks. klikkede jeg mig først ind på hovedsiden, dernæst side2, side3 og sluttede igen af med et klik på hovedsiden. Alle perfekt registreret :)
Avatar billede showsource Seniormester
24. juli 2006 - 23:16 #42
iøvrigt, at lave statistikscript, det er ikke bare så'n lige til! :O)
Når du har fået lavet noget, finder du ud af der er noget mere du egentlig gerne vil putte på! :O)

Bruger selv AWStats
http://awstats.sourceforge.net/
Avatar billede netspinner Nybegynder
24. juli 2006 - 23:27 #43
Jeg har nu udskiftet datotid feltets datatype fra VARCHAR -> DATETIME, samt lade den skrive IP direkte i stedet for først at lagre den i en variabel.

$insertSQL = ("INSERT INTO iplogging (ip, datotid, side) VALUES ('".$_SERVER["REMOTE_ADDR"]."', NOW(), '".$side."')");

Før fik jeg lagret dato og tid, som jeg ville have det, f.eks. 24-07-06 23:10:15 - ved at bruge NOW() lagres dato og tid således: 2006-07-24 23:22:20 - hvordan får jeg det ændret til det tidligere format?
Avatar billede showsource Seniormester
24. juli 2006 - 23:31 #44
SELECT DATE_FORMAT(datotid, '%d-%m-Y %h:%m:%i') as tidspunkt FROM dintabel

Noget i den stil! :O)

Men kik her:
http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

Og nu skal jeg i seng!
Avatar billede showsource Seniormester
24. juli 2006 - 23:32 #45
Hov mangler selvf. en % før Y !!!
Avatar billede netspinner Nybegynder
24. juli 2006 - 23:32 #46
Takker, kigger på om det kan lade sig gøre - go'nat ;)
Avatar billede Slettet bruger
25. juli 2006 - 22:58 #47
Lige et par eksempler på ting man kan gøre, hvis man bruger DATETIME-felter, som er i bedste fald meget besværlige ellers (nogle af dem grænsende til umulige):

Lave oversigter, der viser hits fordelt på:
- ugedag (så man kan se hvilke dage, der er mest travlt på serveren)
- time
- ugedag og time
- måned og dato (perfekt til at lave en graf af)

Og det er vel at mærke ikke særlig kompliceret kode, der skal til for disse eksempler.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester