[PHP] Sessie variabele niet beschikbaar

Pagina: 1
Acties:
  • 186 views sinds 30-01-2008
  • Reageer

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Ik ben een systeem aan het maken waarmee ik kan bepalen of een pagina voor een surfer wel of niet toegankelijk is.
Er zijn drie groepen: guest, user en admin.

De beveiliging van een pagina gebeurt door bovenaan de pagina dit te zetten:
PHP:
1
<?if (!session_is_registered("SESSION_UserID")) {    session_start();}include("inc/functions.php");CheckPagePerm("guest");?>

De functie CheckPagePerm() ziet er als volgt uit:
PHP:
1
<?# All rights reserved - Michael Kaandorp 2002function QueryDo($inQuery = 0) {    include("inc/config.php");    mysql_connect($CFG_DbHost, $CFG_DbUser, $CFG_DbPass) or die("Unable to connect!");    mysql_select_db($CFG_DbName) or die("Unable to select database: $CFG_DbName!");    $result = mysql_query($inQuery) or die("Error in query: $inQuery. ".mysql_error());    return $result;}function UserIsAdmin($inUserID = 0) {    $query = "SELECT isAdmin FROM users WHERE user_id='$inUserID'";    $result = QueryDo($query);    $r = mysql_fetch_array($result);    $isAdmin = $r["isAdmin"];    if ($isAdmin == "1") {        return TRUE;    } else {        return FALSE;    }}function DrawToolBar() {    if (session_is_registered("SESSION_UserID")) {        $ToolBarText = "User: $SESSION_firstname $SESSION_lastname";    } else {        $ToolBarText = "<a href=login.php>Login</a>";    }    echo"        <table border=0 width=100% cellspacing=0 cellpadding=2>        <tr>            <td align=right bgcolor=#000000>$ToolBarText</td>        </tr>    </table>    ";}function CheckPagePerm($ReqLevel="") {# Usage: On top of every page you should specify the required userlevel by calling this function: CheckPagePerm($ReqLevel);    if ($ReqLevel) {        if ($ReqLevel =="guest") {            # Come on in!        } else {            if ($ReqLevel =="user") {                if (IsLoggedIn() == TRUE) {                    if (CheckIfAllowed("$SESSION_UserID") == TRUE) {                        # Come on in!                    } else {                        # User is not allowed to view this page.                        ShowError("2");                    }                } else {                    # Not logged in.                    ShowError("1");                }            }            if ($ReqLevel =="admin") {                if (IsLoggedIn() == TRUE) {                    if (UserIsAdmin("$SESSION_UserID") == TRUE) {                        # Come on in!                    } else {                        # User is not allowed to view this page.                        ShowError("2");                    }                } else {                    # Not logged in.                    ShowError("1");                }            }        }    } else {        # Design error! Required security level to view page not set!        ShowError("3");    }    }function IsLoggedIn() {    if (session_is_registered("SESSION_UserID")) {        return TRUE;    } else {        return FALSE;    }}function CheckIfAllowed($inUserID = "") {    return TRUE;    }function ShowError($ErrNo = "") {    switch ($ErrNo) {        case 1:            $message = "This page requires you to login. You are not logged in at the moment!";            break;        case 2:            $message = "You are not allowed to view this page!";            break;        case 3:            $message = "Design error! Required security level to view page not set!";            break;        default:            $message = "Unknown error! Please contact your system administrator!";            break;    }    echo $message;}?>

Ik heb de andere functies ook laten staan, maar daar moet je maar ff omheen kijken.

Het probleem is dat ik de volgende error krijg:
code:
1
Warning: Undefined variable: SESSION_UserID in /usr/local/apache/htdocs/photobase/inc/functions.php on line 47

Maar ik zou niet weten waarom SESSION_UserID niet bestaat?!? Ik controleer notabene nog of hij er is en zo niet dan doe ik een session_start();

Iemand een idee?

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Probeer eens als hij het doet zonder quotes...

dus:
if (!session_is_registered(SESSION_UserID)) {

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Nee... Dan geeft ie:
code:
1
Warning: Use of undefined constant SESSION_UserID - assumed 'SESSION_UserID' in /usr/local/apache/htdocs/photobase/permtest.php on line 3

Heeft het misschien te maken met een php.ini foutje?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Quotes moeten er gewoon omheen.. Om die warning weg te krijgen (Deze warning geeft aan dat die var wordt aangeroepen zonder dat deze eventueel gezet is) moet je gebruik maken van de functie isset()

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Welke versie PHP gebruikje... if(versie > 4.1.x) dan kun je ook gebruik maken van $_SESSION... iets wat ik mooier vindt... (persoonlijk)

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Het probleem is gewoon dat $SESSION_UserID helemaal niet beschikbaar is nadat ik een session_start() doe! Ik snap er niks van.

EDIT:
$SESSION_UserID is wel beschikbaar in het normale script, maar niet in de functie die ik binnen dat script aanroep.
Heeft iemand daar een oplossing voor? Moet die $SESSION_UserID global worden o.i.d.?

  • Grum
  • Registratie: Juni 2001
  • Niet online
je moet EERST session_start() doen daarna pas de rest van de functies.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
http://www.php.net/manual/en/function.session-start.php
session_start() creates a session (or resumes the current one based on the session id being passed via a GET variable or a cookie).
Maw met session_start() maak je alle sessie variablen ook weer beschikbaar (dus vandaar dat ie ook altijd session_start() aanriep) :O

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Ik doe toch eerst session start?!?

Voor de duidelijkheid: Het onderste stuk code is functions.php en wordt geinclude in het bovenste.

En het bovenste is de code die ik continue aanroep. En dat begint met die session start.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op maandag 18 maart 2002 11:47 schreef kaandorp het volgende:
Ik ben een systeem aan het maken waarmee ik kan bepalen of een pagina voor een surfer wel of niet toegankelijk is.
Er zijn drie groepen: guest, user en admin.

De beveiliging van een pagina gebeurt door bovenaan de pagina dit te zetten:
PHP:
1
<?if (!session_is_registered("SESSION_UserID")) {    session_start();}include("inc/functions.php");CheckPagePerm("guest");?>
session_is_registerd() vindt niets omdat de sessie nog niet 'hervat' is zodat hij ook nog niet kan controleren of de variable (SESSION_UserID) in de sessievariablen zit.

Daarom geeft hij die warning. SESSION_UserID is nog niet bekend bij PHP. Als je eerst je sessie begint, dan zal PHP ook niet meer klagen.

Sowieso vind ik de if heel erg vaag, omdat je aan het begin van elke pagina de sessie wil starten of hervatten. Dus moet je session_start() uitvoeren.

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Ik heb er nu dit van gemaakt:
PHP:
1
<?session_start();include("inc/functions.php");CheckPagePerm("guest");echo "permtest.php - $SESSION_UserID";?>

Hier is $SESSION_UserID wel beschikbaar, maar in de functie die aangeroepen wordt, CheckPagePerm(), niet!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Welke PHP draai je?

Volgens zijn de session variablen niet automatisch global nl.

  • smaij
  • Registratie: November 2000
  • Laatst online: 11-09 20:36
session_start(); moet direct achter je eerste <?php staan, anders werkt het niet..

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 15:10
Op maandag 18 maart 2002 15:15 schreef Glimi het volgende:
Welke PHP draai je?

Volgens zijn de session variablen niet automatisch global nl.
Die zijn in een functie inderdaad niet global. Voor zover je gewoon de standaard php.ini gebruikt.
Je zult dus in je functie de variabele nog moeten uitlezen met HTTP_SESSION_VARS (even zonder het checken van php.net)

  • Grum
  • Registratie: Juni 2001
  • Niet online
smaij: session_start(); moet direct achter je eerste <?php staan, anders werkt het niet..

onzin ..

en als reactie op de rest van de discussie:

in php 4.0.x staan de sessionvars in HTTP_SESSION_VARS en deze is NIET default global.

in php 4.1.x staan de sessionvars in _SESSION en deze is WEL default global.

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Daar kun je wel eens lelijk gelijk in hebben Grum ;)

Ik heb het zakie nu vervangen door $HTTP_SESSION_VARS['SESSION_UserID'], maar nu zegt ie gewoon dat $HTTP_SESSION_VARS een undefined variable is.

Ben nu de laatste PHP aan het downloaden.

BTW: Hoe maak ik $HTTP_SESSION_VARS dan wel global eigenlijk?

  • Grum
  • Registratie: Juni 2001
  • Niet online
kaandorp: BTW: Hoe maak ik $HTTP_SESSION_VARS dan wel global eigenlijk?

global $HTTP_SESSION_VARS;

:+

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Oke... Laat ik de vraag nog ff iets anders stellen, want ik heb dat global blaat; nu ook geprobeerd, maar dat werkt ook voor geen meter.

Daar komt ie:
Hoe kan ik ervoor zorgen dat als een gebruiker inlogd zijn user_id in een session variabele komt die overal te gebruiken is tijdens die sessie. Dus ook in classes, functions, includes, etc.

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 15:10
Dat zou wel kunnen maar dan zit je met je beveiliging. Ofwel hoe soepeler jij je php.ini instelt hoe makkelijker je aan je variabelen kunt komen.
Als je echter die optimized ini file gebruikt dan zul je zien dat je zelf veel zult moeten doen om variabelen op te vragen en je zult ze zelf door moeten geven aan je functies.
Hierdoor is het ook lastiger voor anderen om te prutsen met je site.

Als je het dus op een live omgeving gaat zetten is het slim om het meteen zo te maken dat je toch sessie variabelen in je functies uitleest m.b.v. $_SESSION in de nieuw versie of op de manier zoals eerder beschreven in de oude versie.

  • Grum
  • Registratie: Juni 2001
  • Niet online
kaandorp: Daar komt ie:
Hoe kan ik ervoor zorgen dat als een gebruiker inlogd zijn user_id in een session variabele komt die overal te gebruiken is tijdens die sessie. Dus ook in classes, functions, includes, etc.


classes: altijd beschikbaar
functions: meegeven of global (eerste natuurlijk preferred)
includes: altijd beschikbaar

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
GRUM> You rock my world! :)

Maar dan even een vraagje gewoon voor interesse. Waarom is zo'n sessie variabele dan niet beschikbaar in een functie? Is dat i.v.m. veiligheid o.i.d.?

  • Grum
  • Registratie: Juni 2001
  • Niet online
zoiets heet 'variable scope'

moet je maar es wat over lezen (even link zoeken)

[edit]
http://www.php.net/manual/en/language.variables.scope.php

[edit2]
het gebruik van global is per definitie slechte code (er zijn een paar uitzonderingen voor te bedenken - niet veel)
Pagina: 1