Jag försöker göra ett loginsystem med hjälp av en MySQL databas och sessions.
Delar av koden är modifierad från sgtpeppers psphplogin, så han kanske är rätt person att svara på detta?
Här är min loginsida, login.php:
<?
$database = @mysql_connect("XXXXX","XXXXX","XXXXXX");
if (!$database) {
echo("An error occured. Please contact the administrator.");
exit();
}
if (!@mysql_select_db("XXXXX")) {
echo("An error occured. Please contact the administrator.");
exit();
}
if (isset($loginuser) && isset($loginpass)) {
$query = "SELECT id, name FROM user WHERE name='$loginuser' AND pass=PASSWORD('$loginpass')";
$res = mysql_query($query);
$row = mysql_fetch_array($res);
if (isset($row['id'])) {
session_start();
$uid = $row['id'];
$uname = $row['name'];
session_register("uid","uname");
Header("Location: xxxxx.php");
}
}
?>
<html>
<head>
<title>Users and Administrators Login</title>
</head>
<body>
<form action="login.php" method="post">
Username:<br>
<input type="text" size="20" name="loginuser"><p>
Password:<br>
<input type="password" size="20" name="loginpass"><p>
<input type="submit" value=" Login ">
</form>
</body>
</html>
Här är databasen XXXXX med tabellen users struktur och data:
#
# Table structure for table 'user'
#
CREATE TABLE user (
id int(11) NOT NULL auto_increment,
name varchar(50) NOT NULL,
pass varchar(50) NOT NULL,
PRIMARY KEY (id),
UNIQUE id_2 (id),
KEY id (id)
);
#
# Dumping data for table 'user'
#
INSERT INTO user VALUES ( '1', 'joel', 'xxxx');
INSERT INTO user VALUES ( '2', 'per', 'xxxxx');
Detta är XXXXX.php, som man kommer till när man loggats in:
Felet:
När användarens namn är kollat i databasen är det alltså meningen att han skall skickas vidare till xxxxx.php (om rätt anv. & lösen skrivs in), men så blir inte fallet, för när jag testar så skickas jag alltid tillbaka till login.php, även om jag skriver in rätt?
Är det något fel i koden? Är det något jag har glömt? Är det totalt fel? :(
Någon som orkar avsätta några minuter för att analysera mitt problem?
------------------
Mina knäskålar klapprar fortfarande efter Kent-Mustafas trummsolo!
if (isset($row['id'])) {
session_start();
// den här har bytt plats
session_register("uid","uname");
$uid = $row['id'];
$uname = $row['name'];
Header("Location: xxxxx.php");
}
För övrigt bör du köra en bättre koll på sidan där du är inloggad. Det räcker med att jag en get-request med de variablerna satta till TRUE så är jag inloggad.
När man rådfrågar PHP-manualen så sägs det ingenting om att man måste registrera variabeln innan man sätter den och det funkar utmärkt att göra det tvärtom på mitt system så det kan ju vara något annat problem.
För övrigt bör du köra en bättre koll på sidan där du är inloggad. Det räcker med att jag en get-request med de variablerna satta till TRUE så är jag inloggad.
Ahh.. Pinsamt :) Jag får skylla på att jag slängde ihop koden rätt snabbt...
Ändra till detta istället (kollar så att variablerna är registrerade i sessionen) så bör säkerhetsnivån höjas lite högre än den tidigare sandlådenivån på mitt script :e
/********************************************
* Check to see that the user is logged in *
********************************************/
session_start();
if (!session_is_registered("uid") || !session_is_registered("uid") || !isset($uid) || !isset($uname))
{
Header("Location: login.php");
}
------------------ skaparen av allt som är mjukt och luktar lavendel
Hur har du lagt in användarna i databasen? Lösenorden skall sparas krypterade med mySQLs PASSWORD()-funktion. Det kan vara så att du sparat dom i klartext och då överenstämmer dom inte.
Felet kan även uppstå om du har cookies avslagna i din webbläsare.
------------------ skaparen av allt som är mjukt och luktar lavendel
Jag krypterade lösenordet, men något går snett iaf.......
När jag loggar in, och skriver mitt användarnamn och lösenord, så kommer jag tillbaka till login.php iaf.......fast den enda skillnaden är att jag nu också får 2 warnings!
Warning: open(/tmp/sessions/sess_4ad9b169f54c5c62b91fcef4426b73b4, O_RDWR) failed: m (2) in /minsida/login.php on line 17
Warning: Cannot add header information - headers already sent by (output started at /minsida/login.php:17) in /minsida/login.php on line 21
och om jag sedan knappar in XXXXX.php så får jag dessa fel:
Warning: open(/tmp/sessions/sess_4ad9b169f54c5c62b91fcef4426b73b4, O_RDWR) failed: m (2) in /minsida/xxxxx.php on line 2
Warning: Cannot add header information - headers already sent by (output started at /minsida/xxxxx.php:2) in /minsida/xxxxx.php on line 4
Samma fel på både login.php & xxxxx.php alltså......humm....
Finns det någon som känner för att provköra systemet?
Humm, jag testkörde psphplogin, utan att göra några andra förändringar i config'en (förutom de nödvändiga).......det fungerar ej.....
Först så registerar man sig, det går hur bra som hellst, ända tills man ombeds att logga in för första gången, då skiter det sig, för man kommer tillbaka till login.php igen.....och igen......och igen.......
------------------
Mina knäskålar klapprar fortfarande efter Kent-Mustafas trummsolo!
Lägg koden precis ovanför <form action="login.php" method="post"> i login.php. Om du efter ändringen får ett rött felmeddelande när du försöker logga in som säger "Felaktigt lösen osv." så är det något fel med användarnamn- och lösenordsmatchningen mot databasen. Om du inte får något sånt meddelande så betyder det att inloggningen funkat och att du skickats iväg till den låsta sidan, men att något skitit sig där och att du kastats tillbaka till login.php.
------------------ skaparen av allt som är mjukt och luktar lavendel
Först började jag med att ta bort krypteringen, sedan tog jag bort sessionerna.....då fungerade det.....
När jag använder kryperingen blir inte lösenordet rätt, (ja, lösenorden är krypterade i databasen också), och sessionerna skapar en massa varningssignaler........
------------------
Mina knäskålar klapprar fortfarande efter Kent-Mustafas trummsolo!
och sessionerna skapar en massa varningssignaler.......
Kontrollera php.ini så din session.save_path är korrekt. Med tanke på ovanstående felmeddelanden är den inte det. Kör du i windows bör det vara nåt liknande: c:/php/tmp
Att du fick "Cannot add header information" beror kanske på att PHP redan skrivit ut saker (felmeddelande session) och kan därför inte fortsätta med header().