Probleem met inlogscript op basis van sessies
Het blijft een witte pagina. Bij error reporting geen errors.
Hier het script
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
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
<?php
session_start();
if($_POST["name"] != "" && $_POST["password"] != "")
{
include('config.php');
$name = mysql_real_escape_string($_POST['name']);
$pass = mysql_real_escape_string($_POST['password']);
$mysql = mysql_query("SELECT * FROM users WHERE name = '{$name}' AND password = '{$pass}'");
if(mysql_num_rows($mysql) < 1)
{
$row = mysql_fetch_array($mysql) or die(mysql_error());
$username = $row["user"];
$wachtwoord = $row["password"];
$id = $row["id"];
session_register("username");
session_register("wachtwoord");
session_register("id");
$_SESSION["username"] = $username;
$_SESSION["wachtwoord"] = $wachtwoord;
$_SESSION["id"] = $id;
` header('Location: index.php');
exit;
}
}
else
{
echo "<script> alert('Geen geldige gebruikersnaam/wachtwoord');
history.go(-1);
</script>";
}
?>
session_start();
if($_POST["name"] != "" && $_POST["password"] != "")
{
include('config.php');
$name = mysql_real_escape_string($_POST['name']);
$pass = mysql_real_escape_string($_POST['password']);
$mysql = mysql_query("SELECT * FROM users WHERE name = '{$name}' AND password = '{$pass}'");
if(mysql_num_rows($mysql) < 1)
{
$row = mysql_fetch_array($mysql) or die(mysql_error());
$username = $row["user"];
$wachtwoord = $row["password"];
$id = $row["id"];
session_register("username");
session_register("wachtwoord");
session_register("id");
$_SESSION["username"] = $username;
$_SESSION["wachtwoord"] = $wachtwoord;
$_SESSION["id"] = $id;
` header('Location: index.php');
exit;
}
}
else
{
echo "<script> alert('Geen geldige gebruikersnaam/wachtwoord');
history.go(-1);
</script>";
}
?>
Topic titel aangepast, kies in het vervolg zelf een duidelijkere titel[/modedit]
Gewijzigd op 17/02/2013 22:17:01 door Joren de Wit
Klik eens op session_register --> "This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0"
Verder zie ik hier nergens hoe/waar je bij een header zou kunnen komen.
mysql_real_escape_string gebruik je _in_ een query.
Geadviseerd wordt om variabelen buiten quotes te houden.
Je slaat het wachtwoord niet beveiligd op?!
Benoem het veld/de velden die je wilt opvragen ipv * te gebruiken.
mysql_fetch_array is hier niet nodig, mysql_fetch_assoc volstaat (je maakt immers geen gebruik van de array mogelijkheden).
Bij minder dan 1 resultaat, moet de if doorlopen worden? Verwacht dat bij exact 1 resultaat dit zou moeten gebeuren.
Or die is geen foutafhandeling.
Wat is het nut van regel 14, 15 en 16?
Waarom een exit opo regel 24?
Script consequent: de {} bij de else laat je op een andere plek inspringen dan bij de if.
Dan moet ik eens gaan kijken hoe ik die session oplos.
Ik had inmiddels de header geplaatst.
Bedankt voor uw reactie
Obelix en Idefix op 17/02/2013 22:02:47:
mysql_real_escape_string gebruik je _in_ een query.
De manier waarop de escape functie hier gebruikt wordt is niet fout, het is prima om 'veilige' variabelen aan te maken.
Wat betreft alle andere punten: daar ben ik het volledig mee eens. Neem ook eens een kijkje in deze PHP beginnershandleiding.
Maar wat kan ik als vervanger voor session_start gebruiken. Weet u dat misschien
De functie session_start() moet je altijd wel gebruiken. Het gaat om session_register() die je niet meer gebruiken moet. Zie onder andere de handleiding die ik gaf, daar staat een voorbeeld van het correcte gebruik in.
Toevoeging op 17/02/2013 22:32:21:
Kan iemand mij misschien wat meer uitleggen erover. Ik probeer meerdere stappen maar het blijft een witte pagina.
Kortom ik als newbie kom er gewoon niet uit :S
Ga debuggen:
echo $mysql eens naar het scherm. Klopt dat met wat je zou verwachten?
Wat is de uitkomst van mysql_num_rows?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest van je script
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest van je script
?>
Obelix en Idefix op 17/02/2013 22:02:47:
Bij minder dan 1 resultaat, moet de if doorlopen worden? Verwacht dat bij exact 1 resultaat dit zou moeten gebeuren.
Wat heb je al met deze tip gedaan? Want je gaat nu iemand inloggen als die niet gevonden is in de database. Dat kan natuurlijk nooit goed gaan...
Obelix en Idefix op 17/02/2013 22:02:47:
... 1 resultaat, moet de if doorlopen worden...
Wanneer je 1 record wil ophalen (bv. dit is typisch voor een login), wil je weten of mysql_query() succesvol een record heeft opgehaald, met if.
nl zo:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$res = mysql_query("SELECT * FROM users WHERE name='$name' AND password='$pass'");
if ($row=mysql_fetch_assoc($res)) { // geen mysql_num_rows nodig
// $row is hier het eerste (en enige) record
}
else {
// eventueel hier een boodschap 'verkeerde login' of zo
}
?>
$res = mysql_query("SELECT * FROM users WHERE name='$name' AND password='$pass'");
if ($row=mysql_fetch_assoc($res)) { // geen mysql_num_rows nodig
// $row is hier het eerste (en enige) record
}
else {
// eventueel hier een boodschap 'verkeerde login' of zo
}
?>
Als je meerdere records nodig hebt, heb je een if() nodig die meerdere malen wordt uitgevoerd. Die noemen we while()
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$res = mysql_query(...)
while ($row=mysql_fetch_assoc($res)) { // geen mysql_num_rows nodig
// $row is hier telkens een nieuw record. Tot alle records overlopen zijn, dan stopt de while()
}
?>
$res = mysql_query(...)
while ($row=mysql_fetch_assoc($res)) { // geen mysql_num_rows nodig
// $row is hier telkens een nieuw record. Tot alle records overlopen zijn, dan stopt de while()
}
?>
Alex Oosterveen op 17/02/2013 22:05:39:
Ik ben helaas een beginner.
Hackers zijn geen beginners.
Zolang je niet deftig beseft waarmee je bezig bent, is een eigen login-systeem heel erg gevaarlijk.
Ik zou het iedereen afraden om zo iets online te zetten.
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
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
<?php
session_start();
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
if($_POST["name"] != "" && $_POST["password"] != "")
{
include('config.php');
$name = mysql_real_escape_string($_POST['name']);
$pass = mysql_real_escape_string($_POST['password']);
$mysql = mysql_query("SELECT * FROM users WHERE name = '".$name."' AND password = '".$pass."'");
if(mysql_num_rows($mysql) == 1) or die(mysql_error());
{
$row = mysql_fetch_array($mysql) or die(mysql_error());
$username = $row["user"];
$wachtwoord = $row["password"];
$id = $row["id"];
$_SESSION['username'] = $username;
$_SESSION['wachtwoord'] = $wachtwoord;
$_SESSION['id'] = $id;
header('Location: index.php');
}
}
else
{
echo "<script> alert('Geen geldige gebruikersnaam/wachtwoord');
history.go(-1);
</script>";
}
?>
session_start();
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
if($_POST["name"] != "" && $_POST["password"] != "")
{
include('config.php');
$name = mysql_real_escape_string($_POST['name']);
$pass = mysql_real_escape_string($_POST['password']);
$mysql = mysql_query("SELECT * FROM users WHERE name = '".$name."' AND password = '".$pass."'");
if(mysql_num_rows($mysql) == 1) or die(mysql_error());
{
$row = mysql_fetch_array($mysql) or die(mysql_error());
$username = $row["user"];
$wachtwoord = $row["password"];
$id = $row["id"];
$_SESSION['username'] = $username;
$_SESSION['wachtwoord'] = $wachtwoord;
$_SESSION['id'] = $id;
header('Location: index.php');
}
}
else
{
echo "<script> alert('Geen geldige gebruikersnaam/wachtwoord');
history.go(-1);
</script>";
}
?>
In zo'n geval kan je het best stap voor stap in je code een echo plaatsen, zodat je kan achterhalen welk deel wel wordt uitgevoerd, en welk deel weer niet.