Session Check pagina error
je naar een bepaalde pagina kunt. En als je niet bent ingelogd word je geredirect naar een error page. Maar als ik dit doe krijg ik een header error die als volgt is:
Quote:
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\header.php:124) in C:\xampp\htdocs\session_test.php on line 5
Deze verwijst naar login.php die ik ook in deze pagina heb ge-included daar log je in en als je bent ingelogged dan zegt die welkom blablabla en logout.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
===// Sesion_Test.php \\===
<?php include("header.php"); ?>
<?php
if(isset($_SESSION['username'])) {
echo 'Je bent ingelogged!';
} else {
header("Location: errorpage.php");
}
?>
<?php include("footer.php"); ?>
===// login.php \\====
<?php
if (!session_is_registered('loginid') || !session_is_registered('username'))
{
// user is not logged in.
if (isset($_POST['cmdlogin']))
{
// retrieve the username and password sent from login form
// First we remove all HTML-tags and PHP-tags, then we create a md5-hash
// This step will make sure the script is not vurnable to sql injections.
$u = strip_tags($_POST['username']);
$p = (strip_tags($_POST['password']));
//Now let us look for the user in the database.
$query = sprintf("SELECT acct FROM accounts WHERE login = '%s' AND password = '%s' LIMIT 1;",
mysql_real_escape_string($u), mysql_real_escape_string($p));
$result = mysql_query($query);
// If the database returns a 0 as result we know the login information is incorrect.
// If the database returns a 1 as result we know the login was correct and we proceed.
// If the database returns a result > 1 there are multple users
// with the same username and password, so the login will fail.
if (mysql_num_rows($result) != 1)
{
// invalid login information
echo "Wrong username or password!";
//show the loginform again.
include "loginform.php";
} else {
// Login was successfull
$row = mysql_fetch_array($result);
// Save the user ID for use later
$_SESSION['loginid'] = $row['loginid'];
// Save the username for use later
$_SESSION['username'] = $u;
// Now we show the userbox
show_userbox();
}
} else {
// User is not logged in and has not pressed the login button
// so we show him the loginform
include "loginform.php";
}
} else {
// The user is already loggedin, so we show the userbox.
show_userbox();
}
?>
<?php include("header.php"); ?>
<?php
if(isset($_SESSION['username'])) {
echo 'Je bent ingelogged!';
} else {
header("Location: errorpage.php");
}
?>
<?php include("footer.php"); ?>
===// login.php \\====
<?php
if (!session_is_registered('loginid') || !session_is_registered('username'))
{
// user is not logged in.
if (isset($_POST['cmdlogin']))
{
// retrieve the username and password sent from login form
// First we remove all HTML-tags and PHP-tags, then we create a md5-hash
// This step will make sure the script is not vurnable to sql injections.
$u = strip_tags($_POST['username']);
$p = (strip_tags($_POST['password']));
//Now let us look for the user in the database.
$query = sprintf("SELECT acct FROM accounts WHERE login = '%s' AND password = '%s' LIMIT 1;",
mysql_real_escape_string($u), mysql_real_escape_string($p));
$result = mysql_query($query);
// If the database returns a 0 as result we know the login information is incorrect.
// If the database returns a 1 as result we know the login was correct and we proceed.
// If the database returns a result > 1 there are multple users
// with the same username and password, so the login will fail.
if (mysql_num_rows($result) != 1)
{
// invalid login information
echo "Wrong username or password!";
//show the loginform again.
include "loginform.php";
} else {
// Login was successfull
$row = mysql_fetch_array($result);
// Save the user ID for use later
$_SESSION['loginid'] = $row['loginid'];
// Save the username for use later
$_SESSION['username'] = $u;
// Now we show the userbox
show_userbox();
}
} else {
// User is not logged in and has not pressed the login button
// so we show him the loginform
include "loginform.php";
}
} else {
// The user is already loggedin, so we show the userbox.
show_userbox();
}
?>
Gewijzigd op 12/12/2010 16:42:10 door Chris Broekz
Dus je moet line 5 weghalen.
voor de rest moet je je niet vergrijpen aan functies die deprecated zijn!!
-> http://nl.php.net/session_is_registered
En zoek a.u.b. eerst eens op die foutmelding, want op elk respecterend PHP Forum kan je daarover wel iets terug vinden.
en inderdaad die regel 5 die nekt je ook nog
Gewijzigd op 12/12/2010 16:46:33 door Noppes Homeland
Justin Streuper op 12/12/2010 16:43:33:
Er mag geen output zijn voor je een header uitvoert.
Dus je moet line 5 weghalen.
Dus je moet line 5 weghalen.
Regel 5 wordt niet gebruikt als de if naar de else springt. Dus dat moet gewoon kunnen zoals het nu is.
Toevoeging op 12/12/2010 17:00:29:
Noppes Homeland op 12/12/2010 16:45:44:
voor de rest moet je je niet vergrijpen aan functies die deprecated zijn!!
-> http://nl.php.net/session_is_registered
-> http://nl.php.net/session_is_registered
Dit zeggen heeft geen nut want dit is al meerdere keren gezegd tegen TS in zijn andere topic en steeds staat het er weer.
Er zijn nog wel meer zaken waarop we kunnen wijzen:
- if (isset($_POST['cmdlogin']))
op deze manier controleer je niet of een form gepost wordt
- $u = strip_tags($_POST['username']);
maak geen overbodige variabelen aan
- strings quote je altijd op 1 en dezelfde manier, met hier en daar uiteraard een uitzondering
- $row = mysql_fetch_array($result);
_fetch_array zonder opgave van de 2de parameter is in mijn ogen een kansloze missie, gebruik in alle situaties gewoon _fetch_assoc
- de foutafhandeling bij het uitvoeren van een query ontbreekt
zonder z'n afhandeling, ook geen fatsoenlijke voortgang van hetgeen er volgt
Hoe precies moet ik het nu toepassen?
Door de juiste logica toe te passen, en geen output naar de browser te versturen als de headers nog niet verstuurd zijn!
Noppes Homeland op 12/12/2010 17:34:47:
Door de juiste logica toe te passen, en geen output naar de browser te versturen als de headers nog niet verstuurd zijn!
Toevoeging op 12/12/2010 17:48:14:
dit werkt.
Code (php)
Dit mag wel:
Code (php)
[ps]Ik heb geen ervaring met het schrijven van headers, dit kan dus niet kloppen.[/ps]
----EDIT----
Even een kleine uitleg. Elke pagina verstuurd headers naar de browser. Als dit gebeurd is wordt de pagina getoond. Als je headers dus aangeeft voordat er wat code is (dus voor je doctype) dan werkt het.
Je moet het zeg maar zien als een trein. Elke passagier is een header. Deze stapt in de trein en wordt naar de browser verstuurd. Nu probeer jij nog een passagier in de trein te stoppen terwijl de trein al weg is. Dit gaat dus niet.
Gewijzigd op 12/12/2010 17:51:11 door Wouter J
Hij redirect me nooit.
Wouter J op 12/12/2010 17:48:23:
Dit mag niet:
Dit mag wel:
[ps]Ik heb geen ervaring met het schrijven van headers, dit kan dus niet kloppen.[/ps]
----EDIT----
Even een kleine uitleg. Elke pagina verstuurd headers naar de browser. Als dit gebeurd is wordt de pagina getoond. Als je headers dus aangeeft voordat er wat code is (dus voor je doctype) dan werkt het.
Je moet het zeg maar zien als een trein. Elke passagier is een header. Deze stapt in de trein en wordt naar de browser verstuurd. Nu probeer jij nog een passagier in de trein te stoppen terwijl de trein al weg is. Dit gaat dus niet.
Code (php)
Dit mag wel:
Code (php)
[ps]Ik heb geen ervaring met het schrijven van headers, dit kan dus niet kloppen.[/ps]
----EDIT----
Even een kleine uitleg. Elke pagina verstuurd headers naar de browser. Als dit gebeurd is wordt de pagina getoond. Als je headers dus aangeeft voordat er wat code is (dus voor je doctype) dan werkt het.
Je moet het zeg maar zien als een trein. Elke passagier is een header. Deze stapt in de trein en wordt naar de browser verstuurd. Nu probeer jij nog een passagier in de trein te stoppen terwijl de trein al weg is. Dit gaat dus niet.
flut controle
en ik gaat er geen uitleg over geven, want een ieder die een beetje kan nadenken zal tot dezelfde conclusie moeten kunnen komen.
Maar ik wil alleen nog weten hoe ik het moet oplossen.
Ik wil gewoon een script die ik kan includen die mensen redirect OF een tekst/uitleg geeft als ze niet zijn ingelogged. En als ze wel zijn ingelogged gewoon de pagina kunnen bekijken.
Gewijzigd op 12/12/2010 18:16:00 door Chris Broekz
Php logica moet bovenaan staan in je .php file.
html naar de gebruiker sturen moet onderaan staan.
Als je ergens een header ziet staan onder een echo, ben je fout bezig.
Zorg dan dat die header boven de echo komt.
Uiteraard geldt dit ook voor all plaatsen waar je buiten je php gaat ?> <div>bla bla <?php
Dit geldt ook voor files die je include. Het volstaat dat er 1 spatie buiten php staat om de boel naar de vaantjes te helpen.
En zet na header() een exit() neer.