direaa_ Skrevet 30. oktober 2004 Del Skrevet 30. oktober 2004 Jeg har en webside som jeg logger treffene på. Jeg bruker PHP og skriver til en txt fil. I denne loggen logges dato, ip, hvor brukeren kom fra og hvilken nettleser som brukes. Mange av oppföringene i denne loggen er sökeroboter som f. eks: msnbot. Det jeg vil gjöre er å hindre at slike oppföringer kommer i denne loggen. Det jeg da pröver på er å bruke if og else for å hindre skriving av disse oppföringene. Men jeg klarer ikke å stoppe dem og skjönner ikke hvorfor... Her er nödvending info, slik logges ALT: $dinip="$_SERVER[REMOTE_ADDR]"; $komfra="$_SERVER[HTTP_REFERER]"; $system="$_SERVER[HTTP_USER_AGENT]"; $dato=date("Y-m-d - H:i"); $loggfil = fopen('/var/www/html/logg.txt', 'a'); $innhold = "$dato\n $dinip\n "$komfra\n $system"; fwrite($loggfil, $innhold); fclose($loggfil); Dette pröver jeg å gjöre for å stoppe noen oppföringer i loggen (eks. msnbot): if($system == "msnbot/0.3 (+http://search.msn.com/msnbot.htm)") { } else { fwrite($loggfil, $innhold); fclose($loggfil); } Dette stopper ikke oppföringen fra å komme i loggen. Men om jeg pröver if($dinip == "203.24.256.24)" { } istedenfor så stopper den oppföringen i loggen hvis brukeren har den ip-adressen. Hvorfor virker ikke dette med $system? Og er det mulig å bruke wildcards på noe vis? Eks. if($system == "msnbot*") { } Og til alle som har veldig lyst til å si det: Ja, jeg vet om SQL, men er litt n00b på dette området og önsker å starte i det små. Håper noen kan hjelpe meg, takk på forhånd. Lenke til kommentar
Gilbert Skrevet 30. oktober 2004 Del Skrevet 30. oktober 2004 Noe lignende var oppe for en stund siden, og da kom det opp et forslag om å bruke regular expression tror jeg. Lenke til kommentar
direaa_ Skrevet 30. oktober 2004 Forfatter Del Skrevet 30. oktober 2004 (endret) Og hva er "regular expression" ?? EDIT: Glem det.... Sett! Leser i php manualen... Men tar gjerne imot konkrete eksempler... Endret 30. oktober 2004 av direaa_ Lenke til kommentar
LoS Skrevet 30. oktober 2004 Del Skrevet 30. oktober 2004 Du finner info om det på www.php.net Du kan jo bruke ereg(), eller eregi(). Har ikke drevet så mye med dem to der, så hastigheten på de i forhold til andre og kanskje bedre løsninger veit jeg ikke. Lenke til kommentar
direaa_ Skrevet 30. oktober 2004 Forfatter Del Skrevet 30. oktober 2004 Nå her jeg funnet noe som virker slik jeg önsker: $needle = "msnbot"; $haystack = " ".$system ; if (strpos($haystack, $needle)) { } else { fwrite($loggfil, $innhold); fclose($loggfil); } Er det mulig å sette flere sökeord inni $needle = "msnbot"; ? Eks. (som ikke virker): $needle = "msnbot, Googlebot"; Eller MÅ jeg lage noe slikt: $msnbot = "msnbot"; $Googlebot = "Googlebot"; $haystack = " ".$system ; if (strpos($haystack, $msnbot)) { } elseif (strpos($haystack, $Googlebot)) { } else { fwrite($loggfil, $innhold); fclose($loggfil); } Jeg har laget dette og det ser ut til å virke, men finnes det mulighet for å bare ha en "if", og heller ha med flere sökeord i "needle" så gjör jeg gjerne det. Lenke til kommentar
robgar Skrevet 30. oktober 2004 Del Skrevet 30. oktober 2004 (endret) $needles = array("msnbot", "google"); $haystack = " ".$system ; $i = "0"; while ($i < sizeof($needles)) { if (strpos($haystack, $needle)) { } else { fwrite($loggfil, $innhold); fclose($loggfil); } } ser kanskje ut som mer kode nå, men om du tar flere søkemotorer enn 2 , vil du se at det slettes ikke er tilfelle. Endret 30. oktober 2004 av robgar Lenke til kommentar
direaa_ Skrevet 30. oktober 2004 Forfatter Del Skrevet 30. oktober 2004 robgar: det var akkurat noe sånt jeg var på utkikk etter, takk! Men, når jeg bruker det, så kommer websiden fram som dette: Warning: fwrite(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 52 Warning: fclose(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 53 Warning: fwrite(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 52 Warning: fclose(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 53 Warning: fwrite(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 52 OSV OSV OSV (i det uendelige) Leter etter feil, men finner ikke, kan du se over koden din og sjekke om den stemmer? Eller er det feil hos meg en plass? Lenke til kommentar
robgar Skrevet 30. oktober 2004 Del Skrevet 30. oktober 2004 (endret) Du stenger den for hver gang i loopen og åpner den bare en gang. Du må ha åpning av fil og stenging av fil for hver gang om det skal gå. MEN : Det er lurere å ta fopen() før loopen og fclose() etter loopen, da den da slipper å jobbe masse unødvendig. $needles = array("msnbot", "google"); $haystack = " ".$system ; $i = "0"; $loggfil = fopen("loggfil.txt", "a+"); // før løkke og if test while ($i < sizeof($needles)) { if (strpos($haystack, $needle)) { } else { fwrite($loggfil, $innhold); // legg merke til at det bare er fwrite. } } fclose($loggfil); // etter løkke og if test EDIT Så jeg glemte $loggfil og puttet fclose i loopen Endret 30. oktober 2004 av robgar Lenke til kommentar
direaa_ Skrevet 31. oktober 2004 Forfatter Del Skrevet 31. oktober 2004 Ok, dette gikk virkelig ikke! Det som skjer nå er at siden aldri lastes (står sikker og skriver som en gal til txt fila). Og at txt fila blir så stor som det er ledig plass på webserveren (250 MB!). while ($i < sizeof($needles)) { if (strpos($haystack, $needle)) { } Er dette en glipp eller snakker vi om $needles og $needle, det eneste som er blitt definert er jo $needles Dette går litt over mitt hode, så jeg er avhengig av deg/dere for å finne feil i koden. Lenke til kommentar
robgar Skrevet 31. oktober 2004 Del Skrevet 31. oktober 2004 (endret) Ops Glemte å legge til i++; i løkka. $needles = array("msnbot", "google"); $system="$_SERVER[HTTP_USER_AGENT]"; $haystack = " ".$system ; $i = "0"; $loggfil = fopen("loggfil.txt", "a+"); if ($stopp !== true) { while ($i < sizeof($needles)) { if (!strpos($haystack, $needles[$i])) { fwrite($loggfil, $innhold); $stopp = true; } $i++; } } fclose($loggfil); EDIT : Fikset på koden (Virker ikke ^) EDIT 2 : Nei , om den ikke er msnbot, så vil stopp være true selv om det er google som lusker. Dette her vil virke; <? $needles = array("msnbot", "google", "kvasir"); $system="$_SERVER[HTTP_USER_AGENT]"; $haystack = " ".$system ; $i = "0"; $loggfil = fopen("loggfil.txt", "a+"); while ($i < sizeof($needles)) { if (strpos($haystack, $needles[$i])) { $robot = true; } } if ($robot !== true){ fwrite($loggfil, $innhold); } fclose($loggfil); ?> Hvet ikke om Kvasir er en søkerobot men men. Endret 31. oktober 2004 av robgar Lenke til kommentar
direaa_ Skrevet 31. oktober 2004 Forfatter Del Skrevet 31. oktober 2004 Der begynner det vel å nærme seg, nå virket siden nesten med engang, det eneste som mangla var $ forran i++;. Men selv om siden nå kommer som den skal så stopper dette ikke noen oppføringer i loggen, derimot skriver den alt tre (3) ganger. Lenke til kommentar
LoS Skrevet 31. oktober 2004 Del Skrevet 31. oktober 2004 Prøv å legg på en exit; inder fwrite();. Lenke til kommentar
Lemkin Skrevet 31. oktober 2004 Del Skrevet 31. oktober 2004 Vil det være så lurt da? om han har det scriptet der øverst vil jo ikke resten av siden vises Lenke til kommentar
direaa_ Skrevet 31. oktober 2004 Forfatter Del Skrevet 31. oktober 2004 exit; stopper som sagt resten av siden ja, og gir meg fortsatt tre oppføringer i loggen. Lenke til kommentar
LoS Skrevet 31. oktober 2004 Del Skrevet 31. oktober 2004 (endret) Sant det, men kunne hende det ikke skjedde hvis det lå i en include(); jeg har ikke testa det, så jeg bare tok noe som var nesten litt logisk Når jeg tenker meg litt mer om så husker jeg faktiskt at jeg hadde feil Endret 31. oktober 2004 av LoS Lenke til kommentar
direaa_ Skrevet 31. oktober 2004 Forfatter Del Skrevet 31. oktober 2004 Hvorfor skal man ha en loop der i det hele tatt da? robgar: har du en plan så er jeg meget takknemlig, du er nær noe føler jeg... Lenke til kommentar
robgar Skrevet 1. november 2004 Del Skrevet 1. november 2004 Jeg forandret koden nå, : <? $needles = array("msnbot", "google", "kvasir"); $system="$_SERVER[HTTP_USER_AGENT]"; $haystack = " ".$system ; $i = "0"; $loggfil = fopen("loggfil.txt", "a+"); while ($i < sizeof($needles)) { if (strpos($haystack, $needles[$i])) { $robot = true; } $i++; } if ($robot !== true){ fwrite($loggfil, $innhold); } fclose($loggfil); ?> Forklaring: Loopen går igjenom klienten, og om det er en av de nevnte i arrayet over er $robot = true; Om $robot ikke er true, så skriver den til fila. Lenke til kommentar
direaa_ Skrevet 1. november 2004 Forfatter Del Skrevet 1. november 2004 Se der ja! Nå ser det ut til at det virker som planlagt! Tusen takk robgar, og dere andre! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå