Inloggning med mysql och sessioner

PHPportalen Forum Index » Tips och Trix
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2, 3 ... 121, 122, 123  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Malte
in memoriam 1



Medlem i: 6368 dagar
Från: Tingsryd
Status: Offline



#21633
Inlägg Skrivet: 2003-02-03 23:37      Ämne: Inloggning med mysql och sessioner Citera

Jag ber er att i denna tråd endast ta upp frågaställningar som rör själva inloggningen.
Inga frågor som handlar om tillägg av olika slag kommer att besvaras i denna tråd.



Ganska ofta ställs frågor i forumen med inloggning med mysql/sessioner. Och jag tycker det skulle behövas något att visa på som exempel.

Jag lägger därför här upp en grundläggande inloggning, eftersom den är lite för stor för att hamna i FAQ.

Tar även med lite kod för att kunna registrera sig som medlem.

Koden tar långt ifrån upp allt som kan tänkas testas vid inloggning eller registrering, men den är som sagt något grundläggande för att kunna bygga vidare på.

Ni får gärna kommentera om ni hittar något felaktigt i koden, eller något ytterligare som absolut måste vara med.

Glöm inte att läsa kommentarerna nedanför koden i detta inlägg.


Tabellstrukturen
KOD:
1:
#
2:
# Struktur för tabell `members`
3:
#
4:
 
5:
CREATE TABLE members (
6:
  id int(11) NOT NULL auto_increment,
7:
  user varchar(30) NOT NULL default '',
8:
  pass varchar(32) NOT NULL default '',
9:
  name varchar(50) NOT NULL default '',
10:
  email varchar(50) NOT NULL default '',
11:
  PRIMARY KEY  (id)
12:
) TYPE=MyISAM;


conn.php (databasuppkopplingen)
PHP:
1:
<?php
2:
 
3:
// Byt ut mot dina inloggningsuppgifter och databas
4:
$mysql_server "localhost";
5:
$mysql_user "user";
6:
$mysql_password "malte";
7:
$mysql_database "members_area";
8:
 
9:
$conn mysql_connect($mysql_server$mysql_user$mysql_password);
10:
mysql_select_db($mysql_database$conn);
11:
 
12:
 
13:
// En funktion att användas när magic_quotes_gpc inte är satt. För att förhindra SQL-injections, eller i lidrigare fall MySQl-fel.
14:
function db_escape ($post)
15:
{
16:
   if (is_string($post)) {
17:
     if (get_magic_quotes_gpc()) {
18:
        $post stripslashes($post);
19:
     }
20:
     return mysql_real_escape_string($post);
21:
   }
22:
   
23:
   foreach ($post as $key => $val) {
24:
      $post[$key] = db_escape($val);
25:
   }
26:
   
27:
   return $post;
28:
}
29:
 
30:
 
31:
/* 
32:
   Se till att det inte finns några dolda tecken, typ radbyte 
33:
   eller mellanslag, efter den avslutande PHP-taggen !!!
34:
*/ 
35:
?>


index.php
PHP:
1:
<?php
2:
session_start(); // Alltid överst på sidan
3:
 
4:
include "conn.php"// Databasanslutningen
5:
 
6:
// Inloggning
7:
if (isset($_POST['submit'])){
8:
 
9:
  $_POST db_escape($_POST);
10:
  
11:
  $sql "SELECT id FROM members 
12:
         WHERE user='{$_POST['user']}
13:
         AND pass='{$_POST['passwd']}'";
14:
  $result mysql_query($sql);
15:
  
16:
  // Hittades inte användarnamn och lösenord
17:
  // skicka till formulär med felmeddelande
18:
  if (mysql_num_rows($result) == 0){
19:
    header("Location: index.php?badlogin=");
20:
    exit;
21:
  }
22:
  
23:
  // Sätt sessionen med unikt index
24:
  $_SESSION['sess_id'] = mysql_result($result0'id');
25:
  $_SESSION['sess_user'] = $_POST['user'];
26:
  header("Location: welcome.php");
27:
  exit; 
28:
}
29:
 
