Avatar billede bas Forsker
15. maj 2004 - 19:52 Der er 32 kommentarer og
1 løsning

Problemer med headers

Jeg skal have lavet en login funktion.
Jeg har fundet et eksempel på nettet, som
jeg umiddelbart ser meget godt ud.

Eksemplet kan ses her:

http://www.rolator.dk/artikel/artikel_laes.php?artikel_id=15

Jeg ved godt det er lidt dumt / dovent at copy-paste i stedet for at lave det selv fra grunden, men jeg er nødt til lige at forstå, hvordan det fungerer.

Jeg får følgende fejl:

Cannot send session cookie - headers already sent by...

set_sessions.php on line 15



Cannot send session cache limiter - headers already sent..

set_sessions.php on line 15


Cannot modify header information - headers already sent by..

set_sessions.php on line 27

Jeg er klar over, at det har noget at gøre med at formularens indhold allerede er sendt afsted, men er ikke helt klar over, hvad der sker, eller hvordan jeg retter fejlen.

På fårhånd tak.

/Martin
Avatar billede Slettet bruger
15. maj 2004 - 19:58 #1
Kom lige med de komplette fejlbeskeder.
Avatar billede Slettet bruger
15. maj 2004 - 20:20 #2
Du skal bare smide de funktioner der benytter sig af headerinformationer op før du skriver dit første <html> tag.

--
pacroon
Avatar billede bas Forsker
15. maj 2004 - 21:45 #3
> sandbox

Jeg får nedenstående, hvis jeg bare skrier noget tilfældigt i felterne:

Warning: Cannot modify header information - headers already sent by (output started at /disk02/www/detour.dk/login/conn_detour.php:3) in /disk02/www/detour.dk/login/set_sessions.php on line 27
Avatar billede bas Forsker
15. maj 2004 - 21:46 #4
> sandbox

og følgende, hvis jeg skriver det rigtige "brugernavn" og "kodeord"

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /disk02/www/detour.dk/login/conn_detour.php:3) in /disk02/www/detour.dk/login/set_sessions.php on line 15

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /disk02/www/detour.dk/login/conn_detour.php:3) in /disk02/www/detour.dk/login/set_sessions.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at /disk02/www/detour.dk/login/conn_detour.php:3) in /disk02/www/detour.dk/login/set_sessions.php on line 27
Avatar billede bas Forsker
15. maj 2004 - 21:53 #5
> pacr00n

Problemerne befinder sig vel i set_sessions.php i linie 15 og 27.

Set_sessions.php indeholder ikke HTML

På linie 15 står der session_start();

På linie 27 står der header("location: start.php");

/Martin
Avatar billede Slettet bruger
15. maj 2004 - 22:13 #6
Der bliver udskrevet et eller andet på linie 3 i conn_detour.php. PHP kan ikke sende headers, når der allerede er lavet output.

Det er nok bare et mellemrum eller linieskift uden for <?php ?> taggene, men det er også nok. Prøv at se, om der ikke skulle være noget i den stil.

(Og det var derfor, jeg skulle bruge den komplette fejl. Du stoppede nemlig med at skrive lige der, hvor det relevante stod i fejlbeskeden.)
Avatar billede bas Forsker
15. maj 2004 - 23:13 #7
Hmm, jeg kan ikke lige se, om der skulle være problemer med
conn_detour.
På linie 3 står der <?php

<?php
$DBNAME = '****';
$Host = '******';
$User = '******';
$Password = '*******';

$connect = mysql_connect ($Host. ':' .$DBNAME, $User, $Password);

/* Vigtigt: Her vælges databasen */

mysql_select_db("detour", $connect);


if (!$connect){
    Print ("Ingen forbindelse til databasen. <br>");
    exit;
    }
   
?>
Avatar billede bas Forsker
15. maj 2004 - 23:37 #8
Ok, nu er fejlbeskederne væk.
php koden skal åbenbart starte på første linie
i conn_detour.php.

Men jeg kommer til start.php ("Du er ikke logged ind"),
uanset, hvad jeg skriver eller ikke skriver i formularen.

Er det måske fordi der er en fejl i if-sætningen i start.php ?
Avatar billede Slettet bruger
15. maj 2004 - 23:37 #9
Havd står der på linie 1 og 2? Hvis de er blanke, så skal du fjerne dem.
Avatar billede bas Forsker
15. maj 2004 - 23:40 #10
nej ups, nu virker det vist.
Jeg har måske tastet forkert.

