Kan inte skicka vidare besökare med header

Permalänk
Avstängd

Kan inte skicka vidare besökare med header

Hej

Har ett problem med att skickar vidare personer med header på min hemsida. Använder php som ni säkert företog. Problemet är att jag skriver ut saker på skärmen innan jag använder headern och då får jag ett fel meddelande, borde gå att lösa med ob_strat och ob_end men vet inte vart jag sak sätta ut de ör att de sak fungera.

Felmeddelandet

  Warning: Cannot modify header information - headers already sent by (output started at /register_page.php:2) in register.php on line 4

register_page.php

<!doctype html> <?php require('includes/html_include.php'); require('includes/register.php'); $error_message = array(); if(isset($_POST['submit'])){ //Blir sant om submitknappen i formuläret är nertryckt $error_message = register($error_message); //Anropar metoden som registrerearar användaren i "register.php", eventuella felmedelenden retuneras och sparas i variabeln "$error_message" } ?> //HTML kod för formulär

register.php

<?php require ('connects.php'); require ('conf.php'); require ('security.php'); function register($error_message){ if(isset($_POST['user'])&&isset($_POST['mail'])&&isset($_POST['password'])&&isset($_POST['rep_password'])){ if(!empty($_POST['user'])&&!empty($_POST['mail'])&&!empty($_POST['password'])&&!empty($_POST['rep_password'])){ $user = trim($_POST['user']); $mail = trim($_POST['mail']); $crypt_password_value = crypt_text($_POST['password']); $crypt_rep_password_value = crypt_text_spec_salt($_POST['rep_password'],$crypt_password_value['salt']); $password = $crypt_password_value['pass']; $rep_password = $crypt_rep_password_value['pass']; $pattern_email = '/^(.+)@(.+).([a-z]{2,3})$/'; if(strlen($user)<=30&&strlen($mail)<=50){ if(preg_match($pattern_email,$mail)){ if($rep_password === $password){ $check_exist = mysql_query("SELECT `id` FROM `users` WHERE `username` = '$user'"); if(mysql_num_rows($check_exist) == null){ $insert = "INSERT INTO `brommund_se`.`users` (`username`, `password`, `mail`) VALUES ('$user','$password','$mail')"; if(mysql_query($insert)){ $activate_code=''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrst1234567890'; $activate_code = substr(str_shuffle($chars),0,10); $insert_activate_code = "UPDATE `users` SET `activate`='$activate_code' WHERE `username` = '$user'"; if(mysql_query($insert_activate_code)){ $recipient = $mail; $subject = 'Aktivera kont'; $header = 'From: brommund.se'; $mail_body = 'Aktiveringskod '.$activate_code; mail($recipient, $subject, $mail_body, $header); header('Location: '.$host.'/activate_user.php'); //Felet uppstår här ob_end_flush(); die(); }else{ $error_message[] = 'Kunde inte registrera! Försök igen.'; } }else{ $error_message[] = 'Kunde inte registrera! Försök igen.'; } }else{ echo $error_message[] = 'Användarnamnet är upptaget'; } }else{ $error_message[] = 'Lösenorden matchar inte!'; } }else{ $error_message[] = 'Skriv in en giltig e-postadress!'; } }else{ if(strlen($user)>30){ $error_message[] = 'Användarnamnet är för långt (max 30 tecken)!'; } if(strlen($mail)>50){ $error_message[] = 'Mailen är för långt (max 50 tecken)!'; } } }else{ $error_message[] = 'Fyll i alla fält!'; } } return $error_message; }

Permalänk
Inaktiv

Du kan inte skicka information till webbläsaren före en header.

Permalänk
Avstängd
Skrivet av anon150287:

Du kan inte skicka information till webbläsaren före en header.

Läste någonstans att man kunde lösa det genom att använda en buffer med ob_start(), men det kanske inte går. Hur kan jag göra annars om jag vill skicka vidare en besökare?

Permalänk
Inaktiv
Skrivet av Pandy95:

Läste någonstans att man kunde lösa det genom att använda en buffer med ob_start(), men det kanske inte går. Hur kan jag göra annars om jag vill skicka vidare en besökare?

Jo det ska funka med buffrar. Lägg ob_start() längst upp på sidan och ob_end_flush() längst ner. Inte säker på att ob_end_flush() behövs dock, du får testa lite.

Permalänk
Medlem

Ta bort <!doctype html> och all whitespace innan första php-taggen.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Avstängd

Har försökt att göra som du sa och det fungerade inte gjorde.

<!doctype html> <?php require('includes/html_include.php'); require('includes/register.php'); $error_message = array(); if(isset($_POST['submit'])){ //Blir sant om submitknappen i formuläret är nertryckt $error_message = register($error_message); //Anropar metoden som registrerearar användaren i "register.php", eventuella felmedelenden retuneras och sparas i variabeln "$error_message" } ?> //HTML kod för formulär

register.php

<?php ob_start(); //start buffer require ('connects.php'); require ('conf.php'); require ('security.php'); function register($error_message){ if(isset($_POST['user'])&&isset($_POST['mail'])&&isset($_POST['password'])&&isset($_POST['rep_password'])){ if(!empty($_POST['user'])&&!empty($_POST['mail'])&&!empty($_POST['password'])&&!empty($_POST['rep_password'])){ $user = trim($_POST['user']); $mail = trim($_POST['mail']); $crypt_password_value = crypt_text($_POST['password']); $crypt_rep_password_value = crypt_text_spec_salt($_POST['rep_password'],$crypt_password_value['salt']); $password = $crypt_password_value['pass']; $rep_password = $crypt_rep_password_value['pass']; $pattern_email = '/^(.+)@(.+).([a-z]{2,3})$/'; if(strlen($user)<=30&&strlen($mail)<=50){ if(preg_match($pattern_email,$mail)){ if($rep_password === $password){ $check_exist = mysql_query("SELECT `id` FROM `users` WHERE `username` = '$user'"); if(mysql_num_rows($check_exist) == null){ $insert = "INSERT INTO `brommund_se`.`users` (`username`, `password`, `mail`) VALUES ('$user','$password','$mail')"; if(mysql_query($insert)){ $activate_code=''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrst1234567890'; $activate_code = substr(str_shuffle($chars),0,10); $insert_activate_code = "UPDATE `users` SET `activate`='$activate_code' WHERE `username` = '$user'"; if(mysql_query($insert_activate_code)){ $recipient = $mail; $subject = 'Aktivera kont'; $header = 'From: brommund.se'; $mail_body = 'Aktiveringskod '.$activate_code; mail($recipient, $subject, $mail_body, $header); header('Location: '.$host.'/activate_user.php'); //Felet uppstår här ob_end_flush(); die(); }else{ $error_message[] = 'Kunde inte registrera! Försök igen.'; } }else{ $error_message[] = 'Kunde inte registrera! Försök igen.'; } }else{ echo $error_message[] = 'Användarnamnet är upptaget'; } }else{ $error_message[] = 'Lösenorden matchar inte!'; } }else{ $error_message[] = 'Skriv in en giltig e-postadress!'; } }else{ if(strlen($user)>30){ $error_message[] = 'Användarnamnet är för långt (max 30 tecken)!'; } if(strlen($mail)>50){ $error_message[] = 'Mailen är för långt (max 50 tecken)!'; } } }else{ $error_message[] = 'Fyll i alla fält!'; } } return $error_message; } ob_end_flush(); //Skriv ut buffer ?>

Dold text

Försökte att göra på ett annat sätt också men det fungerade inte heller. Startade buffern i början på den php filen som man skriver i formuläret och sluttar buffer på samma php. Gjorde så för man börjar skriva ut redan på första php filen. Men det fungearde inte heller.

<!doctype html> <?php ob_start(); //Startar buffer require('includes/html_include.php'); require('includes/register.php'); $error_message = array(); if(isset($_POST['submit'])){ //Blir sant om submitknappen i formuläret är nertryckt $error_message = register($error_message); //Anropar metoden som registrerearar användaren i "register.php", eventuella felmedelenden retuneras och sparas i variabeln "$error_message" ob_end_flush(); //Skriv ut buffer } ?> //HTML kod för formulär <?php ob_end_flush(); //Skriv ut buffer?>

register.php

<?php require ('connects.php'); require ('conf.php'); require ('security.php'); function register($error_message){ if(isset($_POST['user'])&&isset($_POST['mail'])&&isset($_POST['password'])&&isset($_POST['rep_password'])){ if(!empty($_POST['user'])&&!empty($_POST['mail'])&&!empty($_POST['password'])&&!empty($_POST['rep_password'])){ $user = trim($_POST['user']); $mail = trim($_POST['mail']); $crypt_password_value = crypt_text($_POST['password']); $crypt_rep_password_value = crypt_text_spec_salt($_POST['rep_password'],$crypt_password_value['salt']); $password = $crypt_password_value['pass']; $rep_password = $crypt_rep_password_value['pass']; $pattern_email = '/^(.+)@(.+).([a-z]{2,3})$/'; if(strlen($user)<=30&&strlen($mail)<=50){ if(preg_match($pattern_email,$mail)){ if($rep_password === $password){ $check_exist = mysql_query("SELECT `id` FROM `users` WHERE `username` = '$user'"); if(mysql_num_rows($check_exist) == null){ $insert = "INSERT INTO `brommund_se`.`users` (`username`, `password`, `mail`) VALUES ('$user','$password','$mail')"; if(mysql_query($insert)){ $activate_code=''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrst1234567890'; $activate_code = substr(str_shuffle($chars),0,10); $insert_activate_code = "UPDATE `users` SET `activate`='$activate_code' WHERE `username` = '$user'"; if(mysql_query($insert_activate_code)){ $recipient = $mail; $subject = 'Aktivera kont'; $header = 'From: brommund.se'; $mail_body = 'Aktiveringskod '.$activate_code; mail($recipient, $subject, $mail_body, $header); header('Location: '.$host.'/activate_user.php'); //Felet uppstår här ob_end_flush(); die(); }else{ $error_message[] = 'Kunde inte registrera! Försök igen.'; } }else{ $error_message[] = 'Kunde inte registrera! Försök igen.'; } }else{ echo $error_message[] = 'Användarnamnet är upptaget'; } }else{ $error_message[] = 'Lösenorden matchar inte!'; } }else{ $error_message[] = 'Skriv in en giltig e-postadress!'; } }else{ if(strlen($user)>30){ $error_message[] = 'Användarnamnet är för långt (max 30 tecken)!'; } if(strlen($mail)>50){ $error_message[] = 'Mailen är för långt (max 50 tecken)!'; } } }else{ $error_message[] = 'Fyll i alla fält!'; } } return $error_message; } ?>

Dold text
Permalänk

Problemet är att du någonstans under exekveringen av din php kod, skickat header-kod och sedan startat någon typ av body för att sedan försöka återgå till att skriva header-kod.

dvs din output när du får felet är något sådant här:

<html>
<head>
...
</head>
<body>
..
<head> <---- [Warning: Cannot modify header information - headers already sent by (output started at /register_page.php:2) in register.php on line 4]

alternativen du har är att antingen se till att exekvera all kod som skapar headers innan något annat eller att buffra din sidbyggnad på något sätt.

min gissning av fel-texten är att problemet kanske inte uppstår i register.php eller register_page.php då felet säger att output startade där. försöker du mata ut någon header senare i koden?

Permalänk
Medlem

Jag antar att 'require('includes/html_include.php');' skriver ut någon form av html.
Ändra till det här;

<?php require('includes/register.php'); $error_message = array(); if(isset($_POST['submit'])){ //Blir sant om submitknappen i formuläret är nertryckt $error_message = register($error_message); //Anropar metoden som registrerearar användaren i "register.php", eventuella felmedelenden retuneras och sparas i variabeln "$error_message" } ?> <!DOCTYPE html> <?php require('includes/html_include.php'); //Om den ligger här så skrivs ingen html ut innan register() är klar. ?> //HTML kod för formulär

Visa signatur

-- Arkade --

Permalänk
Avstängd
Skrivet av MagnusL:

Ta bort <!doctype html> och all whitespace innan första php-taggen.

Skrivet av Arkade:

Jag antar att 'require('includes/html_include.php');' skriver ut någon form av html.
Ändra till det här;

<?php require('includes/register.php'); $error_message = array(); if(isset($_POST['submit'])){ //Blir sant om submitknappen i formuläret är nertryckt $error_message = register($error_message); //Anropar metoden som registrerearar användaren i "register.php", eventuella felmedelenden retuneras och sparas i variabeln "$error_message" } ?> <!DOCTYPE html> <?php require('includes/html_include.php'); //Om den ligger här så skrivs ingen html ut innan register() är klar. ?> //HTML kod för formulär

Kan jag verkligen sätta doctypen under php koden måste inte den vara på första raden? Men det fungerar en så länge.

Jag hittade flera fel och det var att det var massa tecken framför php tagen det var "". Jag förstår inte varför de var där. För när jag ladda upp in hemsida med filzilla till server (användaer one.com) så fans inte tecknen där, man om jag kollar på koden som blev skickat till one genom deras egna text editor så var tecknen där.

Hur gör jag för att tecknen inte ska läggas till och varför är de där?

Permalänk
Medlem

Det är Byte Order Mark, http://en.wikipedia.org/wiki/Byte_order_mark.
Använd en editor där man kan välja ifall man vill spara med BOM eller inte, som Notepad++.

BOM:en blir  (0xEF,0xBB,0xBF) för UTF-8.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Avstängd
Skrivet av MagnusL:

Det är Byte Order Mark, http://en.wikipedia.org/wiki/Byte_order_mark.
Använd en editor där man kan välja ifall man vill spara med BOM eller inte, som Notepad++.

BOM:en blir  (0xEF,0xBB,0xBF) för UTF-8.

Så jag sak alltså välja utf-8 utan bom.

Tack för alla svar och hjälpen