Gå til innhold

Session-errors i PHP-innloggingsscript [LØST]


Anbefalte innlegg

Skrevet (endret)

Heisann.

 

Skal lage en enkel logginnside, og fant en tutorial på nettet. Brukernavn og passord blir hentet via en database, og dette fungerer fint. Etter hvert så har det bare blitt tull, og nå får jeg denne feilen:

 

Warning: session_register() [function.session-register]: Cannot send session cache limiter - headers already sent (output started at /home/pk/public_html/admin/rch_sjekklogginn.php:14) in /home/pk/public_html/admin/rch_sjekklogginn.php on line 39

 

Warning: Cannot modify header information - headers already sent by (output started at /home/pk/public_html/admin/rch_sjekklogginn.php:14) in /home/pk/public_html/admin/rch_sjekklogginn.php on line 41

 

Koden er som følgende, hva er feil?

 

<html>
<head>
<center>
<title>Administratorpanel</title>
</head>

<body bgcolor="#F0E68C">

<br><br>




<?php
ob_start();
$host="localhost"; 
$username="**"; // >Brukernavn /mysql)
$password="**"; // Passord (mysql)
$db_name="**"; // Databasenavn
$tabell="**"; // Tabellnavn 

// Kobler opp mot databasen
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// Henter brukernavn og passord fra rch_logginn.php
$brukernavn=$_POST['brukernavn']; 
$passord=$_POST['passord']; 

$sql="SELECT * FROM $tabell WHERE brukernavn='$brukernavn' and passord='$passord'";
$result=mysql_query($sql);

// Mysql_num_row teller tabellrader
$count=mysql_num_rows($result);
// Hvis passord og brukernavn er korrekt, maa rad vaere 1

if($count==1){
// Registrerer $brukernavn og $passord og viderekobles til rch_logginn_vellykket.php
session_register("brukernavn");
session_register("passord"); 
header("location:rch_logginn_vellykket.php");
}
else {
echo "Feil brukernavn eller passord. Prøv på nytt.<br><br><br>";
echo '<a href="rch_logginn.php">Tilbake</a>';
}

ob_end_flush();
?>

</center>
</html>

 

 

 

Forresten, hva betyr ob_start(); og ob_end_flush();?

 

Og ja, koden til siden den linker til:

 

<? 

session_start();
if(!session_is_registered(brukernavn)){
header("location:rch_logginn.php");
}
?>

 

 

 

 

Takker på forhånd for gode svar! :)

Endret av steinslett
Videoannonse
Annonse
Skrevet

ob_start betyr and PHP holder igjen all output til det har parset hele scriptet, og så printer den det ut.. Det lar deg for eksempel endre headere underveis i scriptet.

 

ob_end_flush() avslutter OutputBuffering som ob_start() skrur på, og printer ut all tekst som er lagret så langt.

 

ob_start() må plasseres helt i starten, før <html> og all annen output.

ob_end_flush() kan du fjerne fra scriptet fordi den trenger du ikke, den blir kjørt automatisk på slutten av scriptet..

Skrevet (endret)

legg ob_start() helt først i filen (før <html>)

 

<?php ob_start() ?>
<html>
.....

 

ob_start(); forteller php at den skal vente med å sende output til ob_end_flush(); dukker opp.

 

dette er praktisk når man er avhengig av at koden må kunne sende headers. Headers kan ikke sendes etter output har startet.

 

bytt også ut header('location:rch_logginn.php');

med: header('Location: rch_logginn.php'); (viktig med stor bokstav og mellomrom etter colon)

 

edit: husk og slett brukeren test med passord test før du legger noe viktig på siden ;)

 

det er forresten en litt gammel fremgangsmåte å bruke session_is_registered

 

<?php

// funksjoner

function my_esc ($msg) {
 if (!is_numeric ($msg)) {
if (get_magic_quotes_gpc ()) $msg = stripslashes($msg);
$msg = "'".mysql_real_escape_string($msg)."'";
 }
 return $msg;
}

function check_var ($var, $type = 0) {
 if ($type === 0) $type =& $_POST;
 else $type =& $_GET;
 if (isset ($type[$var]) && !empty ($type[$var])) return TRUE;
 else return FALSE;
}

session_start();

mysql_connect ('localhost', 'brukernavn', 'passord') or die (mysql_error());
mysql_select_db ('databasenavn') or die (mysql_error ());

if (isset ($_SESSION['auth'])) $auth = $_SESSION['auth'];

// $auth er true når brukeren er logget inn

// login form
$loginform = '';
if (!$auth === TRUE) {
 $loginform = <<< EOF
<form action="" method="post">
 <table>
<tr>
  <td><label for="username">Brukernavn: </label></td>
  <td><input type="text" name="username" /></td>
</tr><tr>
  <td><label for="password">Passord: </label></td>
  <td><input type="password" name="password" /></td>
</tr><tr>
  <td colspan="2"><input type="submit" name="submit_login" value="Logg inn" /></td>
</tr>
 </table>
</form>
EOF; // echo $loginform der du ønsker den på siden. vises kun dersom bruker ikke er innlogget
}

// login logikk

if (isset ($_POST['submit_login'])) {
 check_var ('username') or die ('Brukernavn ikke skrevet inn');
 check_var ('password') or die ('Passord ikke skrevet inn');
 $res = mysql_query('SELECT password FROM tabell where username = '.my_esc ($_POST['username']).';') or die (mysql_error ());
 $row = mysql_fetch_row ($res) or die (mysql_error ());

 if (!strcmp ($row[0], $_POST['password'])) {
$_SESSION['auth'] = TRUE;
$message = 'Login vellykket!';
 } else $message = 'Login feilet!';
}

?>

 

du bør også lagre passord i tabellen som sha('passord') og slenge på en sha() rundt $_POST['password'] i strcmp();

Endret av grimjoey
Skrevet

Okei, kjekt å vite. Og takk!

 

Da gikk den ihvertfall videre til selve administratorpanelet (rch_logginn_vellykket.php, men her får jeg feilen

 

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/pk/public_html/admin/rch_logginn_vellykket.php:18) in /home/pk/public_html/admin/rch_logginn_vellykket.php on line 23

Innlogging vellykket.

 

 

 <html>
<head>
<center>
<title>Administratorpanel</title>
</head>

<body bgcolor="#F0E68C">

<br><br>

<h1 align=center><b><i><u>Velkommen til administratorpanelet.</u></i></B></h1>

<br><br><br>




<? 

// Sjekker om sessionen er registrert, er den ikke det gaar den tilbake til hovedsiden.


session_start();
if(!session_is_registered(brukernavn)){
header('Location: rch_logginn.php');
}
?>

<html>
<body>
Innlogging vellykket.
<br>
<br>

<br>
<br>
<br>
<a href="rch_loggut.php">Logg ut som Administrator.</a>



</center>
</body>
</html>

 

Dere så ikke hvorfor Opera o.l. ikke kan trykke på Submit?

Skrevet
legg ob_start() helt først i filen (før <html>)

 

 

 

edit: husk og slett brukeren test med passord test før du legger noe viktig på siden ;)

 

 

Hahahahah! Ja, jeg vet. Laget den i tilfelle noen av dere skulle få prøve. :p Skal fjerne den etterpå. ;)

Skrevet

Legg til ob_start() øverst nok en gang..

Egentlig skal man starte sessions før du starter output.. Ganske enkelt fordi sessions krever at du sender ut noen headere, og det kan du ikke gjøre etter output er sendt..

Skrevet
Legg til ob_start() øverst nok en gang..

Egentlig skal man starte sessions før du starter output.. Ganske enkelt fordi sessions krever at du sender ut noen headere, og det kan du ikke gjøre etter output er sendt..

Nei har du sett.

Tusen takk!

 

Ingen som har noen formening om hvorfor det ikke fungerer i Opera, IE osv?

Skrevet (endret)

kan være dårlig formatering av headerene dine.

 

"location:url" er feil

 

det skal være

 

"Location: url"

 

edot: men bruk heller koden min. tror den er sikrere og mer praktisk. du bare inkluderer den i alle sidene du ønsker session og sjekker om bruker er innlogget med if ($auth) i koden din. echo $loginform der du vil ha loginformen og echo $message der du vil ha meldingen om feilet eller godkjent login (koden er utestet, kan være noen syntax feil)

Endret av grimjoey
Skrevet (endret)
kan være dårlig formatering av headerene dine.

 

"location:url" er feil

 

det skal være

 

"Location: url"

 

edot: men bruk heller koden min. tror den er sikrere og mer praktisk. du bare inkluderer den i alle sidene du ønsker session og sjekker om bruker er innlogget med if ($auth) i koden din. echo $loginform der du vil ha loginformen og echo $message der du vil ha meldingen om feilet eller godkjent login (koden er utestet, kan være noen syntax feil)

 

Okei, har lagt til html osv, hadde jeg jo glemt. Ser slik ut nå:

 

<html>

<head>

<title>Administratorpanel</title>
</head>

<body bgcolor="#F0E68C">

<br><br>
<center>
<h1 align=center><b><i><u>Logg inn</u></i></B></h1>

<br><br><br>



<form name="form1" method="post" action="rch_sjekklogginn.php">

<input name="brukernavn" type="text" id="brukernavn" size="15" ><br>

<input name="passord" type="password" id="passord" size="15" ><br><br>

<input type="submit" name="submit" value="Logg inn">

<input type="reset" name="reset" value="Nullstill">

</form>
<br><br>
Du er ikke logget inn.
<br><br>
</body>
</center>
</html>

 

 

Skal prøve meg på koden din i morgen da, og se om jeg får den til. Tar kveld nå snart! Takk for all hjelpen. :)

Endret av steinslett
Skrevet (endret)
min var dårlig eller den du hadde? tenker min hadde et par syntaks feil. har du testet den?

 

Testet den nå, feil på linje 11 allerede :p Skal se på den litt senere :)

 

Parse error: syntax error, unexpected '}' in /test.php on line 11

Endret av steinslett
Skrevet
"unexpected <something> in /fil ...." betyr som regel at det mangler et semikolon på en av linjene før.

 

I dette tilfellet manger det semikolon etter return $msg.

 

 

Stemmer det ja, neste feil er:

 

Parse error: syntax error, unexpected T_START_HEREDOC in /home/pk/public_html/admin/test.php on line 33

Skrevet (endret)

der må du legge til likhetstegn før <<<

 

edit: jeg er flink til å glemme semicolon. og den HEREDOC feilen hadde jeg i et annet script jeg lagde så regner med det er likhetstegnet som mangler.

 

edit: har oppdatert koden ovenfor og rettet de to feilene.

Endret av grimjoey

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...