[PHP] 1 sessievariabele wordt vergeten?

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Beste Tweakers,

Ik ben op het moment bezig een webshop te maken voor het bedrijf waar ik werk. Dit gaat allemaal fantastisch en alles, maar ik kom nu toch even niet verder.

Het probleem is, dat hij 1 sessie de hele tijd vergeet, maar de andere 2 niet. Hij vergeet steeds de fabrikant die ik geselecteerd heb. Ik snap hier erg weinig van! Ik krijg namelijk ook totaal geen foutmeldingen o.i.d.

Als ik print_r($_SESSION); doe, komt dit eruit (wanneer ik net de fabrikant geselecteerd heb):
Array ( [lang] => nl [cats] => ,0 [fabrikant] => 10 )

Dit ziet er goed uit! Maar als ik vervolgens verder ga klikken, komt dit na 1/2/3 klikken op m'n beeldscherm geprint:
Array ( [lang] => nl [cats] => ,0 [fabrikant] => )

En weg is de sessie! Even voor de duidelijkheid, ik maak de sessie zo aan:
PHP:
1
2
3
4
5
6
7
8
9
10
    $fabrikantID = $_POST['selectFabrikant'];
    $FABR_SQL = mysql_query("SELECT id FROM fabrikanten WHERE id='". $fabrikantID ."'") or die();
    if (mysql_num_rows($FABR_SQL) == 0){
        print("<script>window.location='". $_SERVER['HTTP_REFERER'] ."';</script>");
    }else{
        $FABR = mysql_fetch_row($FABR_SQL);
        $_SESSION["fabrikant"] = $FABR[0];
        print("<script>window.location='". $_SERVER['HTTP_REFERER'] ."';</script>");
    }
    mysql_free_result($FABR_SQL);


Het volgende heb ik al geprobeerd:
ini_set("session.gc_maxlifetime", "18000");
ini_set("session.gc_divisor", "100");

en heel GoT en google plat gezocht, maar ik kom er echt niet uit.

Ik hoop dat iemand mij kan helpen

T-Xorcist

Verwijderd

Heb je session_start gebruikt? Deze moet je (meen ik) aanroepen voor je sessions kunt gebruiken.

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 23 november 2006 @ 09:19:
Heb je session_start gebruikt? Deze moet je (meen ik) aanroepen voor je sessions kunt gebruiken.
Ja, dit staat bovenaan dit script. Dit is alleen het gedeelte waar de sessie gezet word. Ik gebruik overal session_start(); bovenaan elke pagina. De andere sessies onthoud hij namelijk wel goed.

[ Voor 5% gewijzigd door Verwijderd op 23-11-2006 09:26 . Reden: xtra info ]


Verwijderd

Ik denk dat je dan toch wat meer informatie moet geven. Wat heb je allemaal nog meer geprobeerd? Vragen zoals:
  • Wat geeft een var_dump als de eerst volgende pagina wordt aangeroepen?
  • En bij een var_dump aan het eind van het script waar de fabrikant wordt gezet?
Met het aanmaken van de sessie is volgens mij niets mis dus het probleem zal hem toch ergens anders in moeten zitten.

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
niet alleen dat, wat doe je om je sessie uit te lezen want het probleem hoeft niet per definitie in het aanmaken te liggen. Waarvoor gebruik je het? Dat is prettig voor de context.
Maw wat doe je allemaal met je sessie en waarvoor gebruik je ze?

Verwijderd

Topicstarter
EnsconcE schreef op donderdag 23 november 2006 @ 09:44:
niet alleen dat, wat doe je om je sessie uit te lezen want het probleem hoeft niet per definitie in het aanmaken te liggen. Waarvoor gebruik je het? Dat is prettig voor de context.
Maw wat doe je allemaal met je sessie en waarvoor gebruik je ze?
Het is een webshop voor gereedschappen. Links in het menu kan je aangeven welke fabrikant je alleen wilt hebben. De overzichten van de producten zoeken dan alleen de records eruit, die van die fabrikant zijn. Daarom gebruik ik die sessie.

Die sessie gebruik ik bijvoorbeeld in het overzicht van de producten:
PHP:
1
2
3
4
5
if ((isset($_SESSION["fabrikant"])) && (is_numeric($_SESSION["fabrikant"]))){
    $FABRIK_SQL = mysql_query("SELECT id, naam FROM fabrikanten WHERE id='". $_SESSION["fabrikant"] ."'") or die("<i>Geen artikelen gevonden</i>");
  }else{
    $FABRIK_SQL = mysql_query("SELECT id, naam FROM fabrikanten") or die(mysql_error());
  }


Het valt wel op, dat als ik details.php (zo heet de file waar het product beschreven word zeg maar) bezocht heb, dat hij dan _altijd_ weg is. Ik snap alleen niet waarom, want ik gebruik hele andere variablen / namen.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Staat register_globals aan en gebruik je ergens $fabrikant ?

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op donderdag 23 november 2006 @ 09:53:
Staat register_globals aan en gebruik je ergens $fabrikant ?
Uit phpinfo();

register_globals On

En ja, ik gebruik ergens $fabrikant

Dit is waarschijnlijk de fout? 8)7

Edit: Ja dus! Dat was de fout? Hoe wist je dat? waarom kan ik dat niet (meer) gebruiken? O+

[ Voor 15% gewijzigd door Verwijderd op 23-11-2006 09:59 . Reden: resultaat ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op donderdag 23 november 2006 @ 09:56:
[...]

Dit is waarschijnlijk de fout? 8)7
Ja, met register_globals op on is $fabrikant == $_SESSION['fabrikant']; dus als je $fabrikant manipuleert manipuleer je ook je sessie-variabele. Leuk hè dat register_globals? :P

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op donderdag 23 november 2006 @ 09:58:
[...]

Ja, met register_globals op on is $fabrikant == $_SESSION['fabrikant']; dus als je $fabrikant manipuleert manipuleer je ook je sessie-variabele. Leuk hè dat register_globals? :P
Dank, ik ga dat meteen uitzetten! Op m'n eigen server stond dat wel uit namelijk, en hier op m'n werk niet... Dank! _/-\o_

Verwijderd

Verwijderd schreef op donderdag 23 november 2006 @ 09:56:
Edit: Ja dus! Dat was de fout? Hoe wist je dat? waarom kan ik dat niet (meer) gebruiken? O+
Je bent niet de eerste die deze fout maakt :)... misschien dat dat je nog wat kan troosten :P

Wat ik me nog af vroeg: zijn er gangbare manieren om hier mee om te gaan? Niet iedereen kan het namelijk zomaar uit zetten en het zal maar wat vaak vreemd gedrag opleveren :)

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

Je zit in je theorie iets fout, je 'ene' sessie verdwijnt niet namelijk. Je hebt een sessie, met daarin meerdere sessie variabelen. Een van die variabelen verdwijnt. Dus:
  • Of je zet ergens die variabele op null of doet een unset
  • Je hele sessie wordt weggeknikkerd, en alle variabelen, op die fabrikant na worden opnieuw aangemaakt (veranderd je sessie ID of blijft dit hetzelfde?)
En niet direct gerelateerd met je vraag, maar met je code. ipv je javascript redirect kun je beter header gebruiken.
PHP:
1
header("Location: ".$_SERVER['HTTP_REFERER']);


Edit; okey, solved, dat kreng ja... ;)

[ Voor 4% gewijzigd door Rowdy.nl op 23-11-2006 10:07 . Reden: Sneller leren typen is handig ]

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Verwijderd

Topicstarter
Verwijderd schreef op donderdag 23 november 2006 @ 10:05:
[...]

Je bent niet de eerste die deze fout maakt :)... misschien dat dat je nog wat kan troosten :P

Wat ik me nog af vroeg: zijn er gangbare manieren om hier mee om te gaan? Niet iedereen kan het namelijk zomaar uit zetten en het zal maar wat vaak vreemd gedrag opleveren :)
Ik denk dat je je variabelen erg specifiek moet benoemen, als dat aan staat. dus bijv. geen $fabrikanten maar $detail_fab_naam o.i.d. Ik noem maar een dwarsstraat.
[b][message=26904810,noline]En niet direct gerelateerd met je vraag, maar met je code. ipv je javascript redirect kun je beter header gebruiken.
PHP:
1
header("Location: ".$_SERVER['HTTP_REFERER']);
Ik ga proberen! Dank! O-)

[ Voor 19% gewijzigd door Verwijderd op 23-11-2006 10:16 ]


  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Verwijderd schreef op donderdag 23 november 2006 @ 10:05:
[...]

Je bent niet de eerste die deze fout maakt :)... misschien dat dat je nog wat kan troosten :P

Wat ik me nog af vroeg: zijn er gangbare manieren om hier mee om te gaan? Niet iedereen kan het namelijk zomaar uit zetten en het zal maar wat vaak vreemd gedrag opleveren :)
Ja, declareer 1 variabele niet voor 2 doelen. Wanneer je in $tijd alleen de tijd opslaat, dan moet je later niet ineens overgaan op het ook opslaan van de datum in die variabele.

Verwijderd

In een klein project is dat misschien nog wel te doen maar wat gebeurt er bij grotere projecten, met name projecten waar meerdere mensen aan werken. Dan is het bovenstaande niet te voorkomen lijkt me.

Je zou dan een naming convention kunnen gebruiken door bijvoorbeeld je sessie variabele te prefixen met 3 underscores (ik weet niet of dit ideaal is :?). Maar ik vroeg me af of er nog andere oplossingen zijn die gebruikt worden (als soort van standaard oplossing).

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
je zou natuurlijk je naam kunnen gebruiken $ENSCONCE_blaat en $DJINGELZ_blaat

Verwijderd

je zou natuurlijk je naam kunnen gebruiken $ENSCONCE_blaat en $DJINGELZ_blaat
Wat gebeurt er dan als meerdere mensen aan verschillende delen van de code werken. Waarbij het natuurlijk ook het geval kan zijn dat persoon A en B kunnen wisselen. Dan moet persoon A dus nog steeds "onthouden" welke variabelen hij heeft gebruikt... en dat lijkt me niet echt optimaal :)

Dus ik zou dit niet als een oplossing willen beschouwen.

Verwijderd

Topicstarter
Dan moet je duidelijke afspraken maken over hoe je alles gaat benoemen. Dat het een éénheid word. Je moet zowiezo weten wat de ander heeft gedaan, als je met dezelfde code bezig bent. Dit kan je weer d.m.v. comments aangeven. Als je allemaal dezelfde manier van coden hebt, en je zet comments erbij, moet dit neem ik aan geen probleem zijn.

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ik werk meestal met een class om variabelen in de sessie weg te schrijven. Die classes initialiseer ik aan het begin van mn script. Ik schrijf dan de inhoud van de sessies weg in klasse variabelen en gooi de sessies leeg.

In de destructor van die klassen heb ik functionaliteit ingebouwd die eerst de sessies weer leeg gooit en dan de sessies weer vult met de klasse variabelen. Zo weet je zeker dat je tijdens het runnen van het script niet iets kan wijzigen aan de sessies buiten de sessie klassen om.

Systeem | Strava


Verwijderd

Misschien een idee om bovenaan je document alle variabelen te benoemen, zonder hier op dat moment een waarde aan toe te kennen:
PHP:
1
2
$var1 = ""; // deze is voor dit
$var2 = ""; // deze is voor dat

enz.

Indien je een nieuwe variabele wil gaan gebruiken, kijk je eerst of die reeds in de lijst staat, zo niet, kan je die gebruiken en zet je hem in de lijst! Is mijns inziens een overzichtelijke manier om overzicht te behouden en geeft in een oogopslag het doel van de pagina weer... beetje vergelijkbaar met hoe je een class opbouwd.

Verwijderd

Brakkie schreef op donderdag 23 november 2006 @ 11:37:
Ik werk meestal met een class om variabelen in de sessie weg te schrijven. Die classes initialiseer ik aan het begin van mn script. Ik schrijf dan de inhoud van de sessies weg in klasse variabelen en gooi de sessies leeg.

In de destructor van die klassen heb ik functionaliteit ingebouwd die eerst de sessies weer leeg gooit en dan de sessies weer vult met de klasse variabelen. Zo weet je zeker dat je tijdens het runnen van het script niet iets kan wijzigen aan de sessies buiten de sessie klassen om.
Deze manier staat me wel aan. Misschien dat ik deze manier ook eens ga bekijken. In ieder geval een interessante oplossing, thanks :)

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 18-09 12:34
[PHP] 1 sessie wordt vergeten?
:'(

Verwijderd

Topicstarter
Sorry meneer! Ow gij groot Nederlandsch wonder der Nederlandsche taal _/-\o_

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat kan ook iets minder sarcastisch. Dankuwel.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
-NMe- schreef op donderdag 23 november 2006 @ 16:21:
Dat kan ook iets minder sarcastisch. Dankuwel.
Ja kom op zeg, het is hier toch geen Nederlands spellings forum? :?
Maargoed, excuses... }:O

[ Voor 5% gewijzigd door Verwijderd op 23-11-2006 16:26 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Dit kan je voortaan ook gewoon via Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/tweakers/images/icons/icon_hand.gif doen ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.

Pagina: 1