Nej hvor fedt!

Mange tak for hjælpen.

> sandbox poster du lige et svar -
du sendt mig på sporet.

/Martin
Avatar billede Slettet bruger
15. maj 2004 - 23:45 #11
OK.

Men husk til en anden gang at skrive hele fejlbeskeden. Hvis der kommer flere næsten ens beskeder efter hinanden, kan du dog tit nøjes med den første og eventuelt skrive den del af de efterfølgende, som ikke er magen til den første.
Avatar billede bas Forsker
15. maj 2004 - 23:46 #12
linie 1 og 2 hvor ?

Der er alligevel stadigvæk lidt knas med

Men jeg kommer til start.php ("Du er ikke logged ind"),
uanset, hvad jeg skriver eller ikke skriver i formularen.
Avatar billede Slettet bruger
15. maj 2004 - 23:51 #13
Nu har jeg lige set nærmere på den lille script-samling og opdaget, at de er lavet til at blive bruget med register_globals slået til. Det har været slået fra som standard (med god grund) i de sidste mange udgaver af PHP.

Øjeblik, så finder jeg de steder, der skal rettes til.
Avatar billede bas Forsker
15. maj 2004 - 23:57 #14
mange tak.
Avatar billede Slettet bruger
16. maj 2004 - 00:29 #15
Der er tre vigtige steder, der skal rettes til:

set_sessions.php:
----------------------------------------------------

<?php
/*
Session registreringside til tutorial'en: Sikker login med sessions og MySQL.
Lavet af Tim Lund aka nimmr.
HP: http://nimmr.dk
Mail: nimmr@secret.dk

Redigeret til at virke med register_globals=off af Ole Hansen aka sandbox
*/
if(isset($_POST['form_brugernavn'])&&!empty($_POST['form_brugernavn'])&&isset($_POST['form_kodeord'])&&!empty($_POST['form_kodeord'])) {
  /* if($form_brugernavn&&$form_kodeord) { */
  /* jeg inkludere filen connect.php som søger for at jeg har forbindelse til en database. */
  include("connect.php");
  /* Tjekker om der er en bruger konti der eksisterer med de intastede værdier. */
  $query =  mysql_query("SELECT * FROM login WHERE brugernavn='$form_brugernavn' AND kodeord='$form_kodeord'");
  if(mysql_num_rows($query)==1) {
    session_start();
    /* Begynder at hive data ud af tabellen, som skal blive brugt på siderne. */
    $data = mysql_fetch_object($query);
    $_SESSION['ses_brugernavn'] = $data->brugernavn;
    $_SESSION['ses_kodeord'] = $data->kodeord;
  }
}
/* Sender brugeren videre til login.php
Det er vigtigt at der ikke kommer noget output til browseren på en side hvor man bruger header();
Der må fx. ikke være en echo */
header("location: start.php");
?>

-----------------------------------------------------

I start.php skal du lave 2 linier om:

if(checklogin($_SESSION['ses_brugernavn'], $_SESSION['ses_kodeord'])) {
echo "Velkommen {$_SESSION['ses_brugernavn']}. Du har kodeordet {$_SESSION['ses_kodeord']}<br><a href='logout.php'>Log ud</a>";

og tilsvarende i logout.php

$_SESSION['ses_brugernavn'] = null;
$_SESSION['ses_kodeord'] = null;

Endelig kunne det være en god ide at flytte DOCTYPE-linien i login.html op før kommentaren, da Internet Explorer ellers måske ikke fatter den.
Avatar billede Slettet bruger
16. maj 2004 - 00:33 #16
Ups, jeg manglede en rettelse mere i set_sessions.php. Desuden er linierne lange, så de ikke kan ses her på E. Her er en bedre udgave af den fil:

<?php
/*
Session registreringside til tutorial'en: Sikker login med sessions og MySQL.
Lavet af Tim Lund aka nimmr.
HP: http://nimmr.dk
Mail: nimmr@secret.dk

Redigeret til at virke med register_globals=off af Ole Hansen aka sandbox
*/
if(isset($_POST['form_brugernavn']) && !empty($_POST['form_brugernavn']) && isset($_POST['form_kodeord']) && !empty($_POST['form_kodeord'])) {
  /* if($form_brugernavn&&$form_kodeord) { */
  /* jeg inkludere filen connect.php som søger for at jeg har forbindelse til en database. */
  include("connect.php");
  /* Tjekker om der er en bruger konti der eksisterer med de intastede værdier. */
  $query =  mysql_query("SELECT * FROM login WHERE brugernavn='{$_POST['form_brugernavn']}' AND kodeord='{$_POST['form_kodeord']}'");
  if(mysql_num_rows($query)==1) {
    session_start();
    /* Begynder at hive data ud af tabellen, som skal blive brugt på siderne. */
    $data = mysql_fetch_object($query);
    $_SESSION['ses_brugernavn'] = $data->brugernavn;
    $_SESSION['ses_kodeord'] = $data->kodeord;
  }
}
/* Sender brugeren videre til login.php
Det er vigtigt at der ikke kommer noget output til browseren på en side hvor man bruger header();
Der må fx. ikke være en echo */
header("location: start.php");
?>
Avatar billede bas Forsker
16. maj 2004 - 00:50 #17
> mange tak for rettelserne

Jeg kigger først på det i morgen (eller skal vi sige senere idag :-))
Det bliver noget rod, hvis jeg begynder at rode med det nu.