30:
// Utloggning
31:
if (isset($_GET['logout'])){
32:
  session_unset();
33:
  session_destroy();
34:
  header("Location: index.php");
35:
  exit;
36:
}
37:
?>
38:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
39:
<html>
40:
<head>
41:
<meta http-equiv="Content-Type" 
42:
  content="text/html; charset=iso-8859-1">
43:
<title>Index</title>
44:
</head>
45:
<body>
46:
<?php
47:
 
48:
// Om inte inloggad visa formulär, annars logga ut-länk 
49:
if (!isset($_SESSION['sess_user'])){
50:
 
51:
  echo "<h3>Logga in</h3>\n";
52:
  
53:
  // Visa felmeddelande vid felaktig inloggning
54:
  if (isset($_GET['badlogin'])){
55:
    echo "Fel användarnamn eller lösenord!<br>\n";
56:
    echo "Försök igen!\n";
57:
  }
58:
  
59:
?>
60:
<form action="index.php" method="post">
61:
Användarnamn:<br>
62:
<input type="text" name="user"><br>
63:
Lösenord:<br>
64:
<input type="password" name="passwd"><br>
65:
<input type="submit" name="submit" value="Logga in">
66:
</form>
67:
Inte medlem ?<br>
68:
<a href="register.php">Registera dig</a>
69:
<?php
70:
 
71:
} else {
72:
 
73:
  echo "<a href=\"index.php?logout=\">Logga ut</a>\n";
74:
 
75:
}
76:
 
77:
?>
78:
</body>
79:
</html>


register.php (för att registrera sig)
PHP:
1:
<?php
2:
session_start(); // Alltid överst på sidan
3:
 
4:
include "conn.php"// Databasanslutningen
5:
 
6:
if (isset($_POST['submit'])){
7:
 
8:
  $_POST db_escape($_POST);
9:
 
10:
  // Tag bort eventuella blanksteg i början eller slutet
11:
  foreach($_POST as $key => $val){
12:
    $_POST[$key] = trim($val);
13:
  }
14:
 
15:
  //Kolla efter tomma fält
16:
  if (empty($_POST['user']) || empty($_POST['passwd']) || 
17:
      empty($_POST['name']) || empty($_POST['email'])) {
18:
    $reg_error[] = 0;
19:
  }
20:
  
21:
  // Kolla om användarnamnet är upptaget
22:
  $sql "SELECT COUNT(*) FROM members WHERE user='{$_POST['user']}'";
23:
  $result mysql_query($sql);
24:
  if (mysql_result($result0) > 0) {
25:
    $reg_error[] = 1;
26:
  }
27:
  
28:
  // Kolla om e-post kan tänkas vara ok
29:
  if (!preg_match('/^[-A-Za-z0-9_.]+[@][A-Za-z0-9_-]+([.][A-Za-z0-9_-]+)*[.][A-Za-z]{2,6}$/'$_POST['email'])) {
30:
    $reg_error[] = 2;    
31:
  }
32:
 
33:
  // Kolla så att lösenorden stämmer överrens
34:
  if ($_POST['passwd'] != $_POST['passwd2']) {
35:
    $reg_error[] = 3;
36:
  }
37:
  
38:
  // Inga fel? Spara och logga in samt skicka till välkomstsida
39:
  if (!isset($reg_error)) {
40:
    $sql "INSERT INTO members(user, pass, name, email)
41:
            VALUES('{$_POST['user']}', '{$_POST['passwd']}', '{$_POST['name']}', '{$_POST['email']}')";
42:
    mysql_query($sql);
43:
    
44:
    $_SESSION['sess_id'] = mysql_insert_id();
45:
    $_SESSION['sess_user'] = $_POST['user'];
46:
    header("Location: welcome.php");
47:
    exit;     
48:
  
49:
  }
50:
 
51:
} else {
52:
 
53:
  // Sätt variabler för tomt formulär
54:
  for ($i=0$i<4$i++) {
55:
    $back[$i] = "";
56:
  }
57:
 
58:
}
59:
 
