Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kirjautuminen kolmella tavalla

Macro [22.02.2010 10:49:04]

#

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

<?php
include("header.php");

if($user) {
	echo "Moi, {$user["tunnus"]}!";
} else {
	header("Location: kirjaudu.php");
	die;
}
?>

temu92 [25.02.2010 19:23:14]

#

Tarvittava tietokanta luodaan joka kerta kun sivu ladataan? Wat?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta