Ohjelmointiputkassa on jo montakin hyvää kirjautumisjärjestelmää, mutta minusta kaikki ovat liian pelkistettyjä. Tässä esimerkki, miten voi kirjautua kolmella eri tavalla: istunnon ajaksi, mukautetuksi ajaksi tai "ikuisuudeksi".
Muokkasin formin oikeanlaiseksi.
header.php - lisätään jokaisen sivun alkuun include-funktiolla
<?php session_start(); ob_start(); $yhteys = mysql_connect("localhost", "käyttäjä", "salasana"); mysql_select_db("tietokanta"); // Luodaan tarvittava tietokanta mysql_query("CREATE TABLE users(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, tunnus TEXT, salasana TEXT, email TEXT, session TEXT, logout_time INT)"); // Kirjaudutaan ulos if(isset($_GET["logout"])) { if(isset($_SESSION["pc"])) { unset($_SESSION["pc"]); session_destroy(); } else if(isset($_COOKIE["pc"])) { setcookie("pc", "", time() - 3600); } header("Location: index.php"); } // Tarkistetaan, onko käyttäjä kirjautunut if(isset($_SESSION["pc"]) || isset($_COOKIE["pc"])) { if(isset($_SESSION["pc"])) $pc = $_SESSION["pc"]; if(isset($_COOKIE["pc"])) $pc = $_COOKIE["pc"]; $hae = mysql_query("SELECT * FROM users WHERE session = '$pc'"); if(mysql_num_rows($hae) == 1) { // Asetetaan tiedot taulukkoon $user = mysql_fetch_array($hae); mysql_query("UPDATE users SET aika = '" . time() . "' WHERE id = {$user["id"]}"); } else { die("<b>Ooops!</b> ID-numerosi ei vastannut yhtään tietokannasta löytynyttä käyttäjää. Ole hyvä, ja <a href=\"?logout\">kirjaudu ulos</a> poistaaksesi viallisen istunnon tai cookien."); } } if(isset($_GET["login"])) { $tunnus = (!empty($_POST["tunnus"])) ? mysql_real_escape_string($_POST["tunnus"]) : die(header("Location: kirjaudu.php?error=1")); $salasana = (!empty($_POST["salasana"])) ? md5(mysql_real_escape_string($_POST["salasana"])) : die(header("Location: kirjaudu.php?error=2")); $pysykirjautuneenaaina = (!empty($_POST["paks"]) && $_POST["paks"] == "true") ? true : false; $istunnonpituusminuutteina = (!empty($_POST["ipm"])) ? (int)mysql_real_escape_string($_POST["ipm"]) : false; if(strlen($tunnus) >= (int)$asetukset["minimun_account_length"]) { if(strlen($salasana) >= (int)$asetukset["minimum_password_length"]) { // Tarkistetaan tunnuksen && salasanan olemassaolo $haku = mysql_query("SELECT * FROM users WHERE tunnus = '$tunnus' AND salasana = '$salasana'"); // echo "DEBUG: hakutuloksia " . mysql_num_rows($haku) . "<br>"; if(mysql_num_rows($haku) == 1) { // Arvotaan uniqid $sessionid = md5(uniqid("")); // Halutaan kirjautua vain sessionin ajaksi, eli $pysykirjautuneenaaina ja $istunnonpituusminuutteina ovat false if(!$pysykirjautuneenaaina && !$istunnonpituusminuutteina) { // Jos päivitys tietokantaan onnistui, laitetaan sessionid myös sessioon if(mysql_query("UPDATE users SET session = '$sessionid' WHERE tunnus = '$tunnus' AND salasana = '$salasana'") != false) { $_SESSION["pc"] = $sessionid; } else { // Ei löytynyt tunnusta, salasana ei täsmää header("Location: kirjaudu.php?error=3"); die; } } // Halutaan kirjautua tietyksi ajaksi else if($istunnonpituusminuutteina && !$pysykirjautuneenaaina) { // Jos päivitys tietokantaan onnistui, laitetaan sessionid myös sessioon if(mysql_query("UPDATE users SET session = '$sessionid' WHERE tunnus = '$tunnus' AND salasana = '$salasana'") != false) { // Annettu pituus * 60 on sekunteja, lisätään se time():een ja laitetaan keksiin setcookie("pc", $sessionid, (time() + (int)$istunnonpituusminuutteina * 60)); mysql_query("UPDATE users SET logout_time = '" . (time() + $istunnonpituusminuutteina * 60) . "' WHERE tunnus = '$tunnus' AND salasana = '$salasana'"); } else { // Ei löytynyt tunnusta, salasana ei täsmää header("Location: kirjaudu.php?error=3"); die; } } // Kirjaudutaan "ikuiseksi" ajaksi sisään else if(!$istunnonpituusminuutteina && $pysykirjautuneenaaina) { // Jos päivitys tietokantaan onnistui, laitetaan sessionid myös sessioon if(mysql_query("UPDATE users SET session = '$sessionid' WHERE tunnus = '$tunnus' AND salasana = '$salasana'") != false) { // Ikuisuus ei ole ikuisuus, vaan olemassaoloaika on vuoden päässä setcookie("pc", $sessionid, (time() + 60 * 60 * 24 * 365)); } else { // Ei löytynyt tunnusta, salasana ei täsmää header("Location: kirjaudu.php?error=3"); die; } } // Jotain ihmeellistä tapahtui: Mikään ehto ei täyttynyt! else { // Mennään suoraan takaisin header("Location: kirjaudu.php"); die; } header("Location: index.php"); } } else die(header("Location: kirjaudu.php")); } else die(header("Location: kirjaudu.php")); } // Voidaan tarkistaa, millainen errori tuli, ja näyttää se käyttäjälle. function Error() { if(isset($_GET["error"])) { $error = $_GET["error"]; if($error == "1") { echo "Virhe: Anna tunnus!"; } else if($error == "2") { echo "Virhe: Anna salasana!"; } else if($error == "3") { echo "Virhe: Tunnus ja/tai salasana oli väärin!"; } else { echo "Virheellinen error id!"; } } else $error = ""; } ?>
kirjaudu.php
<?php include("header.php"); if($user) { header("Location: kayttajasivu.php"); die; } else { Error(); ?> <form action="?login" method="POST" name="login"> <?php Error(); ?><br> Tunnus: <input type="text" name="tunnus"><br> Salasana: <input type="password" name="salasana"><br> Istunnon pituus minuutteina: <input type="text" maxlength="3" name="ipm"><br> Pysy aina kirjautuneena sisään: <input type="checkbox" name="paks" value="true"><br><br> <input type="submit" value="Kirjaudu"> </form> <?php } ?>
kayttajasivu.php
Tarvittava tietokanta luodaan joka kerta kun sivu ladataan? Wat?
Aihe on jo aika vanha, joten et voi enää vastata siihen.