Avatar billede tubdk1983 Nybegynder
06. oktober 2011 - 11:08 Der er 25 kommentarer og
1 løsning

Problemer med $_POST

Hej eksperter.

Jeg sidder med følgende kode til at skifte sprog på en hjemmeside.
Hensigten er der først skal tjekkes om den ligger en cookie i forvejen, og skifte side herefter.
Hvis brugeren efterfølgende skifter sprog via formen, skal der laves en ny cookie og derefter skiftes side til det valgte sprog.

<?php
if (isset($_COOKIE['userlang'])) {
    $userlang = $_COOKIE['userlang'];
    if ($userlang <> 'en')
        header("Location: ../$userlang/{$userlang}_home.php");
}
if (isset($_POST['newuserlang'])) {
    $newuserlang = $_POST['newuserlang'];
    setcookie('userlang', "{$newuserlang}", time()+60*60*24*1095, '/');
    if ($newuserlang <> 'en')
    header("Location: ../$newuserlang/{$newuserlang}_home.php");
}
?>

Formen til at skifte sprog ser således ud.

<form class="language_menu" action="en_home.php" method="post">
    <select name="newuserlang" onchange="this.form.submit();">
        <option name="newuserlang" type="text" value="en" selected="selected">English</option>
        <option name="newuserlang" type="text" value="da">Dansk</option>
    </select>
<noscript><input type="submit" value="Change"></noscript>
</form>

Det virker super godt på min lokale apache server, men når jeg uploader det til min udbyder, virker det ikke.
Jeg har efterfølgende læst at, det kan have noget med globals at gøre, de er slået fra af sikkerhedsmæssige årsager og at man skal undgå at bruge dem.

Jeg har brugt et par timer på at læse op på, hvordan jeg så kan konstruere min kode, men jeg kan ikke finde ud af det.

Kan I hjælpe?
Avatar billede w13 Novice
06. oktober 2011 - 11:23 #1
Det kan være en god idé at enable sessions, inden du bruger cookies.

Så sæt følg. oppe i toppen af koden, hvis du ikke har det:
session_start();
Avatar billede tubdk1983 Nybegynder
06. oktober 2011 - 11:54 #2
Tak for input, det er hermed gjort. Der har dog ikke indflydelse på slut resultatet. =/
Avatar billede majbom Novice
06. oktober 2011 - 12:27 #3
er det cookie-if'en eller form-if'en der ikke virker?
Avatar billede tubdk1983 Nybegynder
06. oktober 2011 - 12:38 #4
Det er form if'en, der sker ingenting.
Avatar billede w13 Novice
06. oktober 2011 - 12:43 #5
Kommer den slet ikke ind i form if'en, eller hvilken linje går den i stå ved? Prøv evt. at echo'e undervejs.

Og ikke at jeg tror, det har nogen betydning for problemet, men er der nogen grund til, at du har:
name="newuserlang"
på dine <option>'s? Det skal vel kun være på <select>'en.
Avatar billede tubdk1983 Nybegynder
06. oktober 2011 - 12:44 #6
Avatar billede w13 Novice
06. oktober 2011 - 12:54 #7
tubdk1983: ?
Avatar billede tubdk1983 Nybegynder
06. oktober 2011 - 13:45 #8
Jeg har fat i min udbyder, det viser sig at de kører php v4.2.3. Lol?
Avatar billede majbom Novice
06. oktober 2011 - 18:52 #9
4.2.3?? det var da en latterlig gammel version!
Avatar billede tubdk1983 Nybegynder
07. oktober 2011 - 14:10 #10
Hej jeg har fået opdateret php'en, men det virker stadig ikke.

Det er følgende if-sætning der ikke bliver aktiveret.

if (isset($_POST['newuserlang'])) {
    $newuserlang = $_POST['newuserlang'];
    setcookie('userlang', "{$newuserlang}", time()+60*60*24*1095, '/');
    if ($newuserlang <> 'en')
    header("Location: ../$newuserlang/{$newuserlang}_home.php");
}
Avatar billede tubdk1983 Nybegynder
07. oktober 2011 - 14:21 #11
Og jeg forstår det selvfølgelig stadig ikke, fordi det virker fint på min lokale webserver.
Avatar billede w13 Novice
07. oktober 2011 - 15:18 #12
Har du fjernet name="newuserlang" fra dine <option>'s, så det kun står på <select>'en?

Du kan evt. prøve at køre:
print_r($_POST);
når <form>'en er submittet. Så skulle du gerne kunne se, hvad $_POST indeholder af værdier.
Avatar billede tubdk1983 Nybegynder
07. oktober 2011 - 15:21 #13
Jep det har jeg.

print_r($_POST); giver

Array ( [newuserlang] => en )
Avatar billede w13 Novice
07. oktober 2011 - 15:42 #14
Hvad får du, hvis du skriver:
echo intval( isset( $_POST['newuserlang'] ) );
?
Avatar billede tubdk1983 Nybegynder
07. oktober 2011 - 15:45 #15
1
Avatar billede tubdk1983 Nybegynder
07. oktober 2011 - 15:50 #16
1 på internettet og 0 lokalt?
Avatar billede w13 Novice
07. oktober 2011 - 15:53 #17
Nå, men så er den jo sat på Internettet (mærkeligt med 0 på lokalt, hvis det virker der?).

Hvad hvis du lige efter:
if (isset($_POST['newuserlang'])) {
indsætter:
echo '<p>Inde!</p>';

Får du så vist teksten "Inde!", når du submitter?
Avatar billede tubdk1983 Nybegynder
07. oktober 2011 - 16:06 #18
0 lokalt må nok netop være fordi det virker og har skiftet side også er blevet nulstillet.

Jeg er "inde" ja :) hmmm

Jeg har også lavet en inde2 i næste if sætning, der jeg også "inde".
Det må være setcookie der ikke virker?
Avatar billede olsensweb.dk Ekspert
07. oktober 2011 - 19:49 #19
outputter du noget til skærmen før du kalder setcookie ??

har du noget før dette ??
<?php
if (isset($_COOKIE['userlang'])) {
    $userlang = $_COOKIE['userlang'];
    if ($userlang <> 'en')
        header("Location: ../$userlang/{$userlang}_home.php");
}
if (isset($_POST['newuserlang'])) {
    $newuserlang = $_POST['newuserlang'];
    setcookie('userlang', "{$newuserlang}", time()+60*60*24*1095, '/');
    if ($newuserlang <> 'en')
    header("Location: ../$newuserlang/{$newuserlang}_home.php");
}
?>


hvad filformat er din fil gemt som ?? kunne det tænkes der er en BOM karakter

ref http://dk2.php.net/setcookie
citat
setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace.

/citat
Avatar billede tubdk1983 Nybegynder
08. oktober 2011 - 09:47 #20
<?php
session_start();

if (isset($_COOKIE['userlang'])) {
    $userlang = $_COOKIE['userlang'];
    if ($userlang <> 'en')
        header("Location: ../$userlang/{$userlang}_home.php");
}
if (isset($_POST['newuserlang'])) {
        $newuserlang = $_POST['newuserlang'];
        setcookie('userlang', "{$newuserlang}", time()+60*60*24*1095, '/');
        if ($newuserlang <> 'en')
            header("Location: ../$newuserlang/{$newuserlang}_home.php");
}
?>

Filen er gemt som .php

Ovenstående kode starter på linie 1.

Det virker lokalt, men ikke på interwebbet. :(
Avatar billede w13 Novice
08. oktober 2011 - 15:05 #21
Det kunne måske også skyldes, at din header("Location: ..."); fejler?

Prøv lige med:

header("location: ../" . $newuserlang . "/" . $newuserlang . "_home.php");

Og hvis det ikke virker, så echo den lige i stedet:

echo "location: ../" . $newuserlang . "/" . $newuserlang . "_home.php";
Avatar billede olsensweb.dk Ekspert
08. oktober 2011 - 15:43 #22
prøv lige at rette
  if ($userlang <> 'en')
  if ($newuserlang <> 'en')
til
  if ($userlang != 'en')
  if ($newuserlang != 'en')

>Filen er gemt som .php
det var ikke det jeg mente, gemmen du i formatet utf-8 eller ansi
Avatar billede tubdk1983 Nybegynder
09. oktober 2011 - 10:37 #23
Så fandt jeg endelig løsningen, det var ronols hint i forbindelse med formatet utf-8. (jeg anede ikke hvad du hentydede til i første omgang)
Alle mine sider er kodet i notepad++, formatet er utf-8 med BOM som standard og det er ligepræcis det her BOM der er skyld i at det ikke virker.

Ved at konvertere alle filer til utf-8 uden BOM, så virker det hele som skal. Heldigvis er det bare et tryk på en knap i notepad++.

Der står mere om det i kommentarerne her http://php.net/manual/en/function.header.php
Jeg forstår dog stadig ikke helt hvad BOM er og hvorfor det virker out-of-the-box på min lokale webserver, og ikke online.

Tusind tak for hjælpen til splazz, w13 og ronols.
Avatar billede olsensweb.dk Ekspert
09. oktober 2011 - 13:45 #24
>Jeg forstår dog stadig ikke helt hvad BOM
http://en.wikipedia.org/wiki/Byte_order_mark

men trøst dig med, du glemmer aldrig BOM mere

>hvorfor det virker out-of-the-box på min lokale webserver, og ikke online.
kunne det tænkes du havde en cookie liggende fra dette sp http://www.eksperten.dk/spm/947509 ??
Avatar billede tubdk1983 Nybegynder
09. oktober 2011 - 15:25 #25
Jeg glemmer det aldrig igen!

>kunne det tænkes du havde en cookie liggende fra dette sp http://www.eksperten.dk/spm/947509

Nej for jeg har hele tiden holdt øje og tjekket cookies, slettet og lavet nye, testet osv.

Skriver du et svar så du kan få nogle point?

Man burde kunne ændre emnet, så det stemmer bedre overens med hvad problemet var.
Avatar billede olsensweb.dk Ekspert
09. oktober 2011 - 16:27 #26
får du så her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester