Avatar billede mcnovy Nybegynder
03. december 2010 - 14:26 Der er 16 kommentarer og
1 løsning

bruger system - sessions og validering

Hey,

Jeg er ny med PHP,
og er nået til at skal lave et brugersystem..

når jeg trykker mig ind på log ind formen og trykker en forkert kode, så gør den som den skal.

men trykker jeg koden ind rigtigt, så sker der ikke noget..
det er som om at den ikke gemmer noget i min session.

jeg har sat session_start() ind i toppen som man skal så vidt jeg har forstået.
og der virker det ikke..

sætter jeg den derimod under doctype, så kører det fint, men så kommer der til at stå en fejl meddelelse om noget header osv..

min mistanke er at det er fordi at jeg loader filerne igennem includes at den ikke kan finde ud af det..
men hvad er det jeg gør forkert siden at det ikke kan lade sig gøre..?

håber nogle af jer kan overskue det hele, og kan hjælpe..!

på forhånd tak..

hierarki over mappe og filer.

og hvad nogle af filerne indeholder af forhåbentligt relevante info.

rod:
index.php  phpinfo.php  template.php

images:
box_01.png  box_02.png  box_03.png  box_041.png  logo (1).png  logo.png

includes:
admin.php  login_form.php  node.php    top_menu.php
login.php  membersonly.php  session.php  widget.php

settings:
settings.php

theme:
images  main.css

jeg bruger kun siden index.php til at vise data,
og bruger querystrings (omsat med url rewriting) til at skabe en dynamisk side.

når jeg skal logge på
ser index.php sådan her ud. (jeg har fjernet html og styling, da det ikke er vigtigt formoder jeg)

<?php session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?php
require_once('includes/session.php');
require_once './template.php';
require_once('./settings/settings.php');
require('./includes/widget.php');
echo head('bruger system');
echo theme();
?>
<?php
if ($url=="administration" | $url=="badpassword" | $url=="logaf")
{
require('includes/admin.php');
}
else
require('includes/node.php');
?>

min includes/admin.php ser således her ud
<?php
if ($url == "logaf")
{
$_SESSION = array(); //fjern alle session variabler
    session_destroy();
    echo "Du er nu logget af.!";
}
if (isLoggedIn()==false)
require("includes/login_form.php");
else
require("includes/membersonly.php");
?>

login_form.php
<?php
if ($url=="badpassword")
echo "<p>brugernavnet eller koden du har indtastet er ikke korrekt, forsøg igen!</p>";
?>

<form name="login" action="includes/login.php" method="post">
    Brugernavn: <input type="text" name="username" />
    Kodeord: <input type="password" name="password" />
    <input type="submit" value="Log ind" />
</form>

includes/login.php
<?php
require('session.php');
$username = $_POST['username'];
$password = $_POST['password'];

$con = mysql_connect('*****','*****','******');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// some code
mysql_select_db("massage", $con);

$username = mysql_real_escape_string($username);

$query = "SELECT password, salt
        FROM users
        WHERE username = '$username';";
$result = mysql_query($query);

if(mysql_num_rows($result) < 1) //no such user exists
{
    header('Location: ../badpassword');
    die();
}

$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = sha1( $userData['salt'] . sha1($password) );

if($hash != $userData['password']) //incorrect password
{
    header('Location: ../badpassword');
    die();
}
else
{
    validateUser(); //sets the session data for this user
}

header('Location: ../administration');

?>

includes/session.php
<?php
function validateUser()
{
    session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $userid;
}
function isLoggedIn()
{
    if($_SESSION['valid'])
        return true;

    return false;
}
?>
Avatar billede madsens90 Praktikant
03. december 2010 - 14:52 #1
kan se at du i "include/session.php" sætter "$_SESSION['valid'] = 1".

prøv at sæt den til true i stedet.

$_SESSION['valid'] = true;
Avatar billede mcnovy Nybegynder
03. december 2010 - 14:58 #2
Jeg har prøvet at tilføje session_start() før
session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $userid;

så nu står det

session_start()
session_regenerate_id ();
$_SESSION['valid'] = 1;
$_SESSION['userid'] = $userid;

session_start() står allerede i min index.php i toppen, men nu også i min login.php..
er det den rigtige måde..?
Avatar billede mcnovy Nybegynder
03. december 2010 - 14:59 #3
madsen..

virker ikke..

den jeg lige har skrevet ovenover virker tilgengæld.. men det ser bare forkert ud synes jeg..
Avatar billede madsens90 Praktikant
03. december 2010 - 15:02 #4
aaah. beklager at jeg ikke havde opdaget det, havde ellers tænkt inde i mig selv at jeg så din fejl at det var det der var galt. :D

Har selv lavet den fejl 100 gange.

Når din fil "include/session.php" skal hente eller redigerer i sessions er du nød til at starte sessions på den gældne side.

Det vil sige at ALLE sider der skal have noget med det at gøre skal enten have session_start() stående, eller en fil inkluderet med det. :)

Glad for du fik det til at virke!
Avatar billede mcnovy Nybegynder
03. december 2010 - 15:07 #5
Jamen er det ok at have session_start() flere steder..?

kort sat op ser siden jo sådan her ud.

index.php:
session_start();
require('session.php');

session.php:
session_start();
Avatar billede madsens90 Praktikant
03. december 2010 - 15:16 #6
nej, det er ikke ok.

må indrømme at jeg aldrig har sat mig så meget ind i require, require_once, og include (shame on me, lol), men include har altid virket for mig.

prøv:

index.php:
include('includes/session.php');

includes/session.php:
session_start();
Avatar billede mcnovy Nybegynder
03. december 2010 - 15:21 #7
require og include er jo det samme..
require sørger bare for at siden ikke arbejder videre hvis filen mangler. :D

men prøver lige..
synes dog at jeg har prøvet det..!
Avatar billede mcnovy Nybegynder
03. december 2010 - 15:26 #8
ja..

jeg havde prøvet det før, og det virker ikke, da min login.php så ikke kan finde validate funktionen som ligger i session.php.

og hvis jeg includer session.php i login.php, starter den jo session.php mere en een gang..
Avatar billede mcnovy Nybegynder
03. december 2010 - 15:29 #9
sådan her vil siden læse sig selv..

<?php include 'includes/session.php';
?>
<?php
if ($url=="administration" | $url=="badpassword" | $url=="logaf")
{
require('includes/admin.php');
}
else
require('includes/node.php');
?>

//admin.php
<?php
if ($url == "logaf")
{
$_SESSION = array(); //destroy all of the session variables
    session_destroy();
    echo "Du er nu logget af.!";
}
if (isLoggedIn()==false)
require("includes/login_form.php");
else
require("includes/membersonly.php");
?>

//login_form
<?php
if ($url=="badpassword")
echo "<p>brugernavnet eller koden du har indtastet er ikke korrekt, forsøg igen!</p>";
?>
<form name="login" action="includes/login.php" method="post">
    Brugernavn: <input type="text" name="username" />
    Kodeord: <input type="password" name="password" />
    <input type="submit" value="Log ind" />
</form>

//login.php
{
    validateUser(); //sets the session data for this user
}

som skal læse fra session.php som ser sådan her ud..
<?php
session_start();
function validateUser()
{
    session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $userid;
}
function isLoggedIn()
{
    if($_SESSION['valid'])
        return true;

    return false;
}
?>

login.php kan dog ikke finde validateUser()
Avatar billede madsens90 Praktikant
03. december 2010 - 15:32 #10
Okay. Det er meget rodet op i mit hovede det her, ikke mindste fordi vi laver vores filer på flere forskellige måder, og har lidt svært ved at læse din. men nok med de dårlige undskyldninger herfra. ;)

jeg lavet altid en session.php hvori jeg inkluderer de ting der skal være på alle sider.
Der står også session_start() deri.

Så bliver session.php inkluderet på ALLE sider.

login.php, index.php.

men det ser ud til at du i index.php bare skal fjerne session_start(), og så require includes/session.php i stedet, og så sætte session_start() ind i toppen af session.php. :)
Avatar billede mcnovy Nybegynder
03. december 2010 - 15:37 #11
Jeg prøver lidt at ramme noget ala master.pages fra asp.net

dvs, at jeg bruger index.php som en skabelon.

dvs hele siden opbygning kun er i index.php..

på den måde slipper jeg for at lave sidens opbygning mere en een gang. (med <div> osv..)

om det er den rigtige måde at gøre det på ved jeg ikke..
jeg er jo ny til det, men jeg finder det som den mest logiske måde.. (nok fordi at jeg kommer fra asp.net)

men som du kan se i min index.php har jeg fjernet min session_start og lagt ind i session.php.
men det hjælper lige vidt..
Avatar billede madsens90 Praktikant
06. december 2010 - 09:00 #12
Okay, jeg er lige nød til at have en liste over hvilke filer der har inkluderet session.php, og også en bekræftelse på at session.php har HELT i toppen af filen denne linje, og ikke andre steder i nogle filer:

session_start();
Avatar billede mcnovy Nybegynder
06. december 2010 - 12:19 #13
Jamen det er meget simpelt..

det er kun min index.php som indeholder sessions.php

det her er toppen af index.php.

<?php include 'includes/session.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?php
require './template.php';
require './settings/settings.php';
require './includes/widget.php';

og min session.php
<?php
session_start();
function validateUser()
{
    session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $userid;
}
function isLoggedIn()
{
    if($_SESSION['valid'])
        return true;

    return false;
}
?>

det hele virker, undtagen når jeg skal logge på, da er jeg nød til at inkludere session_start();
det er som om at min login.php ikke ser sessions.php
Avatar billede mcnovy Nybegynder
06. december 2010 - 12:24 #14
og det ved jeg godt hvorfor nu..

tror jeg..

min login_form.php ser sådan her ud.

<form name="login" action="includes/login.php" method="post">
    Brugernavn: <input type="text" name="username" />
    Kodeord: <input type="password" name="password" />
    <input type="submit" value="Log ind" />
</form>

og min includes/login.php er en fil, dvs den kører uden at loade min index.php side, som alle mine andre sider gør..

jeg er rimelig sikker på at det er det som er problemet..

bare smid et svar, så får du nogle point for besværet.

tak for hjælpen
Avatar billede madsens90 Praktikant
06. december 2010 - 13:26 #15
Hmm.
Du skriver det kun er index.php der indeholder session.php, men kan se at din login.php også indeholder det?
Er du sikker på at det kun er index.php der har session.php inkluderet?
I så fald skal alle de andre sider, såsom login.php også have session.php inkluderet.

Håber jeg har været til nogen hjælp overhovedet.
Og selvfølgelig hvis du ikke fandt svaret alligevel, så skriv!
Avatar billede mcnovy Nybegynder
06. december 2010 - 13:36 #16
Ja..

det er det som jeg skriver..

min index.php fungere som en master.page (template)
så, ligegyldigt hvilken side jeg går ind på, så er det stadig index.php som jeg loader, og resten foregår "behind the scenes" med include og require.

så når jeg går ind på login_form.php, så er det faktisk bare index.php som loader login_form.php

min fejl lå i at login_form loadede login.php direkte, altså udenom index.php, og derfor blev min session aldrig startet.

men ja.. kunne godt bruge dine svar.. gjorde ihvertfald at jeg fik en åbenbaring.. :D

så tak for hjælpen--.
Avatar billede madsens90 Praktikant
06. december 2010 - 13:52 #17
hehe, jah okay. :P

så lidt. :)
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