Vindstille Skrevet 13. juni 2006 Del Skrevet 13. juni 2006 (endret) Hei. Har problemer med et login script. Det virker som scriptet ikke skjønner at brukeren er logget inn. Er det noen som kan være skikkelig greie å se hva jeg har gjort feil? <?php $run_login_while=true; session_start(); include 'db-info.php'; echo $_SESSION['id']; echo $_SESSION['username']; echo $_SESSION['permission']; echo $_SESSION['lastlogin']; echo $_SESSION['ip']; echo $_SESSION['login']; //FUNCTIONS function check_already_loggedin() { //Printer ut greier i topp.php $fourhours=3600*4; $twoweeks=86400*14; if($_SESSION['login']==true) { //Vis under if($_SESSION['lastlogin']+$fourhours > time() && $_SESSION['ip']==$_SERVER['REMOTE_ADDR']) { $session_loggedin=true; //Printer ut i topp.php echo 'Check logged inn 1'; echo '<br />'; } elseif($_SESSION['lastlogin']+$twoweeks > time() && $_SESSION['remember']==true) { $session_loggedin=true; //Printer ut i topp.php echo 'Check logged inn 2'; echo '<br />'; } //end elseif else { //kun til feilsøking. Skal vises vis ip ikke riktig eller dato er utgått $_SESSION['login']=false; $login_display_login='Login ikke valid'; } } //end if unset($fourhours); unset($twoweeks); } //end function while($run_login_while==true) { if(isset($_GET['logout'])) { session_destroy(); $login_display_login='Du er nå logget ut.'; break; } //Alrady logged in? check_already_loggedin(); if($session_loggedin==true) { echo 'Break if already logged inn'; break; } echo 'Break funket ikke etter første checkloggedin()'; //Vis brukeren ikke er logget inn, skjer alt som er nedenfor. session_destroy(); //Vis ikke bruker sendt brukernavn og passord if(!$_POST['username']) { $login_display_login='Bruker har ikke sendt noen input informasjon.'; break; } //Skjekker om Brukernavn og passord er skrevet inn riktig if($_POST['username']=="" || $_POST['password']=="") { $login_display_login='Du har ikke skrevet inn brukernavn og passord.'; break; } if(preg_match("/[^a-z0-9]/i", $_POST['username']) || preg_match("/[^a-z0-9]/i", $_POST['password'])) { $login_display_login='Brukernavn eller passord inneholder tegn som ikke er lov.'; break; } //Velger database $mysql_selected = mysql_select_db($mysql_database, $mysql_connect); if (!$mysql_selected) { $login_display_login="Kunne ikke kontakte databasen.<br />Vennligst prøv igjen en annen gang."; break; } //Skjekker om riktig login i database $_POST['password']=md5($_POST['password']); $query="SELECT id,username,permission FROM users WHERE username='$_POST[username]' AND password='$_POST[password]'"; //string til DB $result=mysql_query($query,$mysql_connect); if(mysql_num_rows($result)==0) { mysql_close($mysql_connect); $login_display_login="Brukernavn og/eller passord er feil.<br />$password"; //$login_display_login='Brukernavn og/eller passord er feil.<br />'; break; } $mysql_row=mysql_fetch_row($result); $_SESSION['id']=$mysql_row['id']; $_SESSION['username']=$mysql_row['username']; $_SESSION['permission']=$mysql_row['permission']; $_SESSION['lastlogin']=time(); $_SESSION['ip']=$_SERVER['REMOTE_ADDR']; $_SESSION['login']=true; //If input fra brukeren sier husk passord lagrer det i en session variable if($_POST['remember']==true) { $_SESSION['remember']=true; } elseif($_POST['remember']==false) { $_SESSION['remember']=false; } echo 'Break funket ikke etter siste checkloggedin()'; //Vis ikke innlogget $login_display_login='Det har skjedd en feil.'; //Kutter løkken break; } //end while($run_login_while==true) //IN TOPP.php //PRINTER UT LOGIN FORM if($login_display_login) { echo '<div id="login">'; echo "\n"; echo '<h2>Logg inn!</h2>'; echo "\n"; if($login_display_login!='no') {echo "<p>$login_display_login</p>";} echo "\n"; if($_GET['logout']) {echo '<form action="',$_SERVER['PHP_SELF'],'" method="post">';} else {echo '<form action="" method="post">';} echo ' <p> Brukernavn: <input type="text" name="username" /><br /> Passord: <input type="password" name="password" /><br /> Husk passord: <input type="checkbox" name="remember" /><br /> <a href="glemt_passord.php">Glemt passordet</a><br /> <input type="submit" value="Logg inn" /></p> </form>'; echo "\n"; echo '</div>'; } //end if($login_display_login) elseif($session_loggedin==true) { echo '<div id="login">'; echo "Hei $_SESSION[username]."; echo '<br />'; echo '<a href="',$_SERVER['PHP_SELF'],'?logout=true">Logg ut</a>'; echo '</div>'; } ?> Endret 13. juni 2006 av JonT Lenke til kommentar
ZoRaC Skrevet 13. juni 2006 Del Skrevet 13. juni 2006 (endret) må ha "return $session_loggedin;" i funksjonen. Bytt ut check_already_loggedin(); if($session_loggedin==true) { med if (check_already_loggedin()===true) { Har ikke studert så nøye, så kan være mer feil. Edit: Hvorfor "break;" i hver if? Edit 2: Hvorfor "while ($run_login_while==true)"? Endret 13. juni 2006 av ZoRaC Lenke til kommentar
Vindstille Skrevet 13. juni 2006 Forfatter Del Skrevet 13. juni 2006 (endret) Takk for svar, men det funket ikke. EDIT: Fordi det er ikke vits i at hele scriptet kjøres vis brukeren f.eks. skal logget ut. Og i steden for å bruke masse if setninger bruker jeg heller en while setning med break. Men fordi scriptet må kjøre det som står nederst kan jeg ikke kutte hele scriptet med å bruke exit(); Endret 13. juni 2006 av JonT Lenke til kommentar
ZoRaC Skrevet 13. juni 2006 Del Skrevet 13. juni 2006 Du har jo masse if'er likevel, hva med å bruke if og elseif istede? Ser noe annet rart... alle $_SESSION-variabler "forsvinner" når brukeren logger ut (session_destroy) eller nettleseren lukkes. Derfor vil $_SESSION['lastlogin'] aldri være så mye som 2 uker og sjeldent så mye som 4 timer gammel. I tillegg sjekker du i praksis om $_SERVER['REMOTE_ADDR'] er like seg selv... Tror ikke jeg helt skjønner hva du vil med deler av scriptet:P Lenke til kommentar
Vindstille Skrevet 13. juni 2006 Forfatter Del Skrevet 13. juni 2006 (endret) Ser noe annet rart... alle $_SESSION-variabler "forsvinner" når brukeren logger ut (session_destroy) eller nettleseren lukkes. Derfor vil $_SESSION['lastlogin'] aldri være så mye som 2 uker og sjeldent så mye som 4 timer gammel. I tillegg sjekker du i praksis om $_SERVER['REMOTE_ADDR'] er like seg selv... Tror ikke jeg helt skjønner hva du vil med deler av scriptet:P 6301234[/snapback] Når brukeren trykker loggut. Skal han logge ut. Skal de ikke være mulig å logge inn igjen. Derimot når brukeren lokker vindu og har trykket "husk passord" skal man ikke trenge å logge inn. Dette funker ikke fordi man må ende hvor lenge session cocien skal være aktiv i php.ini Får å få ekstra sikkerhet tar jeg å skjekker om IP adressen fra den gangen personen logget inn er den samme som det den er nå. (Vis det ikke har gått mer enn 4 timer og brukeren har krysset av for "husk passord") Dermed unngår jeg at noen kan bare rappe cocien og så få tilgang til siden. Vis det er noe feil med dette bare si ifra. Har gjørt som du sa med while løkken og gjørt det om til if/ifelse. Endringen gjorde at jeg oppdaget at jeg hadde glemt å skjekke $_POST. Har endret litt på scriptet, men har fortsatt en feil. Etter at jeg har printet ut brukernavnet fra MySQL serveren er username variabelen tom. Er det noen som vet hva som er feil med det? ZoRaC: Tusen takk for all hjelpen. EDIT: OPS! Glemte å legge ut scriptet: <?php $run_login_while=true; session_start(); include 'db-info.php'; echo $_SESSION['id']; echo $_SESSION['username']; echo $_SESSION['permission']; echo $_SESSION['lastlogin']; echo $_SESSION['ip']; echo $_SESSION['login']; //FUNCTIONS function check_already_loggedin() { //Printer ut greier i topp.php $fourhours=3600*4; $twoweeks=86400*14; if($_SESSION['login']==true) { if($_SESSION['lastlogin']+$fourhours > time() && $_SESSION['ip']==$_SERVER['REMOTE_ADDR']) { $session_loggedin=true; //Printer ut i topp.php } elseif($_SESSION['lastlogin']+$twoweeks > time() && $_SESSION['remember']==true) { $session_loggedin=true; //Printer ut i topp.php } //end elseif } //end if unset($fourhours); unset($twoweeks); return $session_loggedin; } //end function if(isset($_GET['logout'])) { session_destroy(); $login_display_login='Du er nå logget ut.'; } //Alrady logged in? elseif(check_already_loggedin()===true) { echo 'Du er allerede logget inn'; $session_loggedin=true; } //Vis brukeren ikke er logget inn, skjer alt som er nedenfor. elseif($_POST) { session_destroy(); //Vis ikke bruker sendt brukernavn og passord if(!$_POST['username']) { $login_display_login='Bruker har ikke sendt noen input informasjon.'; } //Skjekker om Brukernavn og passord er skrevet inn riktig elseif($_POST['username']=="" || $_POST['password']=="") { $login_display_login='Du har ikke skrevet inn brukernavn og passord.'; } elseif(preg_match("/[^a-z0-9]/i", $_POST['username']) || preg_match("/[^a-z0-9]/i", $_POST['password'])) { $login_display_login='Brukernavn eller passord inneholder tegn som ikke er lov.'; } else { //Velger database $mysql_selected = mysql_select_db($mysql_database, $mysql_connect); if (!$mysql_selected) { $login_display_login="Kunne ikke kontakte databasen.<br />Vennligst prøv igjen en annen gang."; } //Skjekker om riktig login i database $_POST['password']=md5($_POST['password']); $query="SELECT id,username,permission FROM users WHERE username='$_POST[username]' AND password='$_POST[password]'"; //string til DB $result=mysql_query($query,$mysql_connect); if(mysql_num_rows($result)==0) { mysql_close($mysql_connect); $login_display_login="Brukernavn og/eller passord er feil.<br />$password"; //$login_display_login='Brukernavn og/eller passord er feil.<br />'; } $mysql_row=mysql_fetch_row($result); $_SESSION['id']=$mysql_row['id']; $_SESSION['username']=$mysql_row['username']; if(empty($mysql_row['username'])) {echo 'Username er tomt';} $_SESSION['permission']=$mysql_row['permission']; $_SESSION['lastlogin']=time(); $_SESSION['ip']=$_SERVER['REMOTE_ADDR']; $_SESSION['login']=true; //If input fra brukeren sier husk passord lagrer det i en session variable if($_POST['remember']==true) { $_SESSION['remember']=true; } elseif($_POST['remember']==false) { $_SESSION['remember']=false; } //Skjekker om innlogget if(check_already_loggedin()===true) { $session_loggedin=true; } else { //Vis ikke innlogget $login_display_login="Det har skjedd en feil"; } } //end else } //end elseif($_POST) else { $login_display_login=''; } //IN TOPP.php //PRINTER UT LOGIN FORM if($login_display_login) { echo '<div id="login">'; echo "\n"; echo '<h2>Logg inn!</h2>'; echo "\n"; if($login_display_login!='no') {echo "<p>$login_display_login</p>";} echo "\n"; if($_GET['logout']) {echo '<form action="',$_SERVER['PHP_SELF'],'" method="post">';} else {echo '<form action="" method="post">';} echo ' <p> Brukernavn: <input type="text" name="username" /><br /> Passord: <input type="password" name="password" /><br /> Husk passord: <input type="checkbox" name="remember" /><br /> <a href="glemt_passord.php">Glemt passordet</a><br /> <input type="submit" value="Logg inn" /></p> </form>'; echo "\n"; echo '</div>'; } //end if($login_display_login) elseif($session_loggedin===true) { echo '<div id="login">'; echo "Hei $_SESSION[username]."; echo '<br />'; echo '<a href="',$_SERVER['PHP_SELF'],'?logout=true">Logg ut</a>'; echo '</div>'; } ?> Endret 13. juni 2006 av JonT Lenke til kommentar
ZoRaC Skrevet 13. juni 2006 Del Skrevet 13. juni 2006 Har ikke tid til å se mer på det akkurat nå, men du blander begrepene COOKIES og SESSION. En session lagres på serveren med en SID (Session ID) i en cookie på klienten. Når du lukker browseren vil session bli slettet og ingenting ligger igjen på klienten (annet enn en ubukelig cookie med bare en SID lagret). Om du vil "huske" ting mellom hvert besøk må du lagre dette i en cookie, se litt på php.net/setcookie. Lenke til kommentar
Vindstille Skrevet 13. juni 2006 Forfatter Del Skrevet 13. juni 2006 Ok. Viste ikke det. Takk for tipset. Men er det en annen mulighet for å gjøre dette enn å bruke Cookies og MySQL? Lenke til kommentar
Vindstille Skrevet 14. juni 2006 Forfatter Del Skrevet 14. juni 2006 Fant problemet. Jeg hadde kalt opp $mysql_row['id'] og det funket ikke. Jeg måtte bruke $mysql_row[0] istedenfor. Men går det an å bruke $mysql_row['id'] istedenfor? I så fall. Hvordan gjør man det? Lenke til kommentar
ZoRaC Skrevet 14. juni 2006 Del Skrevet 14. juni 2006 1. Man _MÅ_ ikke ha MySQL, men det er jo mye lettere å jobbe med enn flatfil. 2. Eneste måte å "huske" noe mellom 2 besøk fra samme PC er cookies. Ellers kan man lagre IP i databasen og sjekke dette, men IP'er endres jo, så det er kanskje ikke å anbefale. 2. Bytt ut "mysql_fetch_row" med "mysql_fetch_assoc"... Lenke til kommentar
Vindstille Skrevet 14. juni 2006 Forfatter Del Skrevet 14. juni 2006 Takk. Akkurat det jeg lette etter. Lenke til kommentar
Peter Skrevet 14. juni 2006 Del Skrevet 14. juni 2006 mysql_fetch_object er penere etter min mening $row->mitt_felt 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å