ugrás a tartalomhoz

Warning: Cannot modify header information - headers already sent by

SYA85 · 2009. Feb. 27. (P), 05.25
Sziasztok!

Én csak kezdő szinten foglalkozom php-vel, a problémám az hogy amikor bejelentkezem a login ablakomon, sikerül belépnem és megjelenik a védett tartalom, viszont az ablak tetején ez a hiba üzenet is

Warning: Cannot modify header information - headers already sent by (output started at /documents/termkeink.php:9) in /documents/protection.php on line 26

Warning: Cannot modify header information - headers already sent by (output started at /documents/termkeink.php:9) in /documents/protection.php on line 27
.
Utána néztem a neten, és egyesek szerint ez azt jelenti hogy szóköz van az adott sorban, viszont én sehol nem találtam. Úgy sejtem valami banális hiba, ezért is kérlek benneteket ha valaki tud segítsen, mert nagyon fontos lenne hogy sikerüljön kiküszöbölnöm. Előre is köszönöm.

Üdv: SYA
 
1

Ugy van

nemalevi · 2009. Feb. 27. (P), 07.25
Valahol van egy header(); es nem megfeleloen hasznalod. A header() fuggveny elott nem lehet szokoz. HA nem sikerul megtalalni a hibat, akkor tegyel az elos sorba egy ob_start();-ot, az utolsoba meg egy ob_end_flush();-t.
2

Magyarázat

abesto · 2009. Feb. 27. (P), 14.36
A PHP header() függvény HTTP headerek küldését valósítja meg (ld. http://hu2.php.net/header). Ezek még a weblap tényleges tartalma előtt érkeznek meg a böngészőhöz. Ha már bármit elküldtél a böngészőnek (általában valami HTML), akkor ez a hibaüzenet értesít arról, hogy a HTTP header már küldésre került (muszáj neki, hiszen a Te tartalmad előtt kell érkeznie).

A 'bármi' lehet akár egy szóköz is a '<?php' előtt, hiszen a szóköz szabályos HTML tartalom. (Edit: Igazából ez nem igaz, de a szerver akkor sem értelmezi. Kiküldi a böngészőnek ahogy van) Az include vagy require függvény hívásából is származhat a gond: ha a beolvasott fájl elején/végén van szóköz/újsor, akkor is előáll a probléma.
3

Még mindid nem jó...

SYA85 · 2009. Feb. 27. (P), 14.46
Úgy nézz ki hogy van egy termekeink.php amiben meg van híva include függvénnyel a következő protection.php:

<?php
$user_passwords = array ("********" => "*********");
$logout_page = "35.html";
$login_page = "login.php";
$invalidlogin_page = "invalidlogin.php";
if (!isset($action)) $action = ""; 
if (!isset($pwd)) $pwd = "";
if (!isset($loginpwd)) $loginpwd = "";
if (!isset($loginuser)) $loginuser = "";
if (!isset($loginname)) $loginname = "";
if (!isset($password)) $password = "";
if ($action == "logout") {Setcookie("loginpwd","",time() -86400);
Setcookie("loginuser","",time() -86400);
include($logout_page);
exit;
}
else if ($action == "login")
{
if (($loginname == "") || ($password == ""))
{
include($invalidlogin_page);
exit;
}
else if (strcmp($user_passwords[$loginname],$password) == 0)
{
Setcookie("loginpwd",$password,time() + 86400);
Setcookie("loginuser",$loginname,time() + 86400);
}
else
{
include($invalidlogin_page);
exit;
}
}
else
{
if (($loginpwd == "") || ($loginuser == ""))
{
include($login_page);
exit;
}
else if (strcmp($user_passwords[$loginuser],$loginpwd) == 0)
{
Setcookie("loginpwd",$loginpwd,time() + 86400);
Setcookie("loginuser",$loginuser,time() + 86400);
}
else
{
include($invalidlogin_page);
exit;
}
}
?>
próbáltam a ob_start();-ot, az utolsoba meg egy ob_end_flush();-t, de az sem segített, ebben az includolt php-ban nincs sehol fölösleges szóköz. Biztos valami apró baki de roppantúl bosszant, ha van még valakinek valami ötlete kérem segítsen.

Köszönet aki eddig is próbálta megoldani.
5

BOM

Poetro · 2009. Feb. 27. (P), 16.33
Ha UTF-8 a file, akkor semmiképp se rakjál BOM (Byte Order Mark)-ot fájlok az elejére, ezt egyes szövegszerkesztők beleteszik, pl. tudtommal a Notepad is, másoknál ki lehet kapcsolni. Érdemes megnézni az összes érintett fájlt valami hexa nézegetőben, hogy van-e valami a <? előtt.
4

UTF-8 BOM

fchris82 · 2009. Feb. 27. (P), 16.31
Nézd meg a fájl forrását HEX editorban. A "<?php" előtt lehet, hogy van 3 bájtnyi adat, amit sima szövegszerkesztőben nem látsz, és azt kell törölnöd!
6

termekeink.php

a.d.a.m · 2009. Feb. 27. (P), 20.03
ha jól értem amit bemásoltál az a protection.php forrása, megtennéd, hogy a termekeink.php is megmutatod (legalább az include-ig).
7

error kikapcsolása

Makesz · 2009. Feb. 27. (P), 22.17
A probléma a 26-27. sorban a Setcookie() függvénnyel van(ahogyan azt a hibaüzenet is írja), illetve a függvény jó, csak rossz helyen van, mivel az oldal "felépítése" már korábban a termekienk.php 9. sorában elkezdődik, és ahogy már írták többen, ha egyszer elkezdődik az oldal(output started) akkor már nem lehet "piszkálni" a böngészőt header(), setcookie() stb.. függvényekkel.

Nem szép, de ha a script ezt a warningot leszámítva működik rendesen akkor ezt a sort tedd be az index.php elejére(kikapcsolja a hibaüzeneteket), de csak kiélesítéskor tedd be, mert fejlesztés alatt akkor nem látsz majd semmit:

ini_set('display_errors', 0);

Az ilyen problémák elkerülésére hasznos lehet valami template rendszer(pl.: Smarty), mert akkor szétválik a php és html kód, így az output biztos akkor kezdődik amikor már minden php lefutott.

Ha az UTF8 fájl BOM lenne a probléma azt elvileg látnád a böngészőben(Firefox), azaz valahol meg kellene jelennie a jól ismert "dtz" karaktereknek, ami a hibára utal.

Más: egy tanács: nem tudom, hogy a jelszavak kódolva vannak-e a $user_passwords tömbben, de ha nem, akkor ne tedd be cookiba kliens oldalra, mert nem túl biztonságos. Ha mindenképp el akarod küldeni a jelszót kliens oldalra, akkor használj valami hash függvényt a kódolására. Pl.: md5, sha1
8

hack

gex · 2009. Feb. 28. (Szo), 14.20
Nem szép, de ha a script ezt a warningot leszámítva működik rendesen
a script azért dob warning-ot, mert nem működik rendesen. nem a hibaüzeneteket kell elnyomni, hanem megoldani a problémát. ha egy program tökéletesen fut és nincs benne semmi probléma, akkor nem is fog hibákat kiírni. esetünkben azért szól a php, mert nem tudja létrehozni a sütit. erre azért nem mondhatjuk, hogy a hibaüzeneten kívül azért működik rendesen.
9

a forrás

a.d.a.m · 2009. Feb. 28. (Szo), 16.43
ahogy Makesz is írja
az oldal "felépítése" már korábban a termekeink.php 9. sorában elkezdődik
, ezért lenne jó látni mi is történik az include előtt, hátha áthelyezhető máshová a kimenetet generáló rész. Ha más megoldás nincs érdemes nemalevi hozzászólásában javasolt ob_start()-ot bevetni a termekeink.php 9. sora előtt és az include rész után kiíratni a kimeneti puffer tartalmát képernyőre, vagy változóba (ld. ob_get_contents() függvény).

Természetesen fejlesztés közben nem elrejteni, hanem megoldani kell a hibákat, de az éles környezetben már érdemes kikapcsolni a hiba megjelenítést és inkább logolni, mert egy-egy ilyen probléma szem előtt hagyva biztonsági kockázatot jelenthet.
10

Még most sem jó...

SYA85 · 2009. Már. 2. (H), 14.39
köszi a segítséget sajnos a probléma még továbbra is fönt áll, a termekek.php az includig a következő:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Termékeink</title>
<link type="text/css" href="../documents/textstyles_nf.css" rel="stylesheet">
<meta name="generator" content="EZGenerator 3.0.0.49 (york-v10)">
<meta name="description" content="Takarmányozástan mesterfokon.">
<meta name="keywords" content="Takarmányozástan, Helvécia, Protein , Trade, ">
<meta name="date" content="2009-02-27T04:10:04+00:00">
<link href="../favicon.ico" type="image/x-icon" rel="shortcut icon">
<link href="../favicon.ico" type="image/ico" rel="icon">
<!--scripts-->

<script type="text/javascript">
var b_el=null;var tog=false;
function ToggleBody(e_id){var b_state='none';var img='images/expand.gif';if(tog&&(b_el!=null)&&(b_el.id!=e_id+"Body"))b_el.style.display='none';
if(document.getElementById){b_el=document.getElementById(e_id+"Body");u_img=document.getElementById(e_id+"Up");} else if(document.all){b_el=document.all[e_id+"Body"];u_img=document.all[e_id+"Up"];}
if(b_el!=null){if(b_el[0]){b_el=b_el[0];u_img=u_img[0];}if(b_el.style.display=="none"){img="images/collapse.gif";b_state='block';}u_img.src=img;b_el.style.display=b_state;}return false;}
</script>

<!--endscripts-->

<!--menu_java-->
<script language="javascript" type="text/javascript">
<!--
var preloadFlag=false;
var pagesubmenuimage='%PageMenuImageName%';
var pagemainmenuimage='ca_3173';
function newImage(arg){if (document.images) {rslt=new Image();rslt.src=arg;return rslt;}}
function changeimages(){if (document.images && (preloadFlag == true) && (document[arguments[0]])) {document[arguments[0]].src=arguments[1];}}
function ChangeMainMenu() {if (arguments[0] != pagemainmenuimage) changeimages(arguments[0],arguments[1]);}
function ChangeSubMenu() {if(arguments[0] != pagesubmenuimage) changeimages(arguments[0],arguments[1]);}
function preloadimages()
{
if (document.images) {<!--menupr--->ca_2c02_2 = newImage("../images/ca_2c02_2.gif");
ca_51ff_2 = newImage("../images/ca_51ff_2.gif");
ca_3173_2 = newImage("../images/ca_3173_2.gif");
ca_1f89_2 = newImage("../images/ca_1f89_2.gif");
ca_67ac_2 = newImage("../images/ca_67ac_2.gif");
ca_736d_2 = newImage("../images/ca_736d_2.gif");
ca_207c_2 = newImage("../images/ca_207c_2.gif");
ca_3257_2 = newImage("../images/ca_3257_2.gif");
preloadFlag = true;}

changeimages('ca_3173', '../images/ca_3173_2.gif');
}
// -->
</script>
<!--/menu_java-->
</head>
<body onload="preloadimages();preloadimages();preloadimages();preloadimages();preloadimages();preloadimages();preloadimages();preloadimages();preloadimages();"><table id="container" align="center"><tr><td><table id="main" align="center" cellpadding="0" cellspacing="0">
<tr><td><img src="../images/sideimage.jpg" width="141" height="54" alt=""></td><td id="topbar" align="right"><a href="../index.html"><img src="../images/Magyar_ezg_logo.jpg" width="200" height="54" alt="" border="0"></a></td><td><img src="../images/r_top_image.jpg" width="32" height="54" alt=""></td></tr>
<tr valign="top"><td id="sidebar">
<img src="../images/image.jpg" width="141" height="109" alt="">
<!--mmenu--><a href="../documents/home.html" onmouseout="ChangeMainMenu('ca_2c02','../images/ca_2c02.gif'); return true;"  onmouseover="changeimages('ca_2c02', '../images/ca_2c02_2.gif'); return true;"><img name="ca_2c02" src="../images/ca_2c02.gif" border="0" alt="Kezdolap"></a>
<a href="../documents/cgtrtnet.html" onmouseout="ChangeMainMenu('ca_51ff','../images/ca_51ff.gif'); return true;"  onmouseover="changeimages('ca_51ff', '../images/ca_51ff_2.gif'); return true;"><img name="ca_51ff" src="../images/ca_51ff.gif" border="0" alt="Cégtörténet"></a>
<a href="../documents/37.html" onmouseout="ChangeMainMenu('ca_3173','../images/ca_3173.gif'); return true;"  onmouseover="changeimages('ca_3173', '../images/ca_3173_2.gif'); return true;"><img name="ca_3173" src="../images/ca_3173.gif" border="0" alt="Termékek"></a>
<a href="../documents/kpek.html" onmouseout="ChangeMainMenu('ca_1f89','../images/ca_1f89.gif'); return true;"  onmouseover="changeimages('ca_1f89', '../images/ca_1f89_2.gif'); return true;"><img name="ca_1f89" src="../images/ca_1f89.gif" border="0" alt="Képek"></a>
<a href="../documents/48.html" onmouseout="ChangeMainMenu('ca_67ac','../images/ca_67ac.gif'); return true;"  onmouseover="changeimages('ca_67ac', '../images/ca_67ac_2.gif'); return true;"><img name="ca_67ac" src="../images/ca_67ac.gif" border="0" alt="Szaktanácsadók"></a>
<a href="../documents/35.html" onmouseout="ChangeMainMenu('ca_736d','../images/ca_736d.gif'); return true;"  onmouseover="changeimages('ca_736d', '../images/ca_736d_2.gif'); return true;"><img name="ca_736d" src="../images/ca_736d.gif" border="0" alt="Tanuljunk együtt"></a>
<a href="../documents/linkek.html" onmouseout="ChangeMainMenu('ca_207c','../images/ca_207c.gif'); return true;"  onmouseover="changeimages('ca_207c', '../images/ca_207c_2.gif'); return true;"><img name="ca_207c" src="../images/ca_207c.gif" border="0" alt="Linkek"></a>
<a href="../documents/elrhetu0151sg.html" onmouseout="ChangeMainMenu('ca_3257','../images/ca_3257.gif'); return true;"  onmouseover="changeimages('ca_3257', '../images/ca_3257_2.gif'); return true;"><img name="ca_3257" src="../images/ca_3257.gif" border="0" alt="Kapcsolat"></a>
<!--/mmenu-->
<img src="../images/bottom_image.jpg" width="141" height="27" alt=""></td>
<td><table id="cont" cellpadding="0" cellspacing="0">
	<tr valign="top"><td height="100%" style="background: #f5f6fb;padding: 1px 5px 5px 15px;"><!--page--><div class="pageheader"><img border="0"  src="../documents/H_Term_keink_44.gif" alt="Termékeink"></div>

<div align="center"><? include("protection.php"); ?>
ini_set('display_errors', 0); nem segített, kíírja hogy ki van kapcsolva és a hibát is kiírja még hozzá. A másik dolog megnéztem Hex-ben és nincs a php előtt semmi, azért köszi. Ha valaki látja most már mi lehet a bibi kérem segítsen. Előre is köszi!
11

Kódszervezés

zila · 2009. Már. 2. (H), 15.08
Egyértelműen került adat a kimenetre mivel a 69.sorban van az első php darabka...
Kicsit szervezd úgy kódodat, hogy elsőként fusson le:
<?php
include("protection.php");?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
...
<div align="center"><?php /* itt már csak megjeleníted a protection.php-ban előzőleg összeállított tartalmat*/ ?>
12

Ha ragaszkodsz

a.d.a.m · 2009. Már. 2. (H), 17.48
az ilyen kódfelépítéshez, tehetsz az elejére ob_startot:
<?php ob_start(); ?>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
Ezzel a függvénnyel, ahogyan a manual is írja:
kapcsolhatjuk be a PHP saját belső kimenet pufferelési mechanizmusát. Ameddig a kimenet pufferelés be van kapcsolva, a fejlécadatokon kívül semmiféle kimenet nem hagyja el a PHP háza tájékát, az egy belső pufferben tárolódik.
Ezek után nincs más dolgod mint a fejlécek elküldése után kiadni az ob_end_flush parancsot.

De mindenképp jobb egy jól szervezett kódot kiadni a kezedből, ráadásul könnyebben is tudod módosítani a dolgokat.
13

THX

SYA85 · 2009. Már. 23. (H), 18.02
Köszi így müxik, köszönöm mindenkinek aki hozzászólt!