Kan det være det med register_globals, der skaber knas med login meddelelserne ?

Har du testet det du har lavet ?

/Martin
Avatar billede Slettet bruger
16. maj 2004 - 01:32 #18
Ja, det var lige netop register_globals, der skabte problemer. (Vil jeg da tro. Hvis du kører på en IIS-server kan det også være, at den simpelthen nægter at lave en cookie samtidig med en location-header.)

Nej, jeg har ikke lige testet. Jeg har dog selv et system, der ligner lidt, og som jeg ved virker.

Du kan prøve at se nogle af filerne på:

http://sandbox.adsl.dk/login.phps
http://sandbox.adsl.dk/forside.phps

I mit eget system har jeg dog samlet en del af funktionerne på forsiden.
Avatar billede bas Forsker
16. maj 2004 - 14:48 #19
> sandbox

Nu tror jeg, at jeg har foretaget de rettelser du har beskrevet.
Jeg kan godt blive logget ind.

Men nu bliver jeg nogle gange også logget ind, selv om jeg skriver det forkerte.
Men kan det være fordi den netop gemmer sessionen og husker oplysningerne i set_sessions.php ?

/Martin
Avatar billede bas Forsker
16. maj 2004 - 14:59 #20
Der er desværre problemer.

Det er ikke altid jeg bliver logget ind, selv om jeg skriver det rigtige,
og nogle gange bliver jeg logget ind selv om jeg skriver forkert.

Jeg kan heller ikke helt finde ud af, hvad der sker, når jeg klikker på log ud.
Er det ikke meningen, at sessionerne skal lukkes ?

Jeg ved ikke, hvad der sker.

/Martin
Avatar billede bas Forsker
16. maj 2004 - 16:03 #21
> sandbox

Jeg har fundet et eksempel fra en bog, som umiddelbart virker meget godt:

http://www.detour.dk/login_function/secretdb.phps

Men jeg kan så se, at det mangler sessioner og log ud funktion, men ville man kunne bygge det på, på en eller anden måde ?

/Martin
Avatar billede sukos Juniormester
16. maj 2004 - 16:06 #22
Her er lidt forskelligt du kan rode med, evt.
http://www.showsource.dk/php/?list=Login

og her på exp er der selvf. "fuld support" fra mig, hvis du ikke lige kan finde ud af det! :O)
Avatar billede bas Forsker
16. maj 2004 - 16:20 #23
Mange tak.

Jeg har lige opdaget, at jeg har en bog, hvor det ser ud til, at
der er et eksempel med sessioner og logout, så den tror jeg lige jeg fordyber
mig i.

Post lige en reminder, hvis der går for lang tid, inden jeg lukker :-)
Avatar billede bas Forsker
16. maj 2004 - 17:18 #24
> sandbox

Nu VIL jeg have det til at virke :-)
Jeg har besluttet mig for at holde mig til eksemplet i bogen.
Men det giver desværre også lidt problemer.
Eksemplet består af følgende tre filer:

http://www.detour.dk/login_ses/authmain.phps

http://www.detour.dk/login_ses/members_only.phps

http://www.detour.dk/login_ses/logout.phps

Jeg kan ikke blive logget ind.
Jeg får:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /disk02/www/detour.dk/login_ses/authmain.php on line 14

På linie 14 står der if (mysql_num_rows($result) >0 )
Avatar billede Slettet bruger
16. maj 2004 - 18:25 #25
Den er også skrevet til register_globals=on, så det er en del af problemet.

