Permalänk
Medlem

Problem med redirect i PHP

Hej!

Jag har ett problem med, som titeln säger, redirect i php.

Problemet är att jag vill redirect'a efter att någon loggat in på en sida,
men tydligen så måste jag utföra redirect'en innan någon output görs.

Hur löser jag detta? Eftersom jag måste göra output innan den ska
skicka vidare användaren till en ny sida.

Det lustiga är att det funkar perfekt när jag hostar det på localhost,
men när jag lägger upp det på webservern så blir det så här.

Error:

Warning: Cannot modify header information - headers already sent by (output started at /customers/d/4/0/mydomain.com/httpd.www/php/site.php:63) in /customers/d/4/0/mydomain.com/httpd.www/php/login/loginField.php on line 60

Line 63-65 i site.php:

<?php require 'menu.php'; ?>

Line 60 i loginField.php:

header("Location: site.php?login");

Tack för svar

Visa signatur

Citera för svar

Permalänk
Medlem

Om du måste skicka output innan du redirectar så gör du något fel. Varför ska du ha redirect koden mitt i din HTML istället för överst i dokumentet?

Permalänk
Medlem
Skrivet av jakkes:

Hej!
Jag har ett problem med, som titeln säger, redirect i php.
Tack för svar

Om du hade lagt ner mer än 1 sekund på att söka efter en lösning hade du hittat hur många som helst.
Men eftersom jag inte BARA är en surgubbe så kommer jag ge dig en hint.
Sätt på output buffering.

Permalänk
Medlem
Skrivet av GriZzm0:

Om du måste skicka output innan du redirectar så gör du något fel. Varför ska du ha redirect koden mitt i din HTML istället för överst i dokumentet?

Det som ska hända är:

Om en användare skriver in rätt lösenord / användarnamn så ska han skickas vidare till dess profile.

if(md5($enteredPASS)==$query_result['password']){ $_SESSION['loginName']=$enteredUN; header("Location:site.php?login"); }

Finns det någon easyfix?

Visa signatur

Citera för svar

Permalänk
Medlem
Skrivet av iXam:

Om du hade lagt ner mer än 1 sekund på att söka efter en lösning hade du hittat hur många som helst.
Men eftersom jag inte BARA är en surgubbe så kommer jag ge dig en hint.
Sätt på output buffering.

Har sökt en del... Att skriva här va sista alternativet...

Tack iaf.

Visa signatur

Citera för svar

Permalänk
Medlem
Skrivet av iXam:

Om du hade lagt ner mer än 1 sekund på att söka efter en lösning hade du hittat hur många som helst.
Men eftersom jag inte BARA är en surgubbe så kommer jag ge dig en hint.
Sätt på output buffering.

Förresten, varför fungerar det på en lokal server (localhost) men inte på webbhotellets server?

Visa signatur

Citera för svar

Permalänk
Medlem
Skrivet av jakkes:

Förresten, varför fungerar det på en lokal server (localhost) men inte på webbhotellets server?

För att de uppenbarligen är olika konfigurerade.

Läs mer om output buffering här http://se.php.mirror.edgebooster.com/manual/en/function.ob-st...

Permalänk
Medlem
Skrivet av jakkes:

Det som ska hända är:

Om en användare skriver in rätt lösenord / användarnamn så ska han skickas vidare till dess profile.

if(md5($enteredPASS)==$query_result['password']){ $_SESSION['loginName']=$enteredUN; header("Location:site.php?login"); }

Finns det någon easyfix?

Lägg den koden innan all din HTML då. Som sagt, det finns ingen mening att ha all PHP i mitten av all din HTML.

Permalänk
Skrivet av jakkes:

Det som ska hända är:

Om en användare skriver in rätt lösenord / användarnamn så ska han skickas vidare till dess profile.

if(md5($enteredPASS)==$query_result['password']){ $_SESSION['loginName']=$enteredUN; header("Location:site.php?login"); }

Finns det någon easyfix?

Det rätta sättet är såklart att göra inloggningschecken och din redirect innan några headers är skickade. Men här är en liten trevlig php redirect som jag brukar använda och som fungerar även efter att headers har skickats:

function redir($url) { if (empty($url)) { $url = "index.php"; } if (!headers_sent()) { // If headers are not sent, do php redirect header('Location: ' . $url); exit; } else { // If headers are sent, do javascript redirect. If javascript is disabled, do html redirect echo '<script type="text/javascript">'; echo 'window.location.href="' . $url . '";'; echo '</script>'; echo '<noscript>'; echo '<meta http-equiv="refresh" content="0;url=' . $url . '" />'; echo '</noscript>'; exit; } }

Så easyfix blir:

if(md5($enteredPASS)==$query_result['password']){ $_SESSION['loginName']=$enteredUN; redir("site.php?login"); }

Permalänk
Medlem

Raden där du har din redirect måste ligga över raden där du har "require 'menu.php';", eller så får du lära dig ob_start(); osv.

Permalänk
Medlem

Tack för svar, kör på ob_start(); det var simpelt att göra nu i efterhand, till nästa gång kör jag på Full Strikes lösning.

Visa signatur

Citera för svar