[PHP] header probleem in IE, niet in Moz/Tb

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bennierex
  • Registratie: April 2001
  • Laatst online: 13-09 12:58
Ik heb mijn eigen weblog geschreven in php, maar bij de laatste testen liep ik echt gigantisch vast. Ik zal wel iets over het hoofd zien, maar ik kan er maar niet achter komen wat.

Wat ik wil is een simpele redirect na het inloggen van een gebruiker naar de pagina waar hij/zij vandaan kwam. De oorspronkelijke pagina wordt gehaald uit een sessie-variabele genaamd "origin". Als deze variabele niet bestaat moet de user terug gestuurd worden naar "index.php".
So far so good dacht ik, werkt perfect.... behalve op IE (ik gebruik zelf Mozilla & Thunderbird). Bij mijn zoektocht naar het hoe en waarom kwam ik er achter dat de code die ik nu gebruik eigenlijk helemaal niet zou moeten werken, want ik verstuur gewoon al content voordat ik de header()-functie aanroep. Ik krijg echter zowel in Thunderbird als in IE geen foutmeldingen als "headers already sent" etc. In IE wordt ik gewoon weer geredirect naar dezelfde login pagina (login.php) en zoals gezegd kom ik in Thunderbird netjes uit op de pagina waar ik wil zijn.

Hier een gedeelte van mijn code. Hierboven staat nog een hele zooi (site-navigatie, tabellen, etc.);
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  if ($obj->pass == strtoupper(md5($_POST['psswd']))) {             
    $_SESSION['loggedin'] = 1;
    $_SESSION['level'] = $obj->level;
    $_SESSION['name'] = $obj->user;
?>
<p>Login successful, you will be redirected to where you came from.</p>
<?php 
    if (isset($_SESSION['origin'])) {
      header("Refresh: 2; {$_SESSION['origin']}");
      unset($_SESSION['origin']);
    } else {
      header("Refresh: 2; index.php");
    }
  } else {
    echo("Error logging you in!<br>Check your username and password.");
    header("Refresh: 3");
  }


Kan iemand eens zijn/haar licht laten schijnen hierover en mij uitleggen waarom dit wel en tegelijk ook weer niet werkt :?

[ Voor 8% gewijzigd door bennierex op 08-02-2005 14:31 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Even [search=headers already sent] zou wonderen moeten doen ;)

Acties:
  • 0 Henk 'm!

  • bennierex
  • Registratie: April 2001
  • Laatst online: 13-09 12:58
X-Lars schreef op dinsdag 08 februari 2005 @ 14:36:
Even [search=headers already sent] zou wonderen moeten doen ;)
Heb ik gedaan, echter is dit niet het probleem wat ik heb.

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Je stuurt eerst tekst (namelijk: '<p>Login blaaat') en daarna nog headers. In de HTTP/1.1 specs staat dat je eerst headers moet sturen, en daarna pas content.

Je hebt waarschijnlijk meer aan een meta-redirect in dit geval.

Acties:
  • 0 Henk 'm!

  • bennierex
  • Registratie: April 2001
  • Laatst online: 13-09 12:58
Ok, dus als ik de header()-functies in mijn script vervang door echo's van een meta-redirect moet het wel werken?
Ik snap dan alleen nog steeds niet waarom het in Thunderbird perfect werkt allemaal en in IE niet.
De laatste, "header("Refresh: 3");", in mijn script hierboven werkt trouwens wel, onder beide browsers.

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Je kunt imo beter gewoon zorgen dat er sowieso geen output is voor je header(s). En gebruik maken van session- en/of get-variabelen om informatie door te geven naar je volgende pagina.

Of, als je per se die x seconden wilt wachten om te redirecten, gebruik maken van een meta-tag in je html-header.

Acties:
  • 0 Henk 'm!

  • bennierex
  • Registratie: April 2001
  • Laatst online: 13-09 12:58
Probleem is dat dezelfde pagina ook het login-formuliertje en authenticatie-script bevat. Bovendien gebruik ik tabellen om mijn navigatie-menu en logo boven aan de pagina te laten zien. Deze wil ik dus altijd laten zien.
Ik kijk dan met een if-else statement of het form gesubmit wordt en dan controleer ik de gegevens. Zijn die gegeven ok, dan wordt de user ingelogd, bericht ge-echo'd dat het gelukt is en wordt de user doorgestuurd naar waar hij vandaan kwam of "index.php", alles zit verwerkt in die ene pagina.

Maar dan nog, waarom werkt de laatste header statement wel in IE, de andere 2 niet, en werken ze alledrie wel in Thunderbird? Ik snap dat die header als eerste op de pagina moet komen zonder output ervoor, en ik probeer dit nu ook voor elkaar te krijgen, maar dan nog blijft het vaag dat het in sommige situaties wel werkt. In alle gevallen wordt de header aangeroepen als er al output is geweest.

[edit]
Het enige wat anders is aan de header() functie in het 3e geval is dat ik daar geen argument meegeef naar welke pagina de user moet worden doorgestuurd.
Anieway ga ik even klooien om op een of andere manier die header()-aanroep bovenaan de pagina te krijgen, al heb ik geen idee hoe dit te realiseren met de huidige structuur van mijn site. :(
Bedankt voor de hulp vast en andere suggesties zijn nog steeds welkom. ;)

[ Voor 20% gewijzigd door bennierex op 08-02-2005 15:57 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Psuedo
code:
1
2
3
4
5
6
7
8
9
10
11
if(request_method == post)
  handle form data
  if(login_success == true) header('location: '.$_session['returnpage'])
  else $message = 'not logged in'
}

include logo.inc
include navigation.inc
echo $message
form
include footer.inc

Misschien moet je ook niet teveel in die ene pagina willen hebben?

Acties:
  • 0 Henk 'm!

  • bennierex
  • Registratie: April 2001
  • Laatst online: 13-09 12:58
X-Lars schreef op dinsdag 08 februari 2005 @ 15:58:
Psuedo
code:
1
2
3
4
5
6
7
8
9
10
11
if(request_method == post)
  handle form data
  if(login_success == true) header('location: '.$_session['returnpage'])
  else $message = 'not logged in'
}

include logo.inc
include navigation.inc
echo $message
form
include footer.inc

Misschien moet je ook niet teveel in die ene pagina willen hebben?
Ik denk dat je heel erg gelijk hebt ;) en ik het op jouw manier moet doen. Ik ga vanavond even puzzelen of ik het een beetje netjes krijg omgebouwd (moet op deze manier te doen zijn). Ik laat nog weten of het allemaal gelukt is.
Pagina: 1