[PHP] Global probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Ik heb een relatief simpele functie geschreven. Deze functie checkt of er een cookie geset is, aan de hand van de inhoud van het cookie maakt hij een MySQL verbinding en checkt welke klantnaam daarbij hoort.

So far so good. Maar de klantnaam wil ik graag opslaan in een session variable. Maar door problemen met de scope wil dat niet echt lukken. Kheb nu al zoveel globals, locals en weet ik het allemaal gezien, dat ik even door de bomen het bos niet zie.

Wie kan mij helpen ? Hieronder volgt de code (helemaal standaard, wat dus sowieso niet werkt, maar omdat ik van alles al geprobeerd had, heb ik dat er weer ff uitgesloopt.)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
  function check_klantnaam()
  {
    if(isset($HTTP_COOKIE_VARS["cookie"]))
    {
      $username = $HTTP_COOKIE_VARS["cookie"];
      $db = mysql_connect("localhost", "user", "pass");
      mysql_select_db("database");
      $idquery = "select klantid from users where username='" . $username . "'";
      $idresult = mysql_query($idquery);
      $idrow = mysql_fetch_array($idresult);
      $klantId = $idrow['klantId'];
      $naamquery = "select naam from klanten where klantId='" . $klantId . "'";
      $naamresult = mysql_query($naamquery);
      $klantrow = mysql_fetch_array($naamresult);
      $klantnaam = $klantrow['naam'];
      $HTTP_SESSION_VARS['klantnaam'] = $klantnaam;
      $HTTP_SESSION_VARS['klantId'] = $klantId;
      mysql_close();
    }
  }
  check_klantnaam();
  echo $HTTP_SESSION_VARS['klantnaam'];
  echo $HTTP_SESSION_VARS['klantId'];
?>


En even voor de duidelijkheid, de onderste session variables bestaan dus niet..........

[ Voor 16% gewijzigd door Massiefje op 08-12-2003 09:56 ]


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
moet vast $_SESSION worden

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

$HTTP_ vars zijn niet global in scope, $_COOKIE en $_SESSION daarentegen wel.
Als je toch persé $HTTP_ vars wilt gebruiken moet je die in je functie als global declareren.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
crisp schreef op 08 december 2003 @ 09:57:
$HTTP_ vars zijn niet global in scope, $_COOKIE en $_SESSION daarentegen wel.
Als je toch persé $HTTP_ vars wilt gebruiken moet je die in je functie als global declareren.
Klinkt logisch, dus dat had ik ook geprobeerd. Werkt desondanks dus niet :(

Misschien een kleine uitbreiding, zodat iemand misschien een duidelijker antwoord heeft: ik wil, nadat iemand is ingelogd, eigenlijk 3 dingen opslaan: username, klantnaam en klantId. De username wordt nu in een cookie gestored. Wat doe ik met die overige 2 ? Ik maak daar nu dus $session vars van. Maar misschien is er een betere manier ??

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Misschien domme vraag, maar staat er bovenaan de pagina wel session_start(); :?

[ Voor 6% gewijzigd door OkkE op 08-12-2003 10:30 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
OkkE schreef op 08 december 2003 @ 10:30:
Misschien domme vraag, maar staat er bovenaan de pagina wel session_start(); :?
Is zeker geen domme vraag, want stel je voor dat het daaraan zou liggen ;)

Maar helaas, die session_start(); staat er ja. Dus daar ligt het ook niet aan. Wel bedankt voor de tip !

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Van dit stukje code raak ik al het overzicht kwijt van wat welke variabele nou is en wat z'n scope is. Kun je geen scope prefixes gebruiken?
PHP:
1
2
3
4
5
6
7
8
9
10
class Foo {

   var $m_bar;   // member variable

   function( $p_param ) {   // parameter variable

      $g_username = $_COOKIE['username'];   // global variable
      $l_klantId = 12;   // local variable
   }
}

Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt het beste 2 variabelen wegschrijven naar een cookie, namelijk het klantId en een sessionId.... Vervolgens sla je de combinatie van klantId en sessionId op in een aparte tabel waarmee je kunt controleren of die combinatie geldig is. Vervolgens haal je de username en alle overige informatie op (na het checken van de geldigheid van het cookie natuurlijk) uit de database!

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Misschien een domme vraag, maar wat is het verschil tussen
code:
1
$HTTP_SESSION_VARS['username']
en
code:
1
$_SESSION['username']
?

Ik dacht dat het gewoon een verschillende manier van schrijven was.........

[ Voor 13% gewijzigd door Massiefje op 08-12-2003 10:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

$_SESSION is a 'superglobal', or automatic global, variable. This simply means that it is available in all scopes throughout a script. You don't need to do a global $_SESSION; to access it within functions or methods, as you do with $HTTP_SESSION_VARS.

$HTTP_SESSION_VARS contains the same information, but is not an autoglobal.

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Verwijderd schreef op 08 december 2003 @ 10:47:
$_SESSION is a 'superglobal', or automatic global, variable. This simply means that it is available in all scopes throughout a script. You don't need to do a global $_SESSION; to access it within functions or methods, as you do with $HTTP_SESSION_VARS.

$HTTP_SESSION_VARS contains the same information, but is not an autoglobal.
Als ik in bovenstaande functie van de $HTTP_SESSION_VARS['username'] nu $_SESSION['username'] maak, dan werkt het nog steeds niet. Ik zie iets over het hoofd, maar ik weet niet wat. Ben vannacht ook nog aardig wat uurtjes hiermee bezig geweest........

Acties:
  • 0 Henk 'm!

Verwijderd

Probeer eens dit:

PHP:
1
2
3
4
5
<?php
print "<pre>";
print_r $_SESSION;
print "</pre>";
?>


En dan dit stukje code natuurlijk invoegen op de plek waar je het nodig hebt en niet in een leeg bestand ;)

"<?php" en "?>" kun je dan natuurlijk ook weglaten :)

Op deze manier kun je zien wat er allemaal in de global $_SESSION aanwezig is en kun je ook zien aan welke key van de array precies de username is toegewezen (als ie al is toegewezen).

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Verwijderd schreef op 08 december 2003 @ 11:09:
Probeer eens dit:

PHP:
1
2
3
4
5
<?php
print "<pre>";
print_r $_SESSION;
print "</pre>";
?>


En dan dit stukje code natuurlijk invoegen op de plek waar je het nodig hebt en niet in een leeg bestand ;)

"<?php" en "?>" kun je dan natuurlijk ook weglaten :)

Op deze manier kun je zien wat er allemaal in de global $_SESSION aanwezig is en kun je ook zien aan welke key van de array precies de username is toegewezen (als ie al is toegewezen).
Parse error: parse error, unexpected T_VARIABLE in ................. bla

Acties:
  • 0 Henk 'm!

Verwijderd

Kun je even je code hierin zetten? Dan kan ik even kijken waar de fout zit... :)

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Verwijderd schreef op 08 december 2003 @ 11:12:
Kun je even je code hierin zetten? Dan kan ik even kijken waar de fout zit... :)
Let's try:

ik heb een stukje code:

code:
1
2
3
require("functions.php");
    echo "Logged in as: <br/>";
    echo $HTTP_SESSION_VARS['klantnaam'] . "<br/><br/>";


en in functions.php staat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
  function check_klantnaam()
  {
    if(isset($HTTP_COOKIE_VARS["cookie"]))
    {
      $username = $HTTP_COOKIE_VARS["cookie"];
      $db = mysql_connect("localhost", "user", "pass");
      mysql_select_db("database");
      $idquery = "select klantid from users where username='" . $username . "'";
      $idresult = mysql_query($idquery);
      $idrow = mysql_fetch_array($idresult);
      $klantId = $idrow['klantId'];
      $naamquery = "select naam from klanten where klantId='" . $klantId . "'";
      $naamresult = mysql_query($naamquery);
      $klantrow = mysql_fetch_array($naamresult);
      $klantnaam = $klantrow['naam'];
      $HTTP_SESSION_VARS['klantnaam'] = $klantnaam;
      $HTTP_SESSION_VARS['klantId'] = $klantId;
    }
  }
  check_klantnaam();
?>


en meer is het niet........

Acties:
  • 0 Henk 'm!

Verwijderd

En met deze regel:

echo $HTTP_SESSION_VARS['klantnaam'] . "<br/><br/>";

krijg je de klantnaam op het scherm? Waarschijnlijk niet, want dat is je probleem neem ik aan?

Ik zou in ieder geval geen gebruik maken van $HTTP_SESSION_VARS, maar van $_SESSION. Als je dit wilt doen moet je natuurlijk wel de toekenning aan deze variabele veranderen. Als je vervolgens waarden hebt toegekend aan de array $_SESSION kun je de hele inhoud hiervan op het scherm krijgen met de functie print_r(). Deze functie moet je niet binnen echo gebruiken, maar juist in plaats van echo! Dus je doet eigenlijk gewoon een regel toevoegen "print_r($_SESSION);". Ik was net geloof ik de haakjes vergeten :X

"<pre>" en "</pre>" kun je trouwens ook gewoon weglaten, die zorgen alleen voor iets betere leesbaarheid van je array!

[ Voor 12% gewijzigd door Verwijderd op 08-12-2003 11:25 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Het probleem zit hem nog steeds in $HTTP_* vs $_*. $HTTP_SESSION_VARS en $HTTP_COOKIE_VARS zijn helemaal niet bekend binnen je funtie, omdat deze niet automatisch global zijn. Het alleen veranderen van $HTTP_SESSION_VARS in $_SESSION levert niets op, omdat hij dan alsnog niet door de if() heen komt. Verander dus ook $HTTP_COOKIE_VARS in $_COOKIE

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Verwijderd schreef op 08 december 2003 @ 11:24:
En met deze regel:

echo $HTTP_SESSION_VARS['klantnaam'] . "<br/><br/>";

krijg je de klantnaam op het scherm? Waarschijnlijk niet, want dat is je probleem neem ik aan?

Ik zou in ieder geval geen gebruik maken van $HTTP_SESSION_VARS, maar van $_SESSION. Als je dit wilt doen moet je natuurlijk wel de toekenning aan deze variabele veranderen. Als je vervolgens waarden hebt toegekend aan de array $_SESSION kun je de hele inhoud hiervan op het scherm krijgen met de functie print_r(). Deze functie moet je niet binnen echo gebruiken, maar juist in plaats van echo! Dus je doet eigenlijk gewoon een regel toevoegen "print_r($_SESSION);". Ik was net geloof ik de haakjes vergeten :X

"<pre>" en "</pre>" kun je trouwens ook gewoon weglaten, die zorgen alleen voor iets betere leesbaarheid van je array!
Ik krijg inderdaad NIET de klantnaam op het scherm en dat is wel wat ik wil. Maar als ik in de functio niet $HTTP_SESSION_VARS['klantnaam'] maar $_SESSION['klantnaam'] gebruik (en dat natuurlijk ook in de eerste code), dan komt er nog niets uit en volgens print_r($_SESSION) staat er ook niets in de $_SESSION-array.....

Ik kom volgens mij dichter bij de oplossing, maar ik ben er nog niet :(

Acties:
  • 0 Henk 'm!

Verwijderd

Dan lijkt het erop alsof je de $_SESSION array niet gevuld kunt krijgen.... Het is trouwens waar dat je ook $_COOKIE moet gebruiken, maar daar was je misschien zelf al wel op gekomen. Dan zit je nog steeds met het probleem dat je $_SESSION niet gevuld krijgt. Zou je dat stukje code hier even neer kunnen zetten, de toekenning van de variabelen dus? En je hebt wel session_start() gedaan hè?

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Verwijderd schreef op 08 december 2003 @ 11:34:
Dan lijkt het erop alsof je de $_SESSION array niet gevuld kunt krijgen.... Het is trouwens waar dat je ook $_COOKIE moet gebruiken, maar daar was je misschien zelf al wel op gekomen. Dan zit je nog steeds met het probleem dat je $_SESSION niet gevuld krijgt. Zou je dat stukje code hier even neer kunnen zetten, de toekenning van de variabelen dus? En je hebt wel session_start() gedaan hè?
De toekenning van de variabelen staat dus in functions.php die hierboven al gepost is. Maar daar zit hem dus ook het probleem, mijns insziens........ Als je nog meer code wilt hebben, graag even zeggen welke code, maar volgens mij heb je alle belangrijke code al..........

Heb je trouwens MSN of zo ?

Acties:
  • 0 Henk 'm!

Verwijderd

Ja, dat heb ik ook ;) Misschien wel wat eenvoudiger, maar ik heb nu eerst een werkbespreking!

MSN: sander_vink@hotmail.com

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Uiteraard mag ieder ander ook nog steeds DE oplossing aandragen..... ;)

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Volgens mij is de oplossing al een paar keer aangedragen.
Als je nu eens een stukje code probeert/plaatst met gebruik van $_SESSION en $_COOKIE in plaats van dat gedoe met $HTTP_****** want die laatste is dus niet autoglobal.

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
mocean schreef op 08 december 2003 @ 12:38:
Volgens mij is de oplossing al een paar keer aangedragen.
Als je nu eens een stukje code probeert/plaatst met gebruik van $_SESSION en $_COOKIE in plaats van dat gedoe met $HTTP_****** want die laatste is dus niet autoglobal.
Dan had je dit ook moeten lezen:
Ik krijg inderdaad NIET de klantnaam op het scherm en dat is wel wat ik wil. Maar als ik in de functio niet $HTTP_SESSION_VARS['klantnaam'] maar $_SESSION['klantnaam'] gebruik (en dat natuurlijk ook in de eerste code), dan komt er nog niets uit en volgens print_r($_SESSION) staat er ook niets in de $_SESSION-array.....

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Massiefje schreef op 08 december 2003 @ 12:40:
Dan had je dit ook moeten lezen:
(...)
Ja maar daarin doe je niet wat hij zegt. Je vergeet namelijk ook $HTTP_COOKIE_VARS te verangen voor $_COOKIE.
Nu is $HTTP_COOKIE_VARS niet bekend in je functie en levert een isset van een onbekende variabele false op. Gevolg is dus dat er staat:
PHP:
1
2
3
4
5
6
7
function check_klantnaam()
  {
    if( false )
    {
      //do some shit
    }
  }
zou dat gaan werken denk je?

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 09-09 14:07
Glimi schreef op 08 december 2003 @ 13:23:
[...]
Ja maar daarin doe je niet wat hij zegt. Je vergeet namelijk ook $HTTP_COOKIE_VARS te verangen voor $_COOKIE.
Nu is $HTTP_COOKIE_VARS niet bekend in je functie en levert een isset van een onbekende variabele false op. Gevolg is dus dat er staat:
PHP:
1
2
3
4
5
6
7
function check_klantnaam()
  {
    if( false )
    {
      //do some shit
    }
  }
zou dat gaan werken denk je?
Kijk, mah bad :+ Sorry :D

HET WERKT !!!!!!!!!!!

Thank everybody !!!!!!!

[ Voor 5% gewijzigd door Massiefje op 08-12-2003 13:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als ik dit bericht lees dan zie ik inderdaad al een aantal keren het antwoord voorbij komen.

Zet in je functie de regel:
code:
1
global $HTTP_COOKIE_VARS, $HTTP_SESSION_VARS;


en het moet werken. De $HTTP_ waardes moeten in functies eerst global gemaakt worden.
Makkelijker is het om $HTTP_COOKIE_VARS en $HTTP_SESSION_VARS respectievelijk te vervangen door $_COOKIE en $_SESSION. Deze zijn altijd global (superglobals).

Als dit niet het probleem is dan weet ik het ook niet meer.

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij staat er al dat het werkt ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 08 december 2003 @ 13:36:
Als ik dit bericht lees dan zie ik inderdaad al een aantal keren het antwoord voorbij komen.

Zet in je functie de regel:
code:
1
global $HTTP_COOKIE_VARS, $HTTP_SESSION_VARS;


en het moet werken. De $HTTP_ waardes moeten in functies eerst global gemaakt worden.
Makkelijker is het om $HTTP_COOKIE_VARS en $HTTP_SESSION_VARS respectievelijk te vervangen door $_COOKIE en $_SESSION. Deze zijn altijd global (superglobals).

Als dit niet het probleem is dan weet ik het ook niet meer.
Ik weet niet waar jij dit leest hoor, maar die $HTTP_ of $_ heten niet voor niets super-globals, dus waarom zou je eerst global $var gebruiken?

[ Voor 4% gewijzigd door Verwijderd op 08-12-2003 14:28 ]


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Verwijderd schreef op 08 december 2003 @ 14:28:
[...]
Ik weet niet waar jij dit leest hoor, maar die $HTTP_ of $_ heten niet voor niets super-globals, dus waarom zou je eerst global $var gebruiken?
De $HTTP_ varianten zijn geen superglobals. Check de docs maar op PHP.net B)

Deze varianten zijn al deprecated door PHP.net. De enige reden om deze varianten nu nog te gebruiken is voor backwards compatibility met oudere PHP versies of als je gedwongen ben met PHP versies lager dan 4.1 te werken ;)

[ Voor 18% gewijzigd door pjonk op 08-12-2003 14:45 ]

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 08 december 2003 @ 13:55:
Volgens mij staat er al dat het werkt ;)
waarschijnlijk op het zelfde moment geschreven :)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 08 december 2003 @ 14:28:
[...]
Ik weet niet waar jij dit leest hoor, maar die $HTTP_ of $_ heten niet voor niets super-globals, dus waarom zou je eerst global $var gebruiken?
http://nl2.php.net/manual/en/reserved.variables.php
This is a 'superglobal', or automatic global, variable. This simply means that it is available in all scopes throughout a script. You don't need to do a global $_COOKIE; to access it within functions or methods, as you do with $HTTP_COOKIE_VARS.
Hier dus...... :O
Pagina: 1