Ik heb nu hosting met de nieuwste versie van PHP 4.
Nu heb ik mijn site daar geupload en nu geeft hij een fout.
Klopt het dat bij PHP 4 geen sessies werken?
Dit is de fout:
Citaat:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/geer/domains/geendomein.co.uk/public_html/index.php:11) in /home/geer/domains/geendomein.co.uk/public_html/menu/index.php on line 2
daar is ob_start (output buffering) helemaal niet voor bedoeld. Het is een slordig truukje om er niet meer aan herinnerd te worden dat je script niet helemaal goed is.
session_start(); moet helemaal bovenaan staan, dus boven de <html> tag anders krijg je 'n error, en ob_start(); lost alleen problemen met header("Location: ..."); op volgensmij.
Ow. dan zou je dus met error_reporting(0) hetzelfde kunnen bereiken als ob_start()?
Lijkt me
nee, want het is geen notice ofzo. Er gaat wel echt iets fout. met error_reporting(0) zie je er gewoon geen melding meer van. ob_start() zorgt dat het wel werkt, maar via een omweg. Het is gewoon heel slordig.
Citaat:
en ob_start(); lost alleen problemen met header("Location: ..."); op volgensmij.
het gaat hier ook om headers alleen niet om headers die je zelf stuurt.
ob_start() geeft het startsein voor het bufferen van output. Dat zorgt dus dat er niet steeds tussendoor output verstuurd wordt. Die output wordt gebufferd en die kun je met ob_get_contents() opvragen of met ob_end_flush() versturen. Dit laatste gebeurt ook automatisch aan het eind van je script als je er verder niks mee doet.
@zointer: bij de faq staat deze vraag ook (http://www.sitemasters.be/?pagina=faq/faq&cat=foutmeldingen#err_1), maar daar staan 2 foute oplossingen.
1. ob_start is dus fout
2. met een functie staat de code voor het verzenden van de header (of starten sessie want dat zorgt ook voor het versturen van een header) wel bovenaan in je bestand, maar de header wordt pas verstuurd als je de functie aanroept. Dan kan ergens middenin het script zijn na een paar echo's. Die oplossing slaat dus nergens op.
session_start() bovenaan je pagina zetten is niet genoeg. Alle toekenningen aan $_SESSION moeten ook voor aanvang van je pagina gebeuren, tenzij je ob_start() gebruikt.
ob_start() is trouwens helemaal niet fout, alleen wordt deze functie soms te snel gebruikt. ob_start() sorteert je pagina op headers en "content" dus het gebruik hiervan zou een slordigere programmeerhouding kunnen bevorderen (het maakt niet meer uit waar je iets met $_SESSION of $_COOKIE doet, door ob_start() werkt het gewoon).
Het wordt natuurlijk wat anders wanneer je je in haast onmogelijke bochten moet wringen om alle header-gerelateerde zaken voor aanvang van je pagina af te handelen (denk bijvoorbeeld aan een login-scherm dat onderdeel uitmaakt van je navigatie (een login-include zeg maar)). Soms is het dan gewoon veel praktischer om ob_start() te gebruiken, en dat is ook wel 'algemeen geaccepteerd' denk ik. De programmeurs / scripters moeten er echter altijd voor waken dat hun scripts geen gigantische puinhopen worden.
@FangorN:
als ik je goed begrijp, is $_REQUEST['naam'] ook dus nogal slordig?
want dat maakt geen onderscheid tussen $_POST, $_GET en $_COOKIE.
Is dat zo?
Het is niet "ook" slordig (ik zei nl. dat ob_start() niet (althans, niet per sé) slordig is) - het is alleen niet bepaald specifiek. Ik zou $_REQUEST niet gauw gebruiken denk ik, meestal ben je maar met één of twee van die speciale arrays bezig, dus spreek je die ook direct ($_POST, $_GET en/of $_COOKIE) aan. Ik zie het nut niet echt van $_REQUEST...
session_start() bovenaan je pagina zetten is niet genoeg. Alle toekenningen aan $_SESSION moeten ook voor aanvang van je pagina gebeuren, tenzij je ob_start() gebruikt.
idd. bij de aanroep van session_start() wordt er een cookie (en dus header) verstuurd, dit moet dus voor de output.
bij het toekennen aan $_SESSION komt de waarde die je opgeeft gewoon in het geheugen en aan het eind van je script wordt de hele $_SESSION array serialized weggeschreven naar een bestand. (heeft dus geen invloed op headers/output.
Thomas - 06/05/2005 10:22 (laatste wijziging 06/05/2005 10:32)
Moderator
Fijn dat dat tactloze "dat slaat helemaal nergens op" ook met feiten ondersteund wordt, anders zouden jullie helemaal als een stelletje boeren overkomen.
Je kan het natuurlijk ook anders brengen he ?
Het moet dus blijkbaar niet, maar het lijkt mij wel een nette gewoonte om alle toekenningen aan $_SESSION op één plaatst te zetten (bijvoorbeeld aan het begin van je pagina, omdat je (ik althans) daar meestal ook formulieren verwerkt die van invloed kunnen zijn op sessie-inhoud). Omdat ik dat altijd zo gedaan heb zal ik misschien gedacht hebben - my bad, maar omdat meteen zo neer te knuppelen... We maken allemaal wel eens fouten eh ?