Hvis man idag skal skrive et script, så skal oplysninger fra formularer hentes fra $_POST og session_register() skal man ikke bruge, men man skal i stedet gemme oplysningerne i $_SESSION.

Derudover sker der en fejl, når den forsøger at slå op i databasen. Det er det, der giver den fejlbesked, du ser.

Prøv at rette
$result = mysql_query($query, $db_conn);

til
$result = mysql_query($query, $db_conn) or die(mysql_error());

Så vil du få at vide, hvad der går galt.
Avatar billede bas Forsker
16. maj 2004 - 18:53 #26
> Det ser ud til at virke helt fint nu.
Jeg havde angivet en forkert database, og
så havde jeg ikke lige fattet, at password
er krypteret.

pass=password('$password')

insert into auth values
  ( 'testuser', password ('test123') );

Hvad er det du mener, der skal laves om og hvor ?

/Martin
Avatar billede Slettet bruger
16. maj 2004 - 19:00 #27
Er register_globals slået til eller fra på din server? Hvis den er slået til, så kan scriptet godt virke, og ihvertfald som det ser ud nu er det også rimeligt sikkert.

Hvis du ikke ved, om det er slået til, kan du lave et script, som bare ser ud som nedenfor, og se en hel masse oplysninger om din server. (Meget mere end du har lyst til at vide ;-))

<?php
phpinfo();
?>
Avatar billede bas Forsker
16. maj 2004 - 19:19 #28
Register_globals er on (local og master) på min server.
Men bør jeg foretage rettelserne uanset hvad,
eller afhænger det af, hvordan den pågældende server er sat
op ?

Hilsen Martin
Avatar billede Slettet bruger
16. maj 2004 - 19:36 #29
Ja, og hvis ikke du har ting installeret, som kræver register_globals=on, så bør du også slå den fra.

Fidusen med register_globals er nemlig, at det gør det meget nemt at få variable ind i sit script. Når det er slået til, kan man meget nemt komme til at bruge en variabel, som ikke lige kommer derfra, hvor man tror.

Prøv for eksempel at se på følgende kode:

<?php
// dette er login-koden - nedenstående køres hvis login er korrekt.
session_start();
session_register('loggetind')
$loggetind=true;
?>

og en anden side, som checker om man er logget ind:

<?php
session_start();
if($loggetind){
  echo "Velkommen";
} else {
  echo "Du skal logge ind";
}
?>

Hvis jeg nu i stedet for at logge ind, skriver følgende i min adresselinie: server/side2.php?loggetind=1 så kan jeg se det beskyttede indhold. Det script, du havde fra den bog, kontrollerer, om variablen kommer fra det rigtige sted, så det har ikke denne fejl, men det er meget nemt at forfalde til usikker kodeskik, når register_globals er slået til.

De fleste webhoteller er skiftet (eller er ved at skifte) til register_globals=off, så bare af den grund er det en god ide at vænne sig til at lave kode, der passer til.
Avatar billede bas Forsker
16. maj 2004 - 21:47 #30
Kan jeg få dig til at fortælle mig, hvad det er jeg bør rette
i de tre filer for at optimere dem ?
Jeg vil da gerne have det rettet til nu når jeg er i gang med dem.

Hilsen Martin
Avatar billede Slettet bruger
16. maj 2004 - 22:08 #31
Problemet er, at der bliver brugt de globale variable over det hele, så det er faktisk al koden, der skal skrives om. Men her er rettelserne:

if (session_is_registered("valid_user"))

bliver til

if (!empty($_SESSION['valid_user']))

$valid_user skal alle steder rettes til $_SESSION['valid_user']

session_register("valid_user");
skal fjernes

$userid skal være $_POST['userid']
$password skal være $_POST['password']

Der er nok et par ting, jeg har overset.
Avatar billede bas Forsker
16. maj 2004 - 22:21 #32
> sandbox

Jeg vil sige mange tak for din hjælpsomhed :-)
Så kan det også være det er ved at være lukketid for mit vedkommende.

Hilsen Martin
Avatar billede Slettet bruger
17. maj 2004 - 20:51 #33
Hvis du også skal have svar fra sukos eller pacr00n, skal du lige bede dem om det. Ellers skal du bare acceptere mit svar. (Husk at markere navnet i listen, ellers sker der ingen ting - selv om der kun står mit navn.)
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