Avatar billede charsikrakur Nybegynder
10. februar 2013 - 14:03 Der er 14 kommentarer og
1 løsning

session_start fejl ved PHP5

Hey. Har en localserver med PHP 4.2 og Apache 1.3, men har også et webhost hvor der er PHP5 og Apache 2. Men når jeg lægger mine php scripts op på hostet skriver den at der er en fejl i linje 2 ved min session_start() noget i nærheden af:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/loloste/public_html/xchat/index.php:1) in /home/loloste/public_html/xchat/index.php on line 2

Forstår ikke lige princippet med PHP5 og sessions?
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 14:08 #1
LOL fandt fejlen...
Man skal skrive:
ob_start();
@session_start();'

Lukket
Avatar billede moddi100 Seniormester
10. februar 2013 - 15:13 #2
Det fjerner ikke din fejl, men skjuler den blot. Fejlen ligger i at "headers already sent", det vil altså sige at der er udskrevet noget inden du skriver session_start().

Som regel ved disse fejl er der tale om et simpelt mellemrum før <?php tegnene - hvilket fejlbeskeden også antyder idet det sker på linje 1 i din fil.

Hvis man har flere filer og ikke kalder session_start() i den første, men i en man include()'er kan funktionen ob_start() som du selv skriver være brugbar. Eksempel:

index.php
<?php

// Output ikke indhold med det samme, men vent
// til vi kalder ob_end_flush() eller lign. Herved virker
// funktioner såsom header(), setcookie(), session_start() m.fl.
ob_start();

// Include() dine filer. Hvad de indeholder er
// sådan set underordnet
include 'funktioner.php';
include 'session.php';

// Send output til browseren. Kaldes automatisk når dit script,
// er færdigt. Det er dog god skik selv at kalde den
ob_end_flush();
?>


session.php

<?php
// Vi kan godt have mellemrum inden <?php da vi
// tidligere har kaldt ob_start()
session_start();
?>


Her er der altså tale om at ob_start() kaldens INDEN der sendes noget output til browseren, såsom det mellemrum du sandsynligvis har. Med den kode du bruger fra #1, skjuler du blot fejlmeddelelsen med @-tegnet. Derfor burde dine sessions stadigvæk ikke virke, men det kan jo også være, at du ubevidst har fået slettet det mellemrum.
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 17:20 #3
Hvad er ideen med session.php?
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 17:22 #4
Altså. Jeg har en include "../config/db_connect.php"; på alle sider. Dvs. jeg kan godt putte min session_start(); ind i db_connect.php og så bare starte alle sider med ob_start() og slutte alle siderne med ob_end_flush();
Avatar billede olebole Juniormester
10. februar 2013 - 18:44 #5
<ole>

Som moddi100 allerde har forklaret, så fejler din kode stadigvæk. Du gemmer blot fejlen - ligesom hvis du tramper på termometret. Du kan ikke se, at patienten har feber, men han er stadig lige syg  *o)

Derudover bruger man aldrig output buffering (ob_start og ob_end_flush), når man overhovedet kan undgå det - og du har intet at bruge det til. OB gør, at hele dokumentet opbevares i serverens hukommelse, indtil det er skrevet helt færdigt, hvilket er hamrende ineffektivt.

Når man sætter en header (f.eks. bruger session_start eller sætter en cookie), må der ikke være outputtet noget til browseren. Bare et mellemrum eller et linjeskift resulterer i en fejl.

Det er bare det, du skal undgå. Så får du ikke fejl - og du bliver fri for at skulle lave 'panikløsninger'  =)

/mvh
</bole>
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 20:03 #6
Hehe, jeg er totalt PHP 4 inkarneret :D Men tror jeg har fattet det nu. Altså. Jeg skal lave en session.php med indholdet "<?php session_start(); ?> og intet andet og include den på alle siderne???  Har jeg forstået det rigtigt ?
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 20:18 #7
Eller nej.. Fatter ingen ting. Kan jeg åbne en ny tråd? Eller kan man besvare stadigvæk??? Kunne godt tænke mig et eksempel på nogle multiple sessions i PHP5.
Avatar billede olebole Juniormester
10. februar 2013 - 20:21 #8
For det første har problemet intet med PHP4 contra 5 at gøre. Derudover må du nok forklare, hvad du mener med 'multiple sessions'
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 20:40 #9
Nej okay...Er nok bare lidt rusten... Det er fordi login session'en virker fint men bare ikke alle de andre....
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 20:41 #10
Undskyld ikke login-session men sessionen der har navnet $_SESSION["username"]
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 21:14 #11
Jeg er også lidt fatsvag mht. sessions og PHP5 det burde være forholdsvis enkelt at oversætte kode fra 4 -> 5
Avatar billede olebole Juniormester
10. februar 2013 - 21:39 #12
Både ja og nej. Det kommer helt an på, hvad der er tale om. Der er en del forskelle - ikke mindst, hvad angår OOP - så på nogle områder er det ikke helt så enkelt  =)

Det er ikke underligt, at din kode virker i nogle sammenhænge, men ikke i andre. Det hele skyldes som sagt, at du outputter et eller andet til browseren, før du kalder session_start.

At du ikke får advarslen (det er ikke en fejl) udskrevet på din lokale server, skyldes at PHP er sat uhensigtsmæssigt op. Når man skal udvikle, er det vigtigt at få vist alle fejl og advarsler, da de skyldes dårlig kodestil.

Du sætter fejlmeddelelser under error_reporting i din php.ini
Avatar billede charsikrakur Nybegynder
10. februar 2013 - 23:24 #13
Ja ok, ja der må ryge et eller andet ud inden, det forstår jeg så nu, hvad I mener....Og du har sikkert ret. Men må bare tage ved lærer af PHP5 og gå min kode en ekstra tur igennem indtil jeg finder grunden(stedet) til fejlen.
Kan det have noget at gøre med at jeg har en header("location: ../"); ? måske ? Jeg har ikke engang adgang til at ændre min PHP.ini på webhotellet, men jeg flytter i min lejlighed den første marts, så sætter jeg min egen server op, så kan jeg tilpasse den til mig :) Men self. du har ret olebole det er vigtigt at have god orden i sin kode sådan det ikke bare et sådan noget klamhuggeri kan man godt kalde det!!!
Avatar billede moddi100 Seniormester
12. februar 2013 - 17:09 #14
Om serveren ligger hos dig selv eller et webhotel er underordnet. error_reporting kan sættes uden for php.ini også. Dog hjælper det ikke at ændre disse indstilliger, såfremt du smider et @ foran alle funktionskald - det skjuler jo netop fejl og advarsler.

At jeg henviste til filen session.php før var blot et eksempel på at man kunne anvende flere filer, hvor en eller flere af dem bruger sessions eller lign.

Men hvordan ser den kode ud der giver fejl? Kopier og indsæt den på http://pastebin.com/
Avatar billede olebole Juniormester
12. februar 2013 - 18:00 #15
#13: Fejlen/advarslen udløses som sagt, hvis du har skrevet noget ud til browseren, før du forsøger at sætte en header. Hvis du f.eks. har bare et enkelt linjeskift


// her
<?php
    header( ... ... );
    ...
    ...
?>

- går det galt. Det behøver ikke være header - det kan også være session_start.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester