[PHP] Header en cookie probleem (geen headers already sent)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Gegroet allen,

Nee, het is geen headers already sent probleem, het is iets veel raarders...

We hebben onze site sinds kort overgezet naar een nieuwe server, waar opzich dezelfde zooi (PHP, apache, linux, etc..) draaid als op de vorige. Helaas werken de headers etc niet echt meer...

Als ik een test.php bestandje maak met de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
<? ob_start(); 

function test(){

echo("Test!");

@header("Location: http://blah.com/"); 
}

test();

?>


Werkt dit perfect, als ik daarna ons eigen gemaakt systeempje (index en dan ?page= etc...) gebruik en probeer in te loggen / uit te loggen met doormiddel van de volgende code (schematisch hetzelfde):

code:
1
2
3
4
5
6
7
8
9
10
if ($md5pass == $row[user_password] AND $row[user_validated] == "1")
{
$cookie_data = $row[user_username].'-'.$row[user_password];
setcookie("userinfo_oblivion", $cookie_data, time()+3600000);
echo("Succesfully logged in, transefering to your profile !");
header("location: ?page=profile");
//jump("profile");
} else {
echo("Something has gone wrong while logging you in!");
}


De cookie EN de headers doen het niet meer, ook in een losse header(location: ); werkte niet meer, ergens wat we gebruikten om gewoon iemand door te sturen naar een andere pagina.

(Die jump functie die gecomment is gebruike nu we nu tijdelijk, maar hebben we nix aan, omdat de cookies het ook niet doen)

Al met al nogal vreemd.. ob_start aan en uit gezet, maar geen verschil of iets dergelijks.. Ook had ik erges iets gevonden over dat je @ voor bepaalde functies moest zette, maar wat doet dat precies, het maakt namelijk niet echt veel uit...

Iemand mss hetzelfde probleem gehad of een oplossing??

Thanks alot! _/-\o_

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Die @ onderdrukt foutmeldingen. Maar het is niet de juiste manier om een error te omzeilen....

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Krijg je een foutmelding? Wat gebeurt er als je print_r($_COOKIE) doet? Is er van php-versie geswitcht?

Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
chris schreef op maandag 23 mei 2005 @ 18:56:
Krijg je een foutmelding? Wat gebeurt er als je print_r($_COOKIE) doet? Is er van php-versie geswitcht?
Geen enkele foutmelding, er gebeurt (verder) nix, je ziet gewoon een pagina die half leeg is, omdat we dus die header(); proberen te gebruiken...

We zijn niet van php-versie veranderd...

Wat gebeurt er precies met print_r($_COOKIE) ?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gyarnoc schreef op maandag 23 mei 2005 @ 18:58:
Geen enkele foutmelding, er gebeurt (verder) nix, je ziet gewoon een pagina die half leeg is, omdat we dus die header(); proberen te gebruiken...
AW_Bos schreef op maandag 23 mei 2005 @ 18:55:
Die @ onderdrukt foutmeldingen. Maar het is niet de juiste manier om een error te omzeilen....
Wat gebeurt er precies met print_r($_COOKIE) ?
Open de manual? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
@ kon ik niet vinden in de manual

print_r weet wel wat dat doet.. maar $_COOKIE heeft dus geen effect

en ik heb in de manual gekeken, anders weet ik niet wat header doet, en er staat nergens verder iets bij over wat de oorzaak kan zijn dat de header het niet doet..

Ik heb het forum hier al 3 kwartier voor lopen te zoeken voor een fix, maar niemand heeft nog iets gehad als dit, dus nou niet aankomen met, kijk ff in de manual.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

gyarnoc schreef op maandag 23 mei 2005 @ 19:03:
[...]


@ kon ik niet vinden in de manual
http://nl3.php.net/manual...perators.errorcontrol.php
en ik heb in de manual gekeken, anders weet ik niet wat header doet, en er staat nergens verder iets bij over wat de oorzaak kan zijn dat de header het niet doet..
haal die @ eens weg en bekijk de foutmelding ;)

Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Die heb ik allang weer weggehaald.. er zijn geen errors, er gebeurt gewoon weg nix....

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Je mag geen output hebben voordat je de header instelt. Dus echo "test" is de boosdoener. Dus of je kunt alle output weghalen, of je kunt gebruik maken van ob_start en ob_flush.

[ Voor 38% gewijzigd door Noork op 23-05-2005 19:15 ]


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Noork schreef op maandag 23 mei 2005 @ 19:12:
Je mag geen output hebben voordat je de header instelt. Dus echo "test" is de boosdoener. Als er in die functie ook output zit kun je gebruik maken van ob_start en ob_flush.
Heb je de post goed gelezen ? Die test.php doet het juist WEL, want ik gebruik ob_start, bij mijn eigen gemaakt systeem gebruik ik ook ob_start, maar werk het NIET, terwijl het schematisch (functies en dergelijk) hetzelfde is...

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
gyarnoc schreef op maandag 23 mei 2005 @ 19:14:
[...]


Heb je de post goed gelezen ? Die test.php doet het juist WEL, want ik gebruik ob_start, bij mijn eigen gemaakt systeem gebruik ik ook ob_start, maar werk het NIET, terwijl het schematisch (functies en dergelijk) hetzelfde is...
Waar is ob_flush dan?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gyarnoc schreef op maandag 23 mei 2005 @ 19:11:
Die heb ik allang weer weggehaald.. er zijn geen errors, er gebeurt gewoon weg nix....
PHP:
1
error_reporting(E_ALL);

Lees ook P&W FAQ - Leer **** debuggen!! even door. Het is verder dus wel exact dat probleem waarvan je nota bene in je topictitel zegt dat het dat niet kan zijn. Leer eerst dus even fatsoenlijk debuggen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
ah, sorry.. moet ik ob_flush of ob_end_flush dan gebruiken, en even voor de duidelijkheid, flush moet dan NA de header komen of niet?

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Nou ja, sorry, ik had even te snel gelezen. Maar maak je gebruik van andere apache/php versies. Dit zou misschien ook uit kunnen maken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gyarnoc schreef op maandag 23 mei 2005 @ 19:17:
ah, sorry.. moet ik ob_flush of ob_end_flush dan gebruiken, en even voor de duidelijkheid, flush moet dan NA de header komen of niet?
Denk eens logisch na. Er mag geen uitvoer boven de headers komen. Ob_end_flush geeft uitvooer. Waar zet je het neer...? Juist. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Okay, nu snap ik er geen ene ****** meer van, ik zet errors aan (die overgens al aan stonden, maar nu ff op all) en krijg dus dit:

code:
1
2
3
4
5
6
7
8
9
Notice: Use of undefined constant userinfo_oblivion - assumed 'userinfo_oblivion' in /usr/local/etc/httpd/oblivionsource.com/mainfile.php on line 16

Notice: Use of undefined constant userinfo_oblivion - assumed 'userinfo_oblivion' in /usr/local/etc/httpd/oblivionsource.com/mainfile.php on line 17

Notice: Use of undefined constant user_password - assumed 'user_password' in /usr/local/etc/httpd/oblivionsource.com/mainfile.php on line 22

Notice: Use of undefined constant user_rank - assumed 'user_rank' in /usr/local/etc/httpd/oblivionsource.com/mainfile.php on line 23

Notice: Undefined variable: mode in /usr/local/etc/httpd/oblivionsource.com/header.php on line 4


zoals ik al zei, geen ERRORS over headers of iets dergelijks.

Die flush heb ik niet eens nodig, bij test.php werkt hij namelijk wel gewoon.. heb hem ervoor gezet (bovenin de index.php) en werkt dus nog steeds niet..

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ook die notices zijn uitvoer.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
maar ob_flush doet dit:

This function will send the contents of the output buffer (if any).

en heb het dus niet nodig.. gewoon de hele pagina late uitvoeren want,

met ob_start() word alles in de goede volgorde gebuffered, dus dat is dan toch verder het probleem niet?

Hij geeft GEEN error, en jah, leuk grapje, notices zijn ook content, maar met ob_start maakt dat dus nix uit..

[ Voor 11% gewijzigd door gyarnoc op 23-05-2005 19:27 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

als je het allemaal zo goed weet, waarom heb je er dan problemen mee? ;)

Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
OMG, ik zeg toch al, het probleem ligt niet bij ob_start, ob_flush, of de hele familie van OB, het ligt ook niet aan headers are already sent, die error krijg ik simpelweg niet !

Waar ligt het dus wel aan, ik begin onderhand alweer gestoord te raken..

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

los als eerste die errors (notices) eens op, ga daarna eens kijken wat er precies gebeurd als je een header('Location: ...') doet, juist, je stuurt daarmee alleen een redirect header, je script moet je dan wel beeindigen, anders gaat het vaak niet goed.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gyarnoc schreef op maandag 23 mei 2005 @ 19:30:
OMG, ik zeg toch al, het probleem ligt niet bij ob_start, ob_flush, of de hele familie van OB, het ligt ook niet aan headers are already sent, die error krijg ik simpelweg niet !

Waar ligt het dus wel aan, ik begin onderhand alweer gestoord te raken..
PHP:
1
header("location: ?page=profile");
Location moet met een hoofdletter. En nu inademen, uitademen, even rustig worden voor je weer post. :*

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
-NMe- schreef op maandag 23 mei 2005 @ 19:36:
[...]


[...]

Location moet met een hoofdletter. En nu inademen, uitademen, even rustig worden voor je weer post. :*
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function logout(){
global $dbcon, $user_rank;
if ($user_rank < 1)
{
echo("You're already logged out!");
}

setcookie("userinfo_oblivion", " ", time()-3600000);
header("Location: http://blah.com");

exit();

echo("You're now logged out!");
}


Okay, deze code ziet er mijns inziens goed uit, hij zou je sowieso altijd naar Blah moete sture, errors gefixed, ga hier maar eens naar toe: http://www.oblivionsource.com/?page=account&op=logout

En vertel wat er gebeurd :) Idd: Niets..

EDIT:

In de index.php staat bovenaan ob_start();.. zonder spaties verder ofsow..

[ Voor 11% gewijzigd door gyarnoc op 23-05-2005 19:41 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Probeer gewoon je echte file langzaam maar zeker te strippen tot het wel werkt. Dan zie je op een gegeven moment dat hij het wel doet en zit de fout in hetgene je net eruit gehaald hebt, simpel, doeltreffend ( maar kan tijdrovend zijn ).

Oftewel standaard debuggen.

Maar ik vermoed dat je niet helemaal dezelfde "zooi" erop hebt gezet, maar of andere versies of je had eerst je configuratie aangepast.

Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Gomez12 schreef op maandag 23 mei 2005 @ 19:41:
Probeer gewoon je echte file langzaam maar zeker te strippen tot het wel werkt. Dan zie je op een gegeven moment dat hij het wel doet en zit de fout in hetgene je net eruit gehaald hebt, simpel, doeltreffend ( maar kan tijdrovend zijn ).

Oftewel standaard debuggen.

Maar ik vermoed dat je niet helemaal dezelfde "zooi" erop hebt gezet, maar of andere versies of je had eerst je configuratie aangepast.
Yep.. was ik inderdaad al zeer bang voor omdat te gaan doen.. Het vreemde blijft toch dat het bij andere ?pages niet werkt, en bij bijvoorbeeld een los test.php bestandje wel.. Maar ik zal dan alles wel gaan strippen, idd tijdrovend, maar ik zal nog wel eens posten wat de fout was (als ik die ooit vind ;))

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het zit hem gewoon in die vieze constructies die je erin hebt gebouwd. Een goeie pagina maak je zo dat je ob_start() niet nodig hebt om de pagina te laten werken. Echo eerst de headers, daarna pas andere uitvoer. Opvangen met ob_start() of niet maakt niet uit, het is gewoon smerige code en een ramp om te debuggen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Gevonden!

de boosdoener is een Virtual(); iets wat we erbij kregen bij banners die we moesten toevoegen...

virtual("/banner/telefragged/default600.cgi");

http://nl2.php.net/virtual:

virtual() is een Apache-specifieke functie die equivalent is aan <!--#include virtual...--> in mod_include. Het voer een Apache sub-request uit. Deze functie is makkelijk om CGI scripts of .shtml files, of eigenlijk alles dat je zou willen parsen door Apache op te nemen in een PHP script. Let er op dat er voor een CGI script, dat script geldige CGI headers moet genereren. Dit betekend dat er op zijn minst een Content-type header gegenereerd moet worden. Om PHP scripts op te nemen heb je de functies include() of require() nodig; virtual() kan niet gebruikt worden om PHP bestanden te includen.

Verklaard een hoop.

Maar nu wil ik include gebruiken, maar vind ie dus niet leuk.. en mijn host vind het niet leuk als de banners er niet op staan..

Ik ga dus wel ff verder zoeken, maar het grootste deel is dus al opgelost :)


EDIT:

En dus niet ob_start ofsow >:)

[ Voor 4% gewijzigd door gyarnoc op 23-05-2005 19:56 ]


Acties:
  • 0 Henk 'm!

  • gyarnoc
  • Registratie: December 2003
  • Laatst online: 19-09 09:54
Okay, alles is gefixed nu.. thx all

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gyarnoc schreef op maandag 23 mei 2005 @ 20:02:
Okay, alles is gefixed nu.. thx all
En wat was de oplossing nu? Zo heeft natuurlijk niemand er in de search wat aan. :)
En dus niet ob_start ofsow >:)
Dat de fout daar niet in zat wil natuurlijk nog niet zeggen dat je goed bezig bent. Zie mijn vorige post. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
-NMe- schreef op maandag 23 mei 2005 @ 19:36:
Location moet met een hoofdletter. En nu inademen, uitademen, even rustig worden voor je weer post. :*
Headers zijn case-insensitive.
gyarnoc schreef op maandag 23 mei 2005 @ 18:53:
code:
1
header("location: ?page=profile");
Hoewel het vast wel goed gaat, is het niet netjes en zelfs niet correct om geen url specificatie bij de Location mee te sturen. Volgens de HTTP-specificatie moet je een absolute url opgeven (dus met http enzo), de meeste clients accepteren ook relatieve url's wel, maar enkel de query-string opgeven vind ik wel heel ver gaan :)
-NMe- schreef op maandag 23 mei 2005 @ 19:51:
Het zit hem gewoon in die vieze constructies die je erin hebt gebouwd. Een goeie pagina maak je zo dat je ob_start() niet nodig hebt om de pagina te laten werken. Echo eerst de headers, daarna pas andere uitvoer. Opvangen met ob_start() of niet maakt niet uit, het is gewoon smerige code en een ramp om te debuggen.
Ook bij een goed opgebouwde pagina kan het zinvol zijn toch met output buffering te werken. Sowieso om de boel met gzip te comprimeren, maar ook om errors te kunnen geven die niet door een halve pagina heen staan. Soms is het gewoon handiger dan de al gegenereerde output weg te gooien dan allerlei constructies te bedenken waarmee je in wezen hetzelfde doet (eerst de code uitvoeren, dan de output geven).
gyarnoc schreef op maandag 23 mei 2005 @ 19:55:
de boosdoener is een Virtual(); iets wat we erbij kregen bij banners die we moesten toevoegen...

virtual("/banner/telefragged/default600.cgi");

[snip]

Maar nu wil ik include gebruiken, maar vind ie dus niet leuk.. en mijn host vind het niet leuk als de banners er niet op staan..

Ik ga dus wel ff verder zoeken, maar het grootste deel is dus al opgelost :)
Die virtual kan op meerdere manieren vervangen worden. Je zult op een of andere manier de output ervan moeten hebben, of het wel of niet in dezelfde request wordt uitgevoerd is vaak minder relevant. Als het irrelevant is kan je gewoon dmv fpassthrough/readfile/include de complete url (en dus niet de file locatie) includen/inlezen/whatever.
Mocht de virtual-call enkel in de weg zitten met je header-calls, maar wil je die niet verwijdere, voorkom dan gewoon dat de virtual-call uitgevoerd wordt indien dat niet moet gebeuren (exit dus gewoon na de location-header, output wil je toch niet naar de client laten sturen bij zoiets, dus de virtual-call is ook overbodig).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ACM schreef op maandag 23 mei 2005 @ 23:33:
Headers zijn case-insensitive.
Ik meen me te herinneren dat het ooit bij mij niet werkte met een kleine letter. Zal wel weer mijn overmatige fantasie zijn dan. :P
Ook bij een goed opgebouwde pagina kan het zinvol zijn toch met output buffering te werken. Sowieso om de boel met gzip te comprimeren, maar ook om errors te kunnen geven die niet door een halve pagina heen staan. Soms is het gewoon handiger dan de al gegenereerde output weg te gooien dan allerlei constructies te bedenken waarmee je in wezen hetzelfde doet (eerst de code uitvoeren, dan de output geven).
Ik zeg ook niet dat output buffering slecht is. Ik zeg dat het slecht is om in gevallen als dit waar je ook met headers en dergelijke strooit uit te gaan van een output buffer. Ik kan me voorstellen dat je al snel door de bomen het bos niet meer ziet, omdat je de headers maar klakkeloos tussen de uitvoer door zet. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1