header('location:..); att skriva ut före html -

Permalänk

header('location:..); att skriva ut före html -

Hej! Har en fråga gällande min kod nedan för en login sida. Jag får följande felmeddelande:

Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/Curie/webroot/nobel_login.php:1) in /Applications/MAMP/htdocs/Curie/src/CUser/CUser.php on line 33

Jag har sett många inlägg här och på andra ställen vad man bör tänka på när man får detta felmeddelande. Jag vet att header('location:'); skall föregå innan html skrivs ut. Inga Witespaces osv. Har försökt ändra och flytta om, men får inte till koden nedan. Kan ni som är proffs se vad som är fel?

<?php /** * A class for handeling login * */ class CUser extends CDatabase { /** * Members * */ private $database; /** * Initiate child and parent constructor * */ public function __construct($database) { parent::__construct($database); } /** * Check if user and password is okey and reload page * */ private function Login() { if(isset($_POST['login'])) { $sql = "SELECT acronym, name FROM USER WHERE acronym = ? AND password = md5(concat(?, salt))"; $params = array(strip_tags($_POST['acronym']), strip_tags($_POST['password'])); $res = $this->ExecuteSelectQueryAndFetchAll($sql, $params); if(isset($res[0])) { $_SESSION['user'] = $res[0]; } // Den ska skrivas ut innan html skrivs ut. header('Location: nobel_login.php'); } // Logga ut användare / Logout the user if(isset($_POST['logout'])) { unset($_SESSION['user']); header('Location: nobel_login.php'); } } /** * Verify if user is logged in or not and return message * */ private function IsAuthenticated($acronym) { if($acronym) { $acronym = $_SESSION['user']->acronym; $name = $_SESSION['user']->name; $output = "Du är inloggad som: {$acronym} ({$name})"; } else { $output = "Du är för närvarande inte inloggad."; } return $output; } /** * Create login form * */ private function LoginForm($acronym) { $form = "<form method='post'><fieldset><legend><br></legend>"; $form .= "<p><em>Du kan logga in med vinga:vinga eller pippi:pippi</em></p>"; $form .= "<p><label>Användare:</label><br><input type='text' name='acronym' value='pippi'></p>"; $form .= "<p><label>Lösenord:</label><br><input type='password' name='password' value='pippi'></p>"; $form .= "<p><input type='submit' name='login' value='Login'> "; $form .= "<input type='submit' name='logout' value='Logout'></p>"; $form .= "<p><b>{$this->IsAuthenticated($acronym)}</b></p>"; $form .= "</fieldset></form>"; return $form; } /** * Sum it all up and create HTML output * */ public function UserLogin() { // Get parameters $acronym = isset($_SESSION['user']) ? true : false; // Create HTML output based on parameters $html = $this->Login(); $html .= $this->LoginForm($acronym); return $html; } }

Adderade [code]-taggar. Bjuder på färguppmärkning! :-)
Permalänk
Medlem
Permalänk
Medlem

Output buffering är en klassisk PHP-krycka som potentiellt kan orsaka mer problem än den löser. Bättre då att fixa problemet som sänder ut data på strömmen innan headrarna sätts.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Kolla också encodingen på filen, UTF8 med BOM kan ställa till det. Medans UTF8 utan BOM funkar utmärkt. Har stött på det själv ett par gånger.

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem
Skrivet av Teknocide:

Output buffering är en klassisk PHP-krycka som potentiellt kan orsaka mer problem än den löser. Bättre då att fixa problemet som sänder ut data på strömmen innan headrarna sätts.

Vilka problem kan man stöta på? Har använt det friskt och aldrig stött på några problem som jag inte kan fixa genom att manuellt flusha utifall jag skulle behöva spotta ut extremt mycket data.

Permalänk
Medlem
Skrivet av iXam:

Vilka problem kan man stöta på? Har använt det friskt och aldrig stött på några problem som jag inte kan fixa genom att manuellt flusha utifall jag skulle behöva spotta ut extremt mycket data.

För användaren blir det extra latens då svaret inte kan strömmas. För utvecklaren blir det en extra grej att tänka på då man explicit måste spola buffern som du säger, och det blir fortfarande fel om man gör det innan man satt headers som behöver finnas.

Att använda output buffering för att komma runt problemet med att data har skickats innan headrar satts är att medicinera mot symptomen istället för att fixa rotorsaken till problemet. Ofta är det bara ett osynligt tecken, som ett UTF8-byte-order-mark, som triggar PHP till att börja strömma datan till klienten.

Jag kan tänka mig att man i andra fall har byggt sin webapp på så vis att man medvetet väljer att skicka data innan man beslutat om man vill skicka headrar. Detta kan vara ett resultat av dålig kodarkitektur och bör avhjälpas istället för att slätas över.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Inaktiv

Jag håller med om att det verkar lite onödigt att använda OB_ för detta då det endast handlar om en simpel re-direct.

Det är mest troligt at det är något annat fel (teckenkodning är rätt vanligt) - och du kan ju debuga detta genom att köra scriptet i console, kolla din editor mm.

OB_ Är inte fel om du behöver manipulera headers, det måste man ibland göra men du ska göra en re-direct och denna header borde inte redan finnas. Det finns andra sätt att göra en redirect också, i ren HTML men lite utanför detta.

Permalänk

Tack för bra input alla. Kör en debug på nytt och justerar om koden. Får se om det kommer att funka bättre.