Avatar billede n-emy Nybegynder
23. november 2005 - 20:41 Der er 9 kommentarer og
2 løsninger

Problemer med cookie i firefox?

Hey,

Jeg har følgene kode der skal tjekke om en besøgene har en cookie fra min side gemt og logger personen ind hvis det passer med infoen fra databasen:

if($_COOKIE[ng_login] && $_COOKIE[ng_pass] && !$_SESSION[my_id]) {

$cookie1 = mysql_query("SELECT * FROM brugersystem WHERE brugernavn = '$_COOKIE[ng_login]'");
$cookie = mysql_fetch_array($cookie1);
        if($cookie[kodeord] == $_COOKIE[ng_pass]) {
$brugernavn = $cookie[brugernavn];
session_register(brugernavn);
$kodeord = $cookie[kodeord];
session_register(kodeord);
$my_id = $cookie[id];
session_register(my_id);


$tid = TIME();
$logindantal = $r_tjek[loginds]+1;

mysql_query("UPDATE brugersystem SET loginds = '$logindantal',sidst_klik = '0',sidst_dag='$dag',sidst_dato='$dato',sidst_mon='$mon',sidst_year='$year',sidstlogind='$tid' WHERE id = '$r_tjek[id]'");

$ip5 = $r_tjek[ipfire];
$ip4 = $r_tjek[iptre];
$ip3 = $r_tjek[ipto];
$ip2 = $r_tjek[ipet];
$ip = $_SERVER['REMOTE_ADDR'];
mysql_query("UPDATE brugersystem SET ipfem = '$ip5' WHERE id = '$r_tjek[id]'");
mysql_query("UPDATE brugersystem SET ipfire = '$ip4' WHERE id = '$r_tjek[id]'");
mysql_query("UPDATE brugersystem SET iptre = '$ip3' WHERE id = '$r_tjek[id]'");
mysql_query("UPDATE brugersystem SET ipto = '$ip2' WHERE id = '$r_tjek[id]'");
mysql_query("UPDATE brugersystem SET ipet = '$ip' WHERE id = '$r_tjek[id]'");
?>
<script language="javascript">
location.replace('index.php');
</script>
<?

        } else {
                setcookie("ng_login", "1", time()-3600);
                setcookie("ng_pass", "1", time()-3600);
        }
} else {
   
}

I IE fungere det fint, men i FF får jeg følgene fejl:

Warning: Cannot modify header information - headers already sent by (output started at include/database.php:117) in index.php on line 75

Warning: Cannot modify header information - headers already sent by (output started at include/database.php:117) in index.php on line 76

Linie 117 i database ser sådan ud:

<script type="text/javascript">

Linie 75 & 76 i index.php ser sådan ud:
setcookie("ng_login", "1", time()-3600);
setcookie("ng_pass", "1", time()-3600);

Hvad er fejlen?
Avatar billede jakobdo Ekspert
23. november 2005 - 21:08 #1
Jeg har prøvet at rette en smule i din kode, håber den er lidt lettere at overskue for dig og måske andre:

<?php
session_start();
//Nogen connect til DB...

//Er brugeren logget ind i forvejen?
if(empty($_SESSION['my_id']) && !isset($_SESSION['my_id']))
{
    //Er login og kodeord gemt som en cookie?
    if(!empty($_COOKIE['ng_login']) && !empty($_COOKIE['ng_pass']))
    {
        //Escaper input, så vi undgår SQL injections
        $login = mysql_real_escape_string($_COOKIE['ng_login']);
        $pass  = mysql_real_escape_string($_COOKIE['ng_pass']);
        $cookie_sql = mysql_query("SELECT * FROM brugersystem WHERE brugernavn = '".$login."' AND kodeord = '".$pass."' LIMIT 1");
       
        //Fandt vi en gyldig bruger?
        if(mysql_num_rows($cookie_sql)>0)
        {
            //Ja det gjorde vi!
            $cookie_row = mysql_fetch_array($cookie_sql);
            $_SESSION['brugernavn'] = $cookie_row['brugernavn'];
            $_SESSION['kodeord']    = $cookie_row['kodeord'];
            $_SESSION['my_id']      = $cookie_row['id'];
           
            $tid = TIME();
            $logindantal = $r_tjek[loginds]+1;

            mysql_query("UPDATE brugersystem SET loginds = loginds+1,sidst_klik = '0',sidst_dag='$dag',sidst_dato='$dato',sidst_mon='$mon',sidst_year='$year',sidstlogind=NOW() WHERE id = '".$_SESSION['my_id']."' LIMIT 1");
           
            //Denne kode forstår jeg slet ikke meningen med...
            /*
            $ip5 = $r_tjek[ipfire];
            $ip4 = $r_tjek[iptre];
            $ip3 = $r_tjek[ipto];
            $ip2 = $r_tjek[ipet];
            $ip = $_SERVER['REMOTE_ADDR'];
            mysql_query("UPDATE brugersystem SET ipfem = '$ip5' WHERE id = '$r_tjek[id]'");
            mysql_query("UPDATE brugersystem SET ipfire = '$ip4' WHERE id = '$r_tjek[id]'");
            mysql_query("UPDATE brugersystem SET iptre = '$ip3' WHERE id = '$r_tjek[id]'");
            mysql_query("UPDATE brugersystem SET ipto = '$ip2' WHERE id = '$r_tjek[id]'");
            mysql_query("UPDATE brugersystem SET ipet = '$ip' WHERE id = '$r_tjek[id]'");
            */
            header("location: index.php");
        }
        else
        {
            //Nej, vi fandt ingen bruger i databasen...
        }
    }
    else
    {
        //Nej, brugeren havde ikke gemt login og kodeord i en cookie.
    }
}
else
{
    //Brugeren er ikke logget ind...
}
Avatar billede johan.o Nybegynder
24. november 2005 - 01:19 #2
..hvad er fejlen ?

Fejlen er at når du prøver at sætte (slette) dine cookies, så er der allerede sendt noget til klienten. Umiddelbart er det linjerne hvor du hopper ud af php og sender <script osv... til klienten. jakobdo foreslår at du udskifter dette segment med header("location: index.php"); og derved forbliver i php, hjælper det ?

Men jeg syntes det lyder mærkeligt at der er forskel på hvilken browser du ser siderne i, umiddelbart burde det være det samme da php jo 'køres' på serveren.

Mvh. Johan
Avatar billede n-emy Nybegynder
24. november 2005 - 19:11 #3
Fik det til at virke i FF nu også.

Men når jeg så prøver at logge ud og prøver at redifinere cookien:

setcookie("ng_login", "1", time()-3600);
setcookie("ng_pass", "1", time()-3600);

Så logger den alligevel ind bagefter med den gamle cookie, cookien bliver altså ikke overskrevet?
Avatar billede johan.o Nybegynder
24. november 2005 - 22:14 #4
Hvad sker der efter setcookie("ng_login", "1", time()-3600); ?

Jeg kunne forestille mig at hvis du ikke sender noget output til browseren så bliver cookierne aldrig sat (slettet) i browseren.

Prøv evt. at skrive en header("location: ..din_side.."); hvor 'din_side' evt. er den side hvor man logger ind.

Mvh. Johan
Avatar billede n-emy Nybegynder
25. november 2005 - 10:02 #5
Fik det til at virke nu:)

Tak for hjælpen:)

Svar?
Avatar billede johan.o Nybegynder
25. november 2005 - 10:18 #6
Hvem vil du have svar fra ? :)

Bruger du de ændringer jakobdo viste dig for at 'sikre' din database bedre ?

Mvh. Johan
Avatar billede n-emy Nybegynder
29. november 2005 - 21:12 #7
brugte begge 2:)

Så jer begge? :)
Avatar billede johan.o Nybegynder
29. november 2005 - 21:44 #8
Jamen så værsgo :)
Avatar billede jakobdo Ekspert
29. november 2005 - 22:08 #9
Svar!
Avatar billede jakobdo Ekspert
06. december 2005 - 21:41 #10
Takker for point!
Avatar billede johan.o Nybegynder
06. december 2005 - 23:17 #11
Ditto :)
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