60:
$error_list[0] = "Alla fält är inte infyllda";
61:
$error_list[1] = "Användarnamnet är upptaget";
62:
$error_list[2] = "Felaktig e-postadress";
63:
$error_list[3] = "Lösenorden stämmer inte överrens";
64:
 
65:
?>
66:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
67:
<html>
68:
<head>
69:
<meta http-equiv="Content-Type" 
70:
  content="text/html; charset=iso-8859-1">
71:
<title>Registrera dig</title>
72:
</head>
73:
<body>
74:
<h3>Registrera dig</h3>
75:
<?php
76:
if (isset($reg_error)){
77:
 
78:
  echo "Något blev fel:<br>\n";
79:
  echo "<ul>\n";
80:
  for ($i=0$i<sizeof($reg_error); $i++) {
81:
    echo "<li>{$error_list[$reg_error[$i]]}</li>\n";
82:
  }
83:
  echo "</ul>\n";
84:
  
85:
  $back[0] = stripslashes($_POST['user']);
86:
  $back[2] = stripslashes($_POST['name']);
87:
  $back[3] = stripslashes($_POST['email']);
88:
 
89:
}
90:
?>
91:
<form action="register.php" method="post">
92:
<table cellspacing="3">
93:
 
94:
<tr>
95:
<td>Användarnamn:</td>
96:
<td><input type="text" name="user" value="<?php echo $back[0]; ?>"></td>
97:
</tr>
98:
 
99:
<tr>
100:
<td>Lösenord:</td>
101:
<td><input type="password" name="passwd" value=""></td>
102:
</tr>
103:
 
104:
<tr>
105:
<td>Repetera lösenord:</td>
106:
<td><input type="password" name="passwd2" value=""></td>
107:
</tr>
108:
 
109:
<tr>
110:
<td>Ditt namn:</td>
111:
<td><input type="text" name="name" value="<?php echo $back[2]; ?>"></td>
112:
</tr>
113:
 
114:
<tr>
115:
<td>E-postadress</td>
116:
<td><input type="text" name="email" value="<?php echo $back[3]; ?>"></td>
117:
</tr>
118:
 
119:
<tr>
120:
<td colspan="2" align="center">
121:
  <input type="submit" name="submit" value="Spara dina uppgifter">
122:
</td>
123:
</tr>
124:
 
125:
</table>
126:
</form>
127:
 
128:
</body>
129:
</html>


welcome.php (sida man kommer till efter inloggning)
PHP:
1:
<?php
2:
session_start(); // Alltid överst på sidan
3:
 
4:
// Kolla om inloggad = sessionen satt
5:
if (!isset($_SESSION['sess_user'])){
6:
  header("Location: index.php");
7:
  exit;
8:
}
9:
 
10:
?>
11:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
12:
<html>
13:
<head>
14:
<meta http-equiv="Content-Type" 
15:
  content="text/html; charset=iso-8859-1">
16:
<title>V&auml;lkommen</title>
17:
</head>
18:
<body>
19:
 
20:
V&auml;lkommen <?php echo $_SESSION['sess_user']; ?><br>
21:
<a href="index.php?logout=">Logga ut</a>
22:
 
23:
</body>
24:
</html>


Några saker som kan bli fel med sessioner.


Kolla i din php.ini efter session.save_path. Katalogen där ska peka på en katalog som existerar (och har skrivrättigheter) på din hårddisk.
I Windows skriver man sökvägen med backslash, t.ex c:\PHP\sessiondata
Får du följande felmeddelande så har du fel inställning i php.ini:
Citat:
Warning: session_start(): open(/tmp\sess_6e0caa5576e9ea04e423d2bb353466c4, O_RDWR) failed: No such file or directory (2) in ...



Session_start() är en header, liksom header() eller setcookie().
Före en header får man inte ha någon som helst output till webbläsare. Med output menas HTML-kod, echo eller print. Även dolda tecken typ radbyte och mellanslag före eller efter PHP-taggarna genererar en output till webbläsaren.
Detta gör att man särskilt får se upp i filerna man inkluderar (t.ex conn.php i exemplet) och se till att där inte finns något efter den avslutande PHP-taggen. Är man osäker så sätter man markören vid den avslutande PHP-taggen och trycker upprepade gånger på delete tills man är säker på att där är tomt.


Något som är väldigt viktigt om man har register_globals=On i sin php.ini, är att att använda ett unikt index för sina sessionsvariabler. Alltså man får inte ha några andra variabler som samma index eller variabelnamn som ett index för en sessionsvariabel. Ett sätt att säkra detta är att t.ex. göra som jag har gjort i exemplet; sätta 'sess_' före indexnamnet, typ $_SESSION['sess_variabelnamn'].
Om man inte gör detta kan sessionsvariabeln "krocka" med andra variabler och skumma saker hända. I det snällare fallet så går det inte att logga ut, i styggare fall kan sessionsvariabeln byta värde.

Undvik helst även att "översätta" sessionsvariabel från arrayformat, typ:
KOD:
1:
$sess_variabelnamn = $_SESSION['sess_variabelnamn'];
Då kan de "snällare" sakerna hända som beskrevs i stycket ovan. Utan använd sessionsvariabel direkt i sitt arrayformat $_SESSION['sess_variabelnamn'].


På en del webbservrar går det inte att sätta en cookie (sessionscookien) i samma skript som man använder header("Location"). Prova då att ändra:
PHP:
 header("Location: welcome.php"); 

till
PHP:
 header("Refresh: 0;URL=welcome.php"); 

eller
PHP:
 echo "<script type='text/javascript'>
   document.location.href = 'welcome.php';
</script>"


Ibland kan man även behöva spika fast sin sessionsvariabel innan man gör en redirect (speciellt när man använder frameset), då får du före din header/redirect lägga
PHP:
 session_write_close(); 



Det kan hända att du har din sida i ett frameset på en domän (t.ex tk-domän) och har sedan din sida i en frame med en annan domän.
Då kommer säkerhetsinställningarna (default) i IE6 att vägra sätta sessionscookien.
Du kan då testa med att lägga följande överst på alla sidor med session_start():
PHP:
 header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"'); 



Ett skript för felsökning av sessioner på servern. Den är inte 100%-ig, men säger ofta en hel del.


Är inte magic_quotes_gpc satt på servern så måste alla värden du stoppar in i en SQL-fråga "escapas", detta för att förhindra SQL-injections eller liknande.
Därför har jag lagt till en funktion i conn.php som kan användas för detta.


En lite utförligare beskrivning av vad de olika koddelarna gör kan hittas här.

Senast ändrad av Malte den 2007-05-09 06:45, ändrad totalt 18 gånger
 

_________________
Funktion är vackert
Till toppen på sidan
Visa användarprofil Besök användarens hemsida
Nemesis



Medlem i: 6142 dagar
Från: Karlstad
Status: Offline



#21640
Inlägg Skrivet: 2003-02-04 00:07      Ämne: Citera

Hm, såg bra ut. Skall titta lite på det där.

// Nemesis
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida MSN Messenger ICQ-nummer
Zephyr



Medlem i: 6070 dagar
Från: Finland
Status: Offline



#21755
Inlägg Skrivet: 2003-02-04 19:04      Ämne: hmm Citera

mysql_close ?

är inte säker men borde det inte finnas med?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Malte
in memoriam 1



Medlem i: 6368 dagar
Från: Tingsryd
Status: Offline



#21777
Inlägg Skrivet: 2003-02-04 21:41      Ämne: Citera

Hej Zephyr, och välkommen till PHPportalen Very Happy

Det är inte nödvändigt att stänga mysqlkopplingen eftersom den kopplas ned automatriskt vid skriptets slut, om man öppnat med mysql_connect(). Hade man däremot använt mysql_pconnect hade man varit tvungen att avsluta kopplingen med mysql_close().

Eller som det står i manualen:
Citat:
Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.

Källa: http://www.php.net/manual/en/function.mysql-close.php
 

_________________
Funktion är vackert
Till toppen på sidan
Visa användarprofil Besök användarens hemsida
gran



Medlem i: 6034 dagar
Från: skogen?
Status: Offline



#23391
Inlägg Skrivet: 2003-02-15 17:15      Ämne: Citera

för att höja säkerheten skulle du kunna köra md5() på lösenord och användarnamn
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Woppe



Medlem i: 6040 dagar
Från: Arvika
Status: Offline



#23478
Inlägg Skrivet: 2003-02-16 09:51      Ämne: Citera

Det fungerar nästan helt för mig.
Kolla på http://medlem.spray.se/promodders/anv/index.php
för att se vad som händer...
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger ICQ-nummer
Malte
in memoriam 1



Medlem i: 6368 dagar
Från: Tingsryd
Status: Offline



#23480
Inlägg Skrivet: 2003-02-16 10:14      Ämne: Citera

Woppe skrev:
Det fungerar nästan helt för mig.
Kolla på http://medlem.spray.se/promodders/anv/index.php
för att se vad som händer...

Det jag kan se är vid registreringen.
Uppgifterna läggs till i databasen.
Sessionsvariablerna sätts.
Men headern skickar aldrig vidare.
Detta tror jag beror på att du har någon form av output till webbläsaren före denna header:
KOD:
1:
  // Inga fel? Spara och logga in samt skicka till välkomstsida
2:
  if (!isset($reg_error)) {
3:
    $sql = "INSERT INTO members(user, pass, name, email)
4:
            VALUES('{$_POST['user']}', '{$_POST['passwd']}', '{$_POST['name']}', '{$_POST['email']}')";
5:
    mysql_query($sql);
6:
   
7:
    $_SESSION['sess_id'] = mysql_insert_id();
8:
    $_SESSION['sess_user'] = $_POST['user'];
9:
 
10:
// Någonstans före denna rad finns en output.
11:
    header("Location: welcome.php");
12:
    exit;     
13:
 
14:
  }
15:
 
16:
}

Min gissning grundar sig på att när jag tittar på HTML-koden när det stannar så står det:
Citat:
<font face="Verdana, Arial, Helvetica, sans-serif" size="1">

Du ska inte ha någon HTML-kod eller någon echo/print före '<!DOCTYPE'.
 

_________________
Funktion är vackert
Till toppen på sidan
Visa användarprofil Besök användarens hemsida
Woppe



Medlem i: 6040 dagar
Från: Arvika
Status: Offline



#23483
Inlägg Skrivet: 2003-02-16 10:21      Ämne: Citera

Jag har tagit bort alla <font> taggar i filerna, men det fungerar fortfarande inte :/
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger ICQ-nummer
speedis



Medlem i: 6040 dagar

Status: Offline



#24269
Inlägg Skrivet: 2003-02-19 11:27      Ämne: Citera

och även detta:

Note: mysql_close() will not close persistent links created by mysql_pconnect().

man använder väl bara mysql_close() om man vill stänga något i mitten av scripten..
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
speedis



Medlem i: 6040 dagar

Status: Offline



#24278
Inlägg Skrivet: 2003-02-19 11:53      Ämne: Citera

om man vill skapa en katalog för användaren samtidigt, hur blir det då?

mkdir($back[0],0755);

funkade inte så bra..
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Malte
in memoriam 1



Medlem i: 6368 dagar
Från: Tingsryd
Status: Offline



#24451
Inlägg Skrivet: 2003-02-19 23:44      Ämne: Citera

speedis skrev:
om man vill skapa en katalog för användaren samtidigt, hur blir det då?

mkdir($back[0],0755);

funkade inte så bra..

Nej, då $back-arrayen först skapas då ett fel registreras. Det är $_POST['user'] du ska använda.

Men du får nog ändra ditt chmod till 0777. För annars går det inte att skriva något till katalogen (skapa/spara filer).

Men en varning här. Katalogen som du skapar den nya katalogen i, måste också ha skrivrättigheter, och det är inte särskilt lämpligt att sätta skrivrättigheter i en katalog du kör php-filer i.

Senast ändrad av Malte den 2004-02-13 22:48, ändrad totalt 1 gång
 

_________________
Funktion är vackert
Till toppen på sidan
Visa användarprofil Besök användarens hemsida
speedis



Medlem i: 6040 dagar

Status: Offline



#24472
Inlägg Skrivet: 2003-02-20 08:15      Ämne: Citera

tack, funkade perfekt Smile
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
wezzy



Medlem i: 6015 dagar
Från: Pixbo
Status: Offline



#26329
Inlägg Skrivet: 2003-03-06 11:12      Ämne: Citera

Usch, inget fungerar...

jag försöker ditt (malte) inloggningsscript att fungera, men jag får bara upp det här när jag försöker logga in:

Citat:
Warning: Supplied argument is not a valid MySQL result resource in C:\clients\Micropter\wwwroot\web2\tlogin.php on line 16

Warning: Cannot add header information - headers already sent by (output started at C:\clients\Micropter\wwwroot\web2\tlogin.php:16) in C:\clients\Micropter\wwwroot\web2\tlogin.php on line 17


På rad 16-19 står det:

KOD:
1:
 
2:
  if (mysql_num_rows($result) == 0){
3:
    header("Location: tlogin.php?badlogin=");
4:
    exit;
5:
  }
6:
 


och ja, min inloggningssida heter just nu tlogin.php (står för test login) och det är maltes index.php med ytterst små ändringar. (Jag ville bara få det att fungera)

/Jacob
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande AIM-adress Yahoo Messenger MSN Messenger ICQ-nummer
Malte
in memoriam 1



Medlem i: 6368 dagar
Från: Tingsryd
Status: Offline



#26331
Inlägg Skrivet: 2003-03-06 11:23      Ämne: Citera

Det felmeddelandet beror på antingen fel i mysql-uppkopplingen eller i sql-frågan, vanligtvis det senare.

Testa att sätta in lite felsökning. Vad får du för meddelande om du ändrar till det här:
KOD:
1:
  $sql = "SELECT id FROM members
2:
         WHERE user='{$_POST['user']}'
3:
         AND pass='{$_POST['passwd']}'";
4:
  $result = mysql_query($sql) or die("SQL: $sql <br>".mysql_error());
5:
 
6:
  // Hittades inte användarnamn och lösenord
7:
  // skicka till formulär med felmeddelande
8:
  if (mysql_num_rows($result) == 0){
9:
    header("Location: index.php?badlogin=");
10:
    exit;
11:
  }

Vilken PHP-version kör du?
 

_________________
Funktion är vackert
Till toppen på sidan
Visa användarprofil Besök användarens hemsida
wezzy



Medlem i: 6015 dagar
Från: Pixbo
Status: Offline



#26335
Inlägg Skrivet: 2003-03-06 12:03      Ämne: php ver. Citera

Det är PHP ver 4.1.2 på webbhotellet jag kör på.

För övrigt så hittade jag felet, tack.

Nu så skickar den däremot inte vidare till välkommensidan när man loggar in. Däremot så skickar den vidare om man skriver in fel lösenord, så det fungerar.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande AIM-adress Yahoo Messenger MSN Messenger ICQ-nummer
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2, 3 ... 121, 122, 123  Nästa
PHPportalen Forum Index » Tips och Trix
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic