Avatar billede TiHs Nybegynder
09. november 2006 - 22:19 Der er 15 kommentarer og
2 løsninger

login script fejler

Hej Eksperter.

Jeg er ved at lave et bruger login i php men jeg
kan ikke få den til at holde fast i min session. Er det fordi
siden der er beskyttet åbnes i en Iframe ?:

Login.html:
<html>
<body>
<h1>Login</h1>
<form action="login.php" method="POST">
Brugernavn:<br>
<input type="text" name="brugernavn"><br>
Kodeord:<br>
<input type="password" name="kodeord"><br>
<input type="submit" value="Login">
</form>
</body>
</html>

login.php:
<?php
session_start();
//Session start skal ALTID være på FØRSTE linje, ellers virker det ikke..

//Så skal vi skabe forbindelse til databasen
mysql_connect('localhost', 'USER', 'KODE');
mysql_select_db("DATABASE");

//Vi skal opfange informationerne fra login formen, det gør vi nu
$brugernavn = $_POST[brugernavn];
$brugernavn = strip_tags($brugernavn);
$brugernavn = mysql_real_escape_string($brugernavn);

$kodeord = $_POST[kodeord];
$kodeord = strip_tags($kodeord);
$kodeord = mysql_real_escape_string($kodeord);

//Så skal vi tjekke om brugeren har skrevet de rigtige oplysninger
$tael = mysql_query("SELECT brugernavn FROM bruger
WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'") or die(mysql_error());
$antal = mysql_num_rows($tael);
if($antal == 1){

//Hvis det var rigtige oplysninger, skal vi sætte en session
$_SESSION['loget_in'] == 1;


//Så sender vi brugeren til hans/hendes profil
echo "du er nu logget ind. Fortsæt: <p><a href=\"beskyttetside.php\">her</a></p>";
} else {
header('Location: login.html');
}
?>


beskyttetside.php:
<?php
session_start();
if($_SESSION['loget_in'] == 1){
exit;
}
else
{
header ("location: login.html");
}
php?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Villaholdet</title>
<style type="text/css">
<!--
body {
    margin-top: 0px;
    background-color: #000000;
    background-image: url();
}
.style1 {color: #FFFFFF}
a:link {
    color: #FFFFFF;
    text-decoration: none;
}
a:visited {
    color: #FFFFFF;
    text-decoration: none;
}
a:hover {
    color: #999999;
    text-decoration: none;
}
a:active {
    text-decoration: none;
}
-->
</style>
</head>
<body>
Mere html
</body>
</html>
Avatar billede ellebaek Nybegynder
09. november 2006 - 22:21 #1
$_SESSION['loget_in'] == 1;

denne linie skal ændres til:
$_SESSION['loget_in'] = 1;

det du gør i første linie er at du sammenligner sessionen med 1...
Avatar billede coderdk Praktikant
09. november 2006 - 22:22 #2
Prøv at lave:

if($_SESSION['loget_in'] == 1){
exit;
}
else
{
header ("location: login.html");
}

om til:

if ( empty( $_SESSION['loget_in'] ) )
{
  header( "location: login.html" );
  exit;
}
Avatar billede coderdk Praktikant
09. november 2006 - 22:22 #3
Plus det som ellebaek skriver, ja :-D
Avatar billede ellebaek Nybegynder
09. november 2006 - 22:23 #4
altså i login.php... selve koden skal se ud som:

<?php
session_start();
//Session start skal ALTID være på FØRSTE linje, ellers virker det ikke..

//Så skal vi skabe forbindelse til databasen
mysql_connect('localhost', 'USER', 'KODE');
mysql_select_db("DATABASE");

//Vi skal opfange informationerne fra login formen, det gør vi nu
$brugernavn = $_POST[brugernavn];
$brugernavn = strip_tags($brugernavn);
$brugernavn = mysql_real_escape_string($brugernavn);

$kodeord = $_POST[kodeord];
$kodeord = strip_tags($kodeord);
$kodeord = mysql_real_escape_string($kodeord);

//Så skal vi tjekke om brugeren har skrevet de rigtige oplysninger
$tael = mysql_query("SELECT brugernavn FROM bruger
WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'") or die(mysql_error());
$antal = mysql_num_rows($tael);
if($antal == 1){

//Hvis det var rigtige oplysninger, skal vi sætte en session
$_SESSION['loget_in'] = 1;
/***Det er denne linie jeg har rettet */

//Så sender vi brugeren til hans/hendes profil
echo "du er nu logget ind. Fortsæt: <p><a href=\"beskyttetside.php\">her</a></p>";
} else {
header('Location: login.html');
}
?>
Avatar billede coderdk Praktikant
09. november 2006 - 22:30 #5
Joh, samme kode, pænere (og små fejl som glemte ' i $_POST rettet):

<?php

    session_start();
    //Session start skal ALTID være på FØRSTE linje, ellers virker det ikke..
   
    //Så skal vi skabe forbindelse til databasen
    mysql_connect('localhost', 'USER', 'KODE');
    mysql_select_db("DATABASE");
   
    //Vi skal opfange informationerne fra login formen, det gør vi nu
    $brugernavn = $_POST['brugernavn'];
    $brugernavn = strip_tags($brugernavn);
    $brugernavn = mysql_real_escape_string($brugernavn);
   
    $kodeord = $_POST['kodeord'];
    $kodeord = strip_tags($kodeord);
    $kodeord = mysql_real_escape_string($kodeord);
   
    //Så skal vi tjekke om brugeren har skrevet de rigtige oplysninger
    $tael = mysql_query("SELECT brugernavn FROM bruger
        WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'")
        or die(mysql_error());
    $antal = mysql_num_rows($tael);
    if ($antal == 1)
    {
        //Hvis det var rigtige oplysninger, skal vi sætte en session
        $_SESSION['loget_in'] = 1;
        /***Det er denne linie jeg har rettet */
       
        //Så sender vi brugeren til hans/hendes profil
        echo "du er nu logget ind. Fortsæt: <p><a href=\"beskyttetside.php\">her</a></p>";
    }
    else
    {
        header('Location: login.html');
    }

?>

Plus det jeg nævnte :)
Avatar billede TiHs Nybegynder
09. november 2006 - 22:43 #6
Fantastisk. Det kører bare.
Et lille spm. mere. Jeg har givet alle brugere et ekstra id i tabellen som jeg også selv opretter. Dette Id kalder jeg 'aid'. Jeg vil så lave et ekstra tjek når de går ind på en sikker side om lige denne bruger må åbne siden. Altså en user level. Hvor og hvad skal jeg sætte ind i mit check på den beskyttedeside.php Sammen med:
<?php
session_start();
if ( empty( $_SESSION['loget_in'] ) )
{
  header( "location: login.html" );
  exit;
}
php?>

og hvad mangler jeg evt. i login.php

... kan jeg iøvrigt ikke sætte tid på sessionen også ?

MANGE MANGE TAK FOR HJÆLPEN.
Avatar billede coderdk Praktikant
09. november 2006 - 22:48 #7
I login.php skal du rent faktisk hive noget ud, og sætte f.eks. $_SESSION['level']


Jeg ville lave en include, loginprotect.php:

<?php

if ( empty( $_SESSION['loget_in'] ) )
{
  header( "location: login.html" );
  exit;
}

function requireLevel( $minLevel )
{
  if ( $_SESSION['level'] < $minLevel )
  {
      header( "location: too-low-level.html" );
      exit;
  }
}

?>

Så kan du i beskyttetside.php skrive:

<?

  session_start();
  require_once( "loginprotect.php" );
  requireLevel(1);

  // ...resten her

?>

Så sætter du bare requireLevel(10); så kan folk kun komme ind hvis $_SESSION['level'] er 10 eller over - ellers bliver de redirected til too-low-level.html :)
Avatar billede ellebaek Nybegynder
09. november 2006 - 22:50 #8
du kan bare smide det id ind i din session i stedet...

altså at du i stedet bruger:

<?php

    session_start();
    //Session start skal ALTID være på FØRSTE linje, ellers virker det ikke..
 
    //Så skal vi skabe forbindelse til databasen
    mysql_connect('localhost', 'USER', 'KODE');
    mysql_select_db("DATABASE");
 
    //Vi skal opfange informationerne fra login formen, det gør vi nu
    $brugernavn = $_POST['brugernavn'];
    $brugernavn = strip_tags($brugernavn);
    $brugernavn = mysql_real_escape_string($brugernavn);
 
    $kodeord = $_POST['kodeord'];
    $kodeord = strip_tags($kodeord);
    $kodeord = mysql_real_escape_string($kodeord);
 
    //Så skal vi tjekke om brugeren har skrevet de rigtige oplysninger
    $tael = mysql_query("SELECT brugernavn, aid FROM bruger
        WHERE brugernavn = '$brugernavn' AND kodeord = '$kodeord'")
        or die(mysql_error());
    $antal = mysql_num_rows($tael);
    if ($antal == 1)
    {
        $row = mysql_fetch_array($tael);
        //Hvis det var rigtige oplysninger, skal vi sætte en session
        $_SESSION['loget_in'] = $row[1];
        /***Det er denne linie jeg har rettet */
     
        //Så sender vi brugeren til hans/hendes profil
        echo "du er nu logget ind. Fortsæt: <p><a href=\"beskyttetside.php\">her</a></p>";
    }
    else
    {
        header('Location: login.html');
    }

?>

nu har du så aid i din session i stedet...
så kan du lave dit tjek på denne måde i stedet på den anden side...

<?php
session_start();
$level_id = 2 //Det niveau en bruger skal have for at måtte komme ind på siden...
if ( empty( $_SESSION['loget_in'] ) || $_SESSION['loget_in'] != $level_id)
{
  header( "location: login.html" );
  exit;
}
php?>
Avatar billede ellebaek Nybegynder
09. november 2006 - 23:04 #9
men jeg må finde min seng...

satser på det virker det sidste jeg forslog, og vover pelsen at smide et svar her :-)

Fortsat god aften til jer begge..

..Ellebæk!
Avatar billede coderdk Praktikant
09. november 2006 - 23:06 #10
Ja, I lige måsen! :) Smider også lige et svar :)
Avatar billede TiHs Nybegynder
09. november 2006 - 23:09 #11
ellebæk: Den giver:
Parse error: syntax error, unexpected T_IF in /beskyttetside.php on line 4
Altså:if ( empty( $_SESSION['loget_in'] ) || $_SESSION['loget_in'] != $level_id)
Avatar billede TiHs Nybegynder
09. november 2006 - 23:26 #12
I får selvfølgelig lige jeres point ... men håber jeg lige kan få hjælp til at gøre den helt færdig ... syntes ikke jeg har kunne finde den sidste fejl jeg skrev. Tak for hjælpen indtil videre ....
Avatar billede ellebaek Nybegynder
09. november 2006 - 23:33 #13
sover ikk helt endnu :-)

$level_id = 2 //Det niveau en bruger skal have for at måtte komme ind på siden...

jeg manglede et ; i denne linie, altså:

$level_id = 2; //Det niveau en bruger skal have for at måtte komme ind på siden...

:-)
Avatar billede TiHs Nybegynder
10. november 2006 - 11:48 #14
Yes yes ... det virker fint nu. Og det virker med flere levels på
samme side også :o))
Nu skal jeg så bare lige finde ud af om jeg kan lave en sessions levetid så man på et tidspunkt bliver nød til at logge på igen ved opdatering af siden ....
Avatar billede coderdk Praktikant
10. november 2006 - 13:34 #15
ini_set("session.cookie_lifetime", 600); // 10 minutters sessionslevetid

:)

Eller i .htaccess:

php_value session.cookie_lifetime 600
Avatar billede TiHs Nybegynder
10. november 2006 - 13:48 #16
Hvor sætter jeg den ind ?
På selve den beskyttede side ? og før/efter start_session()?
Avatar billede coderdk Praktikant
10. november 2006 - 14:00 #17
Det er nemmest at lave en .htaccess fil i roden af dit website og smide flg. indhold ind:

php_value session.cookie_lifetime 600


Så lever alle sessions 10 minutter (altså max. 10 min. inaktivitet) for alle scripts - ini_set kan sættes ind før session_start()...

I stedet for ini_set kan du også bruge:

session_set_cookie_params( 600 );

Igen: Før session_start()
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