/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Session-bug eller er det bare mig?
Fra : Thomas Lindgaard


Dato : 15-10-02 16:33

Hejsa

Jeg er lige ved at kode noget, hvor man skal kunne logge ind, og det skal
være muligt at vælge mellem flere sprog.

Derfor har jeg lavet mig en sprog-klasse som læser tekster ind på det
rigtige sprog, og jeg kan kalde en metode for at skrive disse ud på
fornuftige tidspunkter. Jeg har en global instans af denne klasse kaldet
$language.

I min session har jeg gemt det sprog, som brugeren ønsker - dvs.

$_SESSION["language"] = "dk".

Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
overskrevet med mit $language-object, dvs. næste gang man loader en side,
så har man

$_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )

Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?

Mvh.
/Thomas

 
 
Tinky Winky (15-10-2002)
Kommentar
Fra : Tinky Winky


Dato : 15-10-02 16:36

> Jeg er lige ved at kode noget, hvor man skal kunne logge ind, og det skal
> være muligt at vælge mellem flere sprog.
>
> Derfor har jeg lavet mig en sprog-klasse som læser tekster ind på det
> rigtige sprog, og jeg kan kalde en metode for at skrive disse ud på
> fornuftige tidspunkter. Jeg har en global instans af denne klasse kaldet
> $language.

Jeg skal også til at lave noget med forskellige sprog. Hvordan opbevarer du
de forsk. sprog? I XML, php filer, tekst filer eller template filer? Og hvad
er fordele/ulemper ved det du har valgt?



Thomas Lindgaard (15-10-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 15-10-02 17:43

"Tinky Winky" <lksjdflkjzsdhflkajshrlkjaeshr@ksjdhskjdhfkshdfkshdf.com>
wrote in news:aohckt$19b$1@sunsite.dk:

> Jeg skal ogs† til at lave noget med forskellige sprog. Hvordan
> opbevarer du de forsk. sprog? I XML, php filer, tekst filer eller
> template filer? Og hvad er fordele/ulemper ved det du har valgt?

Davs

Jeg har valgt at opbevare mine tekster i noget pseudo-ml - det er hverken
særligt dybsindigt eller specielt smart tror jeg, men det virker.

Ideen var at jeg gerne ville kunne skrive HTML i tekstfilerne, og at jeg
helst ville undgå at lave en masse variable med strenge i. Til hvert
script hører der derfor en tekstfil med indhold i stil med følgende:

<id="første afsnit">
   <h1>Et lille eventyr</h1>

   <p>Der var engang en lille hund, som havde en gevaldig opvask...</p>
</id>
....

Den svend kan man parse med et enkelt kald til preg_match_all (reg.exps
er skønne :) - og så kan man konstruere sig et associativt array:

   $lang_buffer = implode("", file($file));
   $pattern = "/<id=\"(\w+)\">(.*)<\/id>/sU";
   preg_match_all($pattern, $lang_buffer, $matches);

   foreach ($matches[1] as $id => $text)
   {
      $language_array[$text] = $matches[2][$id];
   }

Når det er gjort, er der så bare tilbage at skrive

   $language->get("første afsnit")

hvor det er nødvendigt... og så at oversætte alt mellem <id> og </id> til
Volapyk og Mandarin og sårn.

Fordelen ved systemet er at det virker :) - og når først man har fundet
det rigtige regulære udtryk så kører det bare derudaf. Hvis man gemte det
i XML ville man nok få problemer med at opbevare HTML(?), men det kan vel
løses.

Vi havde engang en lignende diskussion i gruppen, hvor (jeg kan ikke
huske hvem det var) foreslog at gøre det på følgende måde (cirka):

1) Man definerer sig en funktion - f.eks. language($string).

2) Hver gang man skal skrive noget tekst ud, så bruger man bare
language("noget tekst");

3) Når man er færdig med at kode, så kører man alle sine PHP-filer gennem
et stort og lækkert reg.exp som finder alle kald til language() og
tilføjer strengen til et associativt array ala

$language_array = array($string => $string, ...)

4) Så oversætter man

$other_language_array = array($string => $oversættelse, ...)

5) Når man så har fået sine sprogfiler oversat og brugeren vil have
teksten på udenbysk, så vil kaldet til lang() finde dén streng (og
hvis ikke findes på det sprog, så udskrives parameteren til lang()
bare) - dvs. hvis man har oversat til engelsk så

   lang("hej") == "hello"

men hvis man ikke har oversat til udenbysk så

lang("hej") == "hej"

Det synes jeg lyder ret så fiks, men jeg har aldrig fået tid til at prøve
det efter.

Håber du kan bruge noget af det...

Mvh.
/Thomas

Tinky Winky (16-10-2002)
Kommentar
Fra : Tinky Winky


Dato : 16-10-02 21:48

> Jeg har valgt at opbevare mine tekster i noget pseudo-ml - det er hverken
> særligt dybsindigt eller specielt smart tror jeg, men det virker.

> Når det er gjort, er der så bare tilbage at skrive
>
> $language->get("første afsnit")
>
> hvor det er nødvendigt... og så at oversætte alt mellem <id> og </id> til
> Volapyk og Mandarin og sårn.

Hmm har du så de forsk. sprog i forsk. Pseudo-ml filer? Eller bruger du et
oversættelsessystem ala http://babelfish.altavista.com ?

> Fordelen ved systemet er at det virker :) - og når først man har fundet
> det rigtige regulære udtryk så kører det bare derudaf. Hvis man gemte det
> i XML ville man nok få problemer med at opbevare HTML(?), men det kan vel
> løses.

I et konkret tilfælde jeg står overfor, behøver jeg ikke at gemme HTML, men

hvis man fx skal gemme

"Om $x dage vil fristen være udløbet". Og $x kan variere, skal man enten
gemme tingene som
<id="1">Om </id>
<id="2"> dage vil fristen være udløbet</id>

Eller have variablerne inde i sprog filen fx: "Om {DAGE} dage vil fristen
være udløbet".

> 3) Når man er færdig med at kode, så kører man alle sine PHP-filer gennem
> et stort og lækkert reg.exp som finder alle kald til language() og
> tilføjer strengen til et associativt array ala

Altså ændre i sine PHP filer? Det lyder som noget jeg ville være lidt
ængstelig for...

> Håber du kan bruge noget af det...

Ja, det kan jeg skam.



Thomas Lindgaard (17-10-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 17-10-02 11:24

"Tinky Winky" <lksjdflkjzsdhflkajshrlkjaeshr@ksjdhskjdhfkshdfkshdf.com>
wrote in news:aokj9m$5vn$1@sunsite.dk:

> I et konkret tilf‘lde jeg st†r overfor, beh›ver jeg ikke at gemme
> HTML, men
>
> hvis man fx skal gemme
>
> "Om $x dage vil fristen v‘re udl›bet". Og $x kan variere, skal man
> enten gemme tingene som
> <id="1">Om </id>
> <id="2"> dage vil fristen v‘re udl›bet</id>
>
> Eller have variablerne inde i sprog filen fx: "Om {DAGE} dage vil
> fristen v‘re udl›bet".

Det er præcis hvad jeg gør. Jeg har lavet mig en get-metode som man giver
ID på den tekst man vil have fat i, og hvis der er nogle huller som skal
udfyldes, så får den også et array med fyld:

<id="noget tekst">Hej med %hvem% :)</id>

echo $language-get("noget tekst", array("hvem" => "dig"));

giver outputtet

"hej med dig"
>
>> 3) N†r man er f‘rdig med at kode, s† k›rer man alle sine PHP-filer
>> gennem
>> et stort og l‘kkert reg.exp som finder alle kald til language() og
>> tilf›jer strengen til et associativt array ala
>
> Alts† ‘ndre i sine PHP filer? Det lyder som noget jeg ville v‘re lidt
> ‘ngstelig for...

Nej man skal ikke ændre i sine PHP-filer. Pointen med systemet er, at
hvis der er en sprogfil tilgængelig (dvs. man har kørt sin PHP gennem et
reg.exp. og genereret en sprogfil), så bruger man den.

Men hvis den ikke er, så er det ingen katastrofe, fordi language() så
blot skriver sit argument ud - det vil så evt. være på et forkert sprog,
men der vil altid være noget tekst.

Hmm... det ved jeg ikke om det blev bedre forklaret af - men så må du
råbe op igen :)

Mvh.
/Thomas

Tinky Winky (19-10-2002)
Kommentar
Fra : Tinky Winky


Dato : 19-10-02 09:59

> Det er præcis hvad jeg gør. Jeg har lavet mig en get-metode som man giver
> ID på den tekst man vil have fat i, og hvis der er nogle huller som skal
> udfyldes, så får den også et array med fyld:
>
> <id="noget tekst">Hej med %hvem% :)</id>
>
> echo $language-get("noget tekst", array("hvem" => "dig"));
>
> giver outputtet
>
> "hej med dig"

Hvis nu jeg ville lave det i XML, er der så en standard for hvordan man
ville skrive %hvem% ?

> Nej man skal ikke ændre i sine PHP-filer. Pointen med systemet er, at
> hvis der er en sprogfil tilgængelig (dvs. man har kørt sin PHP gennem et
> reg.exp. og genereret en sprogfil), så bruger man den.
>
> Men hvis den ikke er, så er det ingen katastrofe, fordi language() så
> blot skriver sit argument ud - det vil så evt. være på et forkert sprog,
> men der vil altid være noget tekst.
>
> Hmm... det ved jeg ikke om det blev bedre forklaret af - men så må du
> råbe op igen :)

Tjo, nu forstår jeg det lidt bedre...



Thomas Lindgaard (20-10-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 20-10-02 11:34

"Tinky Winky" <lksjdflkjzsdhflkajshrlkjaeshr@ksjdhskjdhfkshdfkshdf.com>
wrote in news:aor6sa$8n4$1@sunsite.dk:

> Hvis nu jeg ville lave det i XML, er der s† en standard for hvordan man
> ville skrive %hvem% ?

Øhhh... ikke en jeg kender :)

Mvh.
/Thomas

Larz (15-10-2002)
Kommentar
Fra : Larz


Dato : 15-10-02 19:12

Thomas Lindgaard wrote:
> I min session har jeg gemt det sprog, som brugeren ønsker - dvs.
>
> $_SESSION["language"] = "dk".
>
> Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
> overskrevet med mit $language-object, dvs. næste gang man loader en side,
> så har man
>
> $_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
>
> Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?

Du skal blot require dit object før du bruger det:

<?php

   require('lang.class.php');
   session_start();
   $sprog = $_SESSION['language'];
   // viola
?>

--
-
Lars
http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
To mail me remove your pants.


Thomas Lindgaard (15-10-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 15-10-02 20:49

Larz <lp@your-pants.coder.dk> wrote in news:KTYq9.108549$Qk5.4819662
@news010.worldonline.dk:

> Du skal blot require dit object f›r du bruger det:
>
> <?php
>
> require('lang.class.php');
> session_start();
> $sprog = $_SESSION['language'];
> // viola
> ?>

Japs - det kunne jeg læse i manualen... men mit problem er, at jeg slet
ikke vil gemme objektet i min session.

Det viser sig bare, at PHP automagisk finder ud af, at jeg har en variabel
som tilfældigvis hedder det samme som en indgang i $_SESSION-arrayet, og
der fylder PHP så variablen ind. Jeg gik ud fra at for at noget blev gemt i
min session, så skulle jeg eksplicit proppe det derind... men det er ikke
tilfældet eller hvad?

Mvh.
/Thomas

Martin Seebach (16-10-2002)
Kommentar
Fra : Martin Seebach


Dato : 16-10-02 11:55


"Thomas Lindgaard" <thomas@it-snedkeren.BLACK_HOLE.dk> wrote in message
news:Xns92A8B2380444Fthomasitsnedkerendk@193.88.15.201...
> $_SESSION["language"] = "dk".
>
> Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
> overskrevet med mit $language-object, dvs. næste gang man loader en side,
> så har man
>
> $_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
>
> Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?

Uden at have forstået dit problem 100% .. men kan du ikke bare kalde
objektet eller language variablen noget andet?


--
Venlig hilsen
Martin Seebach
- min email adresse virker..



Thomas Lindgaard (16-10-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 16-10-02 21:26

"Martin Seebach" <martin-nospam@g-bach.dk> wrote in news:aojghl$dhh$1
@sunsite.dk:

> Uden at have forst†et dit problem 100% .. men kan du ikke bare kalde
> objektet eller language variablen noget andet?

Jeps - det er osse blevet løsningen. Det kom bare bag på mig at min session
lige pludselig indeholdt noget andet end det jeg havde puttet i den
(register_globals har nemlig altid været slået fra i den tid jeg har leget
med sessions).

Mvh.
/Thomas

Hans Lund (16-10-2002)
Kommentar
Fra : Hans Lund


Dato : 16-10-02 14:06

Thomas Lindgaard wrote:

>
>I min session har jeg gemt det sprog, som brugeren ønsker - dvs.
>
> $_SESSION["language"] = "dk".
>
>Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
>overskrevet med mit $language-object, dvs. næste gang man loader en side,
>så har man
>
> $_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
>
>Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?
>
Ja, det er en bug, feature og noget man kan slå fra.
jeg vil umiddelbart gætte på at der i php konfigurationen ( php.ini )
følgende linie:

register_globals = on

så på den måde en feature. problemet er blot at alle variable hermed for
global scope og

$_POST["name"] = $_GET["name"] = $_SESSION["name"] ....... = $NAME

eller rettere alle referere til samme globale interne variabel

først i php 4.2.0 er default værdien i php.ini sat til off.




Thomas Lindgaard (16-10-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 16-10-02 21:29

Hans Lund <halu@daimiNOSPAM.au.dk> wrote in news:aojo7s$12sg$1
@news.net.uni-c.dk:

> s† p† den m†de en feature. problemet er blot at alle variable hermed for
> global scope og
>
> $_POST["name"] = $_GET["name"] = $_SESSION["name"] ....... = $NAME

Det kan du jo godt have en vist formel ret i - sårn har jeg aldrig lige
fået det vendt oppe i mit hovede :)

Det har sjovt nok aldrig generet mig før (og jeg har kodet PHP hver dag i
over 2 år nu)... jeg syn's det er en bug - i hvert fald når det bider mig i
halen :)

Mvh.
/Thomas

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste