Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Käyttäjäluokka

Sivun loppuun

Magic Eye [21.07.2006 19:14:01]

#

Simppeli luokka, joka sisältää ominaisuudet käyttäjien lisäämiseen, salasanan vaihtoon, sisään kirjautumiseen ja profiilin näyttöön. Rekisteröinnissä tarvitsee aktivoida tili, joten vääriä postiosoitteita ei moni kirjoita.

members.php

<?php
// Säilytä tekijän tiedot tässä
// Tekijä: Iiro Krankka, http://www.taikasilma.com
// tee tiedosto members.txt ja chmodaa se 0777 (0664 riittää joissain tapauksissa, mutta unix vaatii 0777.)
class Members {
	var $uid;
	var $uname;
	var $upass;
	var $joindate;
	var $email;
	var $ip;

	function addUser() {
		$this->uid = strtr(substr(str_shuffle(time() * 10 * rand(0, 1000)), 0, 10), "5849761320", "91502346870");
		$this->uname = $_POST["uname"];
		$this->upass = md5($_POST["upass"]);
		$this->joindate = date("d.m.Y");
		$this->email = $_POST["email"];
		$this->ip = $_SERVER["REMOTE_ADDR"];
		$this->verified = "no";

		if($_POST["uname"] && $_POST["upass"] && $_POST["email"]) {
			$f = file("members.txt");

				for($i = 0; $i < count($f); $i++) {
					$palat = explode("|<>|",$f[$i]);

					if($this->uname == $palat[1] || $this->email == $palat[4]) {
						print "Käyttäjätunnus ja/tai email on jo käytössä. Valitse toinen.";
						die();
					} else {
						$file = fopen("members.txt", "a");

						fwrite($file, $this->uid . "|<>|" . $this->uname . "|<>|" . $this->upass . "|<>|" . $this->joindate . "|<>|" . $this->email . "|<>|" . $this->ip . "|<>|" . $this->verified . "\n");
						fclose($file);

						mail($this->email, "Jäsenyytesi sivuillamme", "Hei " . $this->uname . ",\n\nolet rekisteröitymisen viimeisessä vaiheessa: tunnuksen aktivoinnissa. Jos aktivointi onnistuu, tilisi tiedot ovat seuraavat:\n\nKäyttäjätunnus: " . $this->username . "\nSalasana: " . $_POST["upass"] . "\n\nSalasanasi on kryptattu tietokantaamme, ja unohduksen yhteydessä sitä ei voi selvittää. Voit kuitenkin vaihtaa salasanan, jos se pääsee unohtumaan. \n\n------------------\nHUOM!!!! Klikkaa aktivointilinkkiä: http://www.sivu.com/members/members.html?act=activate&uid=" . $this->uid . "&email=" . $this->email . "\n------------------\n\nTerveisin sivu.com", "From:sivut <noreply@sivut.com>, Reply-To: sinä@domain.com");
						print "Tilisi luonti onnistui.";
						die();
					}
				}
		} else {
			print "Tietoja puuttuu..";
		}
	}

	function activate($uid, $email) {
		$f = file("members.txt");
		$sis;

		for($i = 0; $i < count($f); $i++) {
			$palat = explode("|<>|", $f[$i]);

			if($palat[6] == "yes\n") {
				print "Tili on aktivoitu aiemmin!";
				die();
			} else {
				if($palat[0] == $uid && $palat[4] == $_GET["email"]) {
					$sis .= $palat[0] . "|<>|" . $palat[1] . "|<>|" . $palat[2] . "|<>|" . $palat[3] . "|<>|" . $palat[4] . "|<>|" . $palat[5] . "|<>|yes\n";
					$found = "joo";
				} else {
					$sis .= $f[$i];
				}
			}
		}

		$fi = fopen("members.txt", "w");
		fwrite($fi, $sis);
		fclose($fi);

		if($found == "joo") {
			print "Tilin aktivointi onnistui.";
		} else {
			print "Tiliä ei ole olemassa!";
		}
	}

	function changePass($uid, $pass) {
		$f = file("members.txt");
		$sis;

		for($i = 0; $i < count($f); $i++) {
			$palat = explode("|<>|", $f[$i]);

			if($uid == $palat[0]) {
				$sis .= $palat[0] . "|<>|" . $palat[1] . "|<>|" . md5($pass) . "|<>|" . $palat[3] . "|<>|" . $palat[4] . "|<>|" . $palat[5] . "|<>|" . $palat[6];
			} else {
				$sis .= $f[$i];
			}
		}
			$fi = fopen("members.txt", "w");
			fwrite($fi, $sis);
			fclose($fi);
			print "Salasanan vaihto onnistui.";
	}

	function login($uname, $upass) {
		session_start();
		$f = file("members.txt");

		if($uname && $upass && !$HTTP_COOKIE_VARS["loggedin"] != "tksjasen") {
			for($i = 0; $i < count($f); $i++) {
				$palat = explode("|<>|", $f[$i]);

				if($uname == $palat[1] && md5($upass) == $palat[2]) {
					$log = "jo";
				}
			}

			if($log == "jo") {
				setcookie("loggedin", "tksjasen", time() + 60 * 60 * 24);
				print "Teretulemast!";
			} else {
				print "väärin meni.";
			}

			if($HTTP_COOKIE_VARS["loggedin"] == "tksjasen") {
				print "Olet sisällä.";
			}
		}
	}

	function profile() {
		$f = file("members.txt");

		for($i = 0; $i < count($f); $i++) {
			$palat = explode("|<>|", $f[$i]);

			if(rawurldecode($_GET["uid"]) == $palat[1]) {
				print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"3\" style=\"border:1px solid #F1F1F1;\">\n<tr><td bgcolor=\"#F1F1F1\">Käyttäjätunnus: $palat[1]</td></tr>\n<tr><td bgcolor=\"#F1F1F1\">Sähköposti: $palat[4]</td></tr>\n<tr><td bgcolor=\"#F1F1F1\">Liittymispäivä: $palat[3]</td></tr>\n</table>";
			}
		}
	}
}
$m = new Members();

if($_POST["act"]) {
	$act = $_POST["act"];
} else {
	$act = $_GET["act"];
}

switch($act) {
	case "register" :
?><form action="members.html?act=register" method="post">
<input type="hidden" name="act" value="register2">
Käyttäjätunnus: <input type="text" name="uname" id="uname"><br/>
Salasana: <input type="text" name="upass" id="upass"><br/>
Email: <input type="text" name="email" id="email"><br/>
<input type="submit">
</form><?php break;
	case "register2" : if($_POST["uname"]) $m->addUser(); break;
	case "activate" : $m->activate($_GET["uid"], $_GET["email"]); break;
	case "profile" : $m->profile(); break;
}
?>

htaccess

<Files members.txt>
    deny from all
</Files>

Metabolix [22.07.2006 16:41:15]

#

Kommentointia vielä voisi vähän lisäillä koodiin.

Kryil [24.07.2006 23:06:37]

#

Miten niin unix tarvitsee suoritusbitit tiedostolle, vaikkei sitä ikinä suoritetakaan?

Ei kai tämä ole missään oikeasti käytössä? Uusien käyttäjien lisäys on suoraan sanottuna pyllystä ;)

 for($i = 0; $i < count($f); $i++) {
	$palat = explode("|<>|",$f[$i]);

	if($this->uname == $palat[1] || $this->email == $palat[4]) {
		print "Käyttäjätunnus ja/tai email on jo käytössä. Valitse toinen.";
		die();
	} else { // Eikös tänne tulla joka kierroksella kun tiedostosta ei löydy samaa tunnusta tai emailia?
		$file = fopen("members.txt", "a");

		fwrite($file, $this->uid . "|<>|" . $this->uname . "|<>|" . $this->upass . "|<>|" . $this->joindate . "|<>|" . $this->email . "|<>|" . $this->ip . "|<>|" . $this->verified . "\n");
		fclose($file);

		mail(...);
		print "Tilisi luonti onnistui.";
		die();
	}
}

Ellei sitten tarkoituksenasi ole lisätä uusia käyttäjiä yhtä montaa kertaa kuin vanhoja käyttäjiä oli yhteensä...

php-Niko [25.07.2006 10:38:03]

#

hmm.. pitää testata! Toivottavasti toimii kunnolla =)

siirappi [25.07.2006 12:26:35]

#

Tässä tapa, jolla tuosta kirjoitettavan rivin muodostuksesta saa edes vähän fiksumman näköisen:

$rivi = array(
	$this->uid,
	$this->uname,
	$this->upass,
	$this->joindate,
	$this->email,
	$this->ip,
	$this->verified
);

$rivi = implode("|<>|", $rivi);

Ja ylläpito voisi pistää tuohon koodilistauksen elementtiin CSS-määrityksen overflow: auto, jolloin rivit ei rivittyisi väkisin.

T.M. [25.07.2006 15:27:43]

#

Kryil kirjoitti:

// Eikös tänne tulla joka kierroksella kun tiedostosta ei löydy samaa tunnusta tai emailia?

Ei, vaan silloin jos ei löydy samaa tunnusta JA emailia.

Olen tosin samaa mieltä että tuota systeemiä voi parantaa ainakin virheenkäsittelyn osalta. Ja ehkäpä tietojen tallennukseen olisi hyvä käyttää serialize() funktiota.

Turatzuro [28.07.2006 11:45:57]

#

Kannattaisi muuten varmaan opetella booleanien käyttö. Jotenkin helpompaa käyttää

$muuttuja = true;
if($muuttuja) [
   ...
}

kuin

$muuttuja = "joo";
if($muuttuja == "joo") {
   ...
}

Serializesta en näe oikein hyötyä. Jos osaa homman hoitaa esim TSV tms. muotoisena, on myöhemmin tarpeen vaatiessa helppoa importata tieto muihin ohjelmiin.

Tontsa-san [01.08.2006 17:54:49]

#

Vielä yksinkertasempi vaihtoehto muuttujiin olisi laittaa;
$muuttuja = 1;

T.M. [04.08.2006 14:29:17]

#

Turatzuro kirjoitti:

Serializesta en näe oikein hyötyä. Jos osaa homman hoitaa esim TSV tms. muotoisena, on myöhemmin tarpeen vaatiessa helppoa importata tieto muihin ohjelmiin.

Serializen hyöty on nopeus, yksinkertaisuus ja vähemmän virhealtis.

Ja harvoinpa tulee eteen tilannetta että pitäisi PHP:llä luotu tietokanta portata johonkin toiseen ohjelmaan. Ihan turha edes miettiä moisia. Silloin tehdään jokin työkalu joka muuttaa tietokannan sellaiseksi kuin se toinen ohjelma sitä käyttää. Ei kannata tuon takia käyttää huonompia tapoja PHP:ssä, jos kerran vuosisadassa tulee eteen tuollainen tilanne.

mauku [27.10.2006 13:05:58]

#

Salasanasi on kryptattu tietokantaamme, ja unohduksen yhteydessä sitä ei voi selvittää. Voit kuitenkin vaihtaa salasanan, jos se pääsee unohtumaan.

miten voi vaihtaa salasanan jos ei tiedä sitä vanhaa salasanaa?
en ole koodia kokeillut, mutta luulen että salasanat eivät näy kaikille käyttäjille :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta