[php] Language selector gedraagt zich vreemd

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
Van de week heb ik een kleine functie geschreven, bijna een routine functie, die de geselecteerde taal uit een sessie haalt. Even een aantal stukjes php:

functie om taal op te halen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function get_lang() {
    $nlaat = $_SESSION['lang'];
    echo $nlaat; //debug
    if(!empty($nlaat) && file_exists('./lang/'.$nlaat.'.php')) {
        echo $_SESSION['lang']; //debug
        RETURN $_SESSION['lang'];
    } else {
        $_SESSION['lang'] = 'lang_nl';
        echo $_SESSION['lang']; //debug
        RETURN "lang_nl";
    }
}


script om taal in te stellen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
session_start();
if(!empty($_POST['lang'])) {
    // $_POST['lang'] bevat of lang_nl of lang_en. Als t niet klopt
    // word dat door get_lang wel gezien)
    $_SESSION['lang'] = $_POST['lang'];
    session_write_close();
    if(!empty($_POST['file'])) {
        $return = explode('/',$_POST['file']);
        header("location: ".array_pop($return));
    }
}


verwerking van get_lang():
PHP:
1
2
3
$language = get_lang();
echo $language; //debug
require("./lang/".$language.".php");


de taalbestanden (lang_nl.php en lang_en.php) bevatten simpelweg een array genaamd $lang, waar de taal instaat.

Wat gaat er mis... ik zou het zelf niet weten. Als ik inlog zonder dat er een sessie voor bestond, krijg ik gewoon de nederlandse taal. Stel ik de taal in op iets anders(engels in dit geval, maar ook gewoon nederlands), dan word alles wat iets met taal te maken heeft ineens vervangen door een b. Ook word dan een keer lang_en returned door get_lang(als ik voor engels koos). Als ik dan 1x die pagina vernieuwt word lang_en gereturnt, en als ik dan weer vernieuw of een andere pagina bezoek(het is nog maar 1 pagina nu, duss :p), is het weer lang_nl. Die lang_nl word als sessie opgeslagen, en als ik dan vernieuw, dan is het weer bang_nl, vernieuw ik dan, dan is t weer lang_nl etc. etc. Hij returnt wel constant lang_nl of lang_en(alleen direct na wijziging naar engels). Er zit dus iets goed fout in, maar ik kan maar niet ontdekken waar. Om de een of andere reden word de eerste letter van die sessie veranderd in een b, maar hoe? Wie kan mij helpen? :S

Edit: om het verhaal compleet te maken: $nlaat bevat na r2 van get_lang ineens bang_nl, terwijl $_SESSION['lang'] gewoon lang_nl bevat. ook word gewoon lang_nl of lang_en gereturned. :? Dit alles gebeurt op 2 verschillende servers (eentje W2k3+IIS+PHP, andere Sun Cobalt+Apache1.3+PHP)

Edit zoveel: code toepassing get_lang() aangepast, om te echo'en

[ Voor 120% gewijzigd door RSpliet op 19-03-2004 21:43 ]

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Probeer eerst eens met isset te kijken of $_SESSION['lang'] wel bestaat (in get_lang()). Als je met error_reporting(E_ALL) werkt zou je moeten zien dat PHP niet zo blij is met het bekijken van een niet-bestaande index. Misschien dat het probleem op een of andere vreemde manier daar zit.
Dattie lang_nl en bang_nl is trouwens vrij logisch. lang_nl.php bestaat bij de eerste view waar de sessie geset wordt, dus geen probleem. Bij je 2e view is het bang_nl, en bang_nl.php bestaat niet, dus zet ie de sessie weer op lang_nl, en zo gaat het verder.
Ik zou in ieder geval wat gaan stoeien met de functie isset, en verder is het misschien handig een array op te stellen met alle mogelijke taalnamen, en daarop te controleren (doe je al min of meer mbv die file_exists, maar een array werkt natuurlijk ook, en volgens mij sneller dan het file system van de server benaderen).

Succes. :)

'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.


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Aangezien ik nog nooit van session_write_close() had gehoord heb ik die functie even opgezocht op php.net en daar staat dat de sessie data wordt weggeschreven en de sessie wordt beëindigd. Als je dan naar een andere pagina gaat is er gewoon geen sessie meer om de data uit op te halen.

Ik snap trouwens ook niet waarom je session_write_close() gebruikt, aangezien de sessie-data altijd wordt weggeschreven.

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
in eerste instantie was het verplicht session_start(); en session_write_close(); te gebruiken(toen het nog geen superglobals waren). Met beeindigen werd bedoeld dat ze uit het geheugen werden gehaald, als je dan session_start() weer doet, staan ze er weer.

$_SESSION['lang'] bestaat gewoon, volgens isset (if(isset($_SESSION['lang'])) echo "blegh, hij bestaat"; output gwoon 'blegh, hij bestaat').

[ Voor 23% gewijzigd door RSpliet op 20-03-2004 17:45 ]

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
*iets met topic, schoppen en blauwe plekken*

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
* RSpliet geeft m nog 1x een klein schopje, in de hoop dat iemand het weet :$

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Kan je even een compacte versie online zetten die ook z'n eigen source weergeeft?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
drm: komt eraan, zal er even voor zorgen dat je em ook kan testen(moet worden ingelogd, is Webmail script)

Het script as-is: http://www.seven-soft.com/webmail/
de bron: http ://www.seven-soft.com/webmail/src/ Bestaat niet meer ;)

Het is allemaal gehost op een simpel adsl-lijntje in Engeland (nee, geen FXP zooi oid), dus niet met z'n allen gaan kijken svp ;)

[ Voor 69% gewijzigd door RSpliet op 24-03-2004 20:25 ]

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
*poink :(*

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Ik zie dat je de session_start() hebt staan nadat je al een keer $_SESSION[] hebt gebruikt. Heb je al getest om session_start() daarvoor (bijvoorbeeld op de allereeste regel) te zetten? Ik heb namelijk het idee dat je de sessies pas kunt gebruiken nadat er session_start() is aangeroepen.

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb bij de language files bovenaan gezet:
$lang = Array();

en het werkte hier.
-edit

Samengevatte code:
http://zoek.max-net.nl/test/
Samegevatte code source:
http://zoek.max-net.nl/test/src/

[ Voor 44% gewijzigd door Verwijderd op 24-03-2004 19:38 ]


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
offtopic:
Max, had je dat niet ff op MSN kunnen zeggen... nee, ik kan constant niet online, wegens familieleden (hulde an WLAN, nu nog betaalbaar :()


Max, dit lost een deel van het probleem op. Hij geeft in ieder geval vatsoenlijke taal terug. Echter verandert zodra ik ververs dat ding weer vrolijk in Nederlands (aka. de sessie word nog steeds ver ehh... draait).

Edit: na chatsessie met Max ben ik eruit :p. $_SESSION['lang'] schijnt niet te mogen. Daarom werkt dat hele ding tegen. Dat schpoelie hernoemen naar $_SESSION['language'] did it. Tnx Max :)

[ Voor 21% gewijzigd door RSpliet op 24-03-2004 20:21 ]

Schaadt het niet, dan baat het niet


Acties:
  • 0 Henk 'm!

Verwijderd

Maak van $_SESSION['lang'] eens $_SESSION['language'] :)

-edit
Naja heb je 't in je eigen bericht gezet ;)
Graag gedaan :) (reageerde niet eerder omdat ik me nu pas verveelde)

[ Voor 60% gewijzigd door Verwijderd op 24-03-2004 20:23 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Waarschijnlijk heb je dan registerglobals aan staan en gebruik je ergens in je globale code een een globale $lang variabele. Want in principe zou $_SESSION [ 'lang' ] geen speciale betekenis mogen hebben.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45
drm, zo noemde ik dus die taal-array. * RSpliet heeft ze uitgegooit, voor er nog meer ellende ontstaat tnx uken :)

[ Voor 11% gewijzigd door RSpliet op 24-03-2004 20:28 ]

Schaadt het niet, dan baat het niet

Pagina: 1