Permalänk
Medlem

PHP-problem

Hej!
Sitter med en skoluppgift och har ett futtigt men i mina ögon konstigt problem i följande kob:

$oppna = fopen("besokslogg.txt", "w+"); $ipadress = $_SERVER['REMOTE_ADDR']; $frånsida = $_SERVER['HTTP_REFERER']; $webbläsare = $_SERVER['HTTP_USER_AGENT']; $radbrytning = "\r\n"; $höstack = file_get_contents('besokslogg.txt'); $sökning = strpos($höstack, $ipadress); if ($sökning === false) { $räknare = 1; $allinfo = $räknare . "\t" . 'ip-adress: ' . $ipadress . $radbrytning . 'från: ' . $frånsida. $radbrytning . 'webbläsare: ' . $webbläsare . $radbrytning; fwrite($oppna, $allinfo); } else echo 'hejhej';

Det jag försöker göra är att skapa en besökslogg som lagras på en textfil, och om sökningen inte är false så ska kod för att öka räknaren köras, men det gör den inte - else-satsen hoppas bara över. Har här provat att ta bort allt och bara skriva ut hejhej, för att se om det fungerar, men det gör det inte. Någon som kan se vad jag missar som gör att else inte fungerar?

Permalänk
Medlem

else
echo 'hejhej';

bör vara:

else {
echo 'hejhej';
}

Tror inte man kan blanda skrivsätt som du tänkt.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem

Har provat det också, liksom elseif, och bara ett if med villkoret !== false, men koden körs inte ändå. :/

Permalänk
Medlem

Förresten, byt ut alla variabelnamn till engelska motsvarigheter utan åäö, annars tror jag PHP blir sur. Alternativt gör du om ö till o, och åä till a.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem

Testade det, och kompletterade koden:

$oppna = fopen("besokslogg.txt", "w+"); $ipadress = $_SERVER['REMOTE_ADDR']; $fransida = $_SERVER['HTTP_REFERER']; $webblasare = $_SERVER['HTTP_USER_AGENT']; $radbrytning = "\r\n"; $hostack = file_get_contents('besokslogg.txt'); $sokning = strpos($hostack, $ipadress); if ($sokning === false) { $raknare = 1; $allinfo = $raknare . "\t" . 'ip-adress: ' . $ipadress . $radbrytning . 'från: ' . $fransida. $radbrytning . 'webbläsare: ' . $webblasare . $radbrytning; fwrite($oppna, $allinfo); } else { $position = rewind($oppna); //sätter pekaren till början $placering = $sokning -3; //sätter pekaren fseek($oppna, $placering, SEEK_CUR); $raknare = fgetc($oppna);//läser ett tecken $raknare++; echo $raknare; $position = rewind($oppna); $placering = $sokning -3; fseek($oppna, $placering, SEEK_CUR); fwrite($oppna, $raknare); fclose ($oppna); }

Men fortfarande vill den inte... Jag provade att ta bort else helt, och då körs koden. Problemet är då att if-villkoret alltid verkar stämma, den utförs varje gång. Är nybörjare på PHP och jag blir inte klok på detta.

Permalänk

Ska det inte bara vara:
if ($sökning == false) istället för "===" ?

Visa signatur

Anything that can go wrong will go wrong.

Permalänk
Medlem

Nej, inte enligt PHP-manualen: http://se2.php.net/manual/en/function.strpos.php
Men jag har provat med båda, verkar bli samma resultat ändå.

Permalänk
Medlem

Har du testat göra en echo på $sokning innan if-satsen så du ser vad den variabeln innehåller?

Permalänk
Medlem
Skrivet av hamre:

Har du testat göra en echo på $sokning innan if-satsen så du ser vad den variabeln innehåller?

Provade nu, och den skriver ut - ingenting. Provade att ta bort både if och else, och bara skriva ut den variabeln, men den verkar inte innehålla någonting... Nu är jag förvirrad! Varför blir det på detta viset?

Permalänk
Medlem

I länken ovan läs under Return Values vid varningstrianglen, där säger den att den kan returera "", dvs inget ifall det är falskt.

Permalänk
Skrivet av Amöban:

Provade nu, och den skriver ut - ingenting. Provade att ta bort både if och else, och bara skriva ut den variabeln, men den verkar inte innehålla någonting... Nu är jag förvirrad! Varför blir det på detta viset?

felsök bakåt - var får $sokning sitt värde?
är det en funktion som ger värdet?
i så fall: vad får funktionen för input?

skriv ut dessa funktioner och jämför med hur funktionen arbetar

Visa signatur

Pappy :"Backup: Skyddar mot datafel när du på fyllan raderar 200GB pr0n och laddar hem två säsonger teletubbies istället."
Jocke1100 :"Det är väl en mekanisk kylavledning... Typ analog kylpasta..."

Permalänk
Medlem

Måste säga att din fopen med w+ och sen senare file_get_contents på filen ser väldigt skum ut... Ta en närmare titt på vad som faktiskt händer där.

Men som fille3002 föreslår, felsök bakåt från det ställe du märker av problemet. Se vilken data som skickas in till funktionerna, vad dokumentationen säger, och vad som kommer ut.

Permalänk
Medlem
Skrivet av fille3002:

felsök bakåt - var får $sokning sitt värde?
är det en funktion som ger värdet?
i så fall: vad får funktionen för input?

skriv ut dessa funktioner och jämför med hur funktionen arbetar

Skrivet av fourbyfour:

Måste säga att din fopen med w+ och sen senare file_get_contents på filen ser väldigt skum ut... Ta en närmare titt på vad som faktiskt händer där.

Men som fille3002 föreslår, felsök bakåt från det ställe du märker av problemet. Se vilken data som skickas in till funktionerna, vad dokumentationen säger, och vad som kommer ut.

Tack för tipsen - jag hade ju döpt samma variabel till två olika namn, position och placering ska ju vara samma sak. Lyckades dessutom hitta felet som gjorde att höstacken inte fanns, fourbyfour är inne på rätt spår. ändrade w+ till r+, och då fungerade det.. Men varför? Vad är skillnaden? Båda gör ju så man kan läsa och skriva från filen?

Och else fungerar fortfarande inte, men äh, jag tog bort det, och nu har jag en fungerande räknare:

$oppna = fopen("besokslogg.txt", "r+"); $ipadress = $_SERVER['REMOTE_ADDR']; $fransida = $_SERVER['HTTP_REFERER']; $webblasare = $_SERVER['HTTP_USER_AGENT']; $radbrytning = "\r\n"; $hostack = file_get_contents("besokslogg.txt"); $sokning = strpos($hostack, $ipadress); //Returns the position as an integer if ($sokning === false) { $raknare = 0; $allinfo = $raknare . "\t" . 'ip-adress: ' . $ipadress . $radbrytning . 'från: ' . $fransida. $radbrytning . 'webbläsare: ' . $webblasare . $radbrytning; fwrite($oppna, $allinfo); } $placering = rewind($oppna); $placering = $sokning -13; fseek($oppna, $placering, SEEK_SET); $raknare = fgetc($oppna); $raknare++; $placering = rewind($oppna); //sätter pekaren till början $placering = $sokning -13; //sätter pekaren fseek($oppna, $placering, SEEK_SET); //pek fwrite($oppna, $raknare); fclose ($oppna);

Även om det såklart vore intressant att veta varför det inte går att ha allt efter if-satsen inom en else-sats.

Permalänk
Medlem
Skrivet av Amöban:

$placering = rewind($oppna); //sätter pekaren till början $placering = $sokning -13; //sätter pekaren fseek($oppna, $placering, SEEK_SET); //pek

Givande kommentarer jag hade skrivit här då, hehe.

Permalänk
Skrivet av Amöban:

Tack för tipsen - jag hade ju döpt samma variabel till två olika namn, position och placering ska ju vara samma sak. Lyckades dessutom hitta felet som gjorde att höstacken inte fanns, fourbyfour är inne på rätt spår. ändrade w+ till r+, och då fungerade det.. Men varför? Vad är skillnaden? Båda gör ju så man kan läsa och skriva från filen?

Och else fungerar fortfarande inte, men äh, jag tog bort det, och nu har jag en fungerande räknare:

$oppna = fopen("besokslogg.txt", "r+"); $ipadress = $_SERVER['REMOTE_ADDR']; $fransida = $_SERVER['HTTP_REFERER']; $webblasare = $_SERVER['HTTP_USER_AGENT']; $radbrytning = "\r\n"; $hostack = file_get_contents("besokslogg.txt"); $sokning = strpos($hostack, $ipadress); //Returns the position as an integer if ($sokning === false) { $raknare = 0; $allinfo = $raknare . "\t" . 'ip-adress: ' . $ipadress . $radbrytning . 'från: ' . $fransida. $radbrytning . 'webbläsare: ' . $webblasare . $radbrytning; fwrite($oppna, $allinfo); } $placering = rewind($oppna); $placering = $sokning -13; fseek($oppna, $placering, SEEK_SET); $raknare = fgetc($oppna); $raknare++; $placering = rewind($oppna); //sätter pekaren till början $placering = $sokning -13; //sätter pekaren fseek($oppna, $placering, SEEK_SET); //pek fwrite($oppna, $raknare); fclose ($oppna);

Även om det såklart vore intressant att veta varför det inte går att ha allt efter if-satsen inom en else-sats.

din if else - har du testat att sätta värden till false för att tvinga fram ett resultat?

Citat:

$sokning = strpos($hostack, $ipadress); //Returns the position as an integer
$sokning = false; // temporary test value
if ($sokning === false)

Visa signatur

Pappy :"Backup: Skyddar mot datafel när du på fyllan raderar 200GB pr0n och laddar hem två säsonger teletubbies istället."
Jocke1100 :"Det är väl en mekanisk kylavledning... Typ analog kylpasta..."

Permalänk
Medlem
Skrivet av fille3002:

din if else - har du testat att sätta värden till false för att tvinga fram ett resultat?

Japp, provade det nu, och if fungerar om jag sätter värdet till falskt, eller raderar innehållet i besokslogg.txt så sätter den räknare till noll och lagrar infon. Om jag sedan lägger dit else med klammrar så ignoreras koden efter ifsatsen, annars körs den.

Permalänk
Skrivet av Amöban:

Japp, provade det nu, och if fungerar om jag sätter värdet till falskt, eller raderar innehållet i besokslogg.txt så sätter den räknare till noll och lagrar infon. Om jag sedan lägger dit else med klammrar så ignoreras koden efter ifsatsen, annars körs den.

låter som att if-satsen fungerar i så fall? eller slutar koden köras efter else-klammern slutar?

Skrivet av Amöban:

Givande kommentarer jag hade skrivit här då, hehe.

Jag har gjort det för vana att skriva/kopiera ett exempel ungefär som php-manual har gjort (tills man lär sig funktionen helt) och sedan skriva varför man kör funktionerna, istället för att berätta att den sätter ett värde till ett annat (vilket framgår av koden i de flesta fall).
Kommentera och förklara det du inte förstår själv, tills du förstår det. När du förstår vad funktionen gör så behöver du inte berätta det i kommentarerna längre. Testa, och gör din egna variant av det!

Visa signatur

Pappy :"Backup: Skyddar mot datafel när du på fyllan raderar 200GB pr0n och laddar hem två säsonger teletubbies istället."
Jocke1100 :"Det är väl en mekanisk kylavledning... Typ analog kylpasta..."

Permalänk
Medlem
Skrivet av Amöban:

Lyckades dessutom hitta felet som gjorde att höstacken inte fanns, fourbyfour är inne på rätt spår. ändrade w+ till r+, och då fungerade det.. Men varför? Vad är skillnaden? Båda gör ju så man kan läsa och skriva från filen?

Det är jäkligt stor skillnad, ta en titt på fopen i PHP-manualen så står det i klartext. I regel mycket informativa och användbara sidor.

En annan tanke inför framtiden - Vad händer med filuppdateringen om två besökare laddar sidan nästan exakt samtidigt? Det kanske är överkurs för en skoluppgift, men men...

Permalänk
Medlem
Skrivet av fille3002:

låter som att if-satsen fungerar i så fall? eller slutar koden köras efter else-klammern slutar?

Jag har gjort det för vana att skriva/kopiera ett exempel ungefär som php-manual har gjort (tills man lär sig funktionen helt) och sedan skriva varför man kör funktionerna, istället för att berätta att den sätter ett värde till ett annat (vilket framgår av koden i de flesta fall).
Kommentera och förklara det du inte förstår själv, tills du förstår det. När du förstår vad funktionen gör så behöver du inte berätta det i kommentarerna längre. Testa, och gör din egna variant av det!

Det fungerar som följer:

if (statement) { körs som den ska } else { det här körs inte, oavsett om if satsen har körts eller ej. }

Sant det där med kommentarerna, men läser en kurs i PHP nu där läraren vill ha ALLT kommenterat - färdig funktion är ca 30 % kod.

Permalänk
Medlem
Skrivet av fourbyfour:

Det är jäkligt stor skillnad, ta en titt på fopen i PHP-manualen så står det i klartext. I regel mycket informativa och användbara sidor.

En annan tanke inför framtiden - Vad händer med filuppdateringen om två besökare laddar sidan nästan exakt samtidigt? Det kanske är överkurs för en skoluppgift, men men...

Jo, har läst det där, men det är ännu inte glasklart vad skillnaden är i praktiken. Det här är den andra uppgiften jag har gjort i PHP, så ja det där låter lite överkurs.

Permalänk
Medlem

Har du provat med

if (!$sökning !== false)

?

Visa signatur
Permalänk
Medlem
Skrivet av Amöban:

Jo, har läst det där, men det är ännu inte glasklart vad skillnaden är i praktiken.

"truncate the file to zero length" innebär att kasta bort allt som finns i filen kort och gott.

Permalänk
Medlem

<?php date_default_timezone_set("Europe/Stockholm"); function GetLastLine($file) { $line = ""; $f = fopen($file, "r"); $cursor = -1; fseek($f, $cursor, SEEK_END); $char = fgetc($f); while ($char === "\n" || $char === "\r") { fseek($f, $cursor--, SEEK_END); $char = fgetc($f); } while ($char !== false && $char !== "\n" && $char !== "\r") { $line = $char . $line; fseek($f, $cursor--, SEEK_END); $char = fgetc($f); } return $line; } //Write Line $file_hits = file_get_contents("hits.txt"); $ip = $_SERVER['REMOTE_ADDR']; if(!strpos($file_hits,$ip) !== false) { $split = explode(" - ",GetLastLine("hits.txt")); $num = (int) $split[0]; $num++; $write = $num." - ".date("r")." - ".$ip." - "; $browser = "Unknown"; if(isset($_SERVER['HTTP_USER_AGENT'])) $browser = $_SERVER['HTTP_USER_AGENT']; $http_referer = "Unknown"; if(isset($_SERVER['HTTP_REFERER'])) $http_referer = $_SERVER['HTTP_REFERER']; $write .= $browser." - ".$http_referer.PHP_EOL; file_put_contents("hits.txt",$write,FILE_APPEND); } if(empty($write)) echo GetLastLine("hits.txt"); else echo $write; ?>

Visa signatur
Permalänk
Skrivet av Amöban:

Det fungerar som följer:

if (statement) { körs som den ska } else { det här körs inte, oavsett om if satsen har körts eller ej. }

Sant det där med kommentarerna, men läser en kurs i PHP nu där läraren vill ha ALLT kommenterat - färdig funktion är ca 30 % kod.

Jag vet att det brukar vara så, min lärare tyckte likadant - tills jag inte orkade kommentera och istället spenderade tiden till att skriva bättre kod. Fråga läraren hur mycket du behöver kommentera.

Skrivet av Amöban:

Jo, har läst det där, men det är ännu inte glasklart vad skillnaden är i praktiken. Det här är den andra uppgiften jag har gjort i PHP, så ja det där låter lite överkurs.

Kan det ha med att else ligger på raden under att göra?
} else {

Skrivet av XzaR:

<?php date_default_timezone_set("Europe/Stockholm"); function GetLastLine($file) { $line = ""; $f = fopen($file, "r"); $cursor = -1; fseek($f, $cursor, SEEK_END); $char = fgetc($f); while ($char === "\n" || $char === "\r") { fseek($f, $cursor--, SEEK_END); $char = fgetc($f); } while ($char !== false && $char !== "\n" && $char !== "\r") { $line = $char . $line; fseek($f, $cursor--, SEEK_END); $char = fgetc($f); } return $line; } //Write Line $file_hits = file_get_contents("hits.txt"); $ip = $_SERVER['REMOTE_ADDR']; if(!strpos($file_hits,$ip) !== false) { $split = explode(" - ",GetLastLine("hits.txt")); $num = (int) $split[0]; $num++; $write = $num." - ".date("r")." - ".$ip." - "; $browser = "Unknown"; if(isset($_SERVER['HTTP_USER_AGENT'])) $browser = $_SERVER['HTTP_USER_AGENT']; $http_referer = "Unknown"; if(isset($_SERVER['HTTP_REFERER'])) $http_referer = $_SERVER['HTTP_REFERER']; $write .= $browser." - ".$http_referer.PHP_EOL; file_put_contents("hits.txt",$write,FILE_APPEND); } if(empty($write)) echo GetLastLine("hits.txt"); else echo $write; ?>

sssh! skoluppgift, hjälp inte för mycket

Visa signatur

Pappy :"Backup: Skyddar mot datafel när du på fyllan raderar 200GB pr0n och laddar hem två säsonger teletubbies istället."
Jocke1100 :"Det är väl en mekanisk kylavledning... Typ analog kylpasta..."

Permalänk
Medlem
Skrivet av fille3002:

Jag vet att det brukar vara så, min lärare tyckte likadant - tills jag inte orkade kommentera och istället spenderade tiden till att skriva bättre kod. Fråga läraren hur mycket du behöver kommentera.

Kan det ha med att else ligger på raden under att göra?
} else {

sssh! skoluppgift, hjälp inte för mycket

Oj, förlåt. Sen tycker jag det är lite dumt att göra en variabel för allt om du inte ska använda den flera gånger.

Värden för $_SERVER['HTTP_REFERER'] finns inte alltid så det är bättre att du använder "isset" för att kolla om den finns innan. Samma sak kan även gälla $_SERVER['REMOTE_ADDR'] men eftersom det är en skoluppgift kanske det inte behövs. För radbrytning kan du använda dig av PHP_EOL.

($var == false) kan även betyda att $var är 0 eftersom strpos ger värdet 0 om det är första tecknet så går det inte att använda bara == eller !=.

Visa signatur
Permalänk
Medlem

Tack för alla svar och tips, mycket givande. Ni behöver inte oroa er att jag ska klippa klistra nån kod som någon annan har skrivit, när jag skrev att jag hade en fungerande kod så ansåg jag mig klar med den här uppgiften och tänker inte ändra den nåt mer. Men det är ändå intressant att ta del av hur andra tänker. Ska komma ihåg det där med variablerna, http-referer och PHP_EOL.