Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kirjautumissysteemi - onko käyttäjä paikalla?

Sivun loppuun

nickname [08.08.2011 00:32:59]

#

Terve! Tässä parisen viikkoa oon lueskellut PHP:tä ja aloin väsäämään kirjatumissysteemiä, luultavasti sessioneilla. Parisen ongelmaa ilmeni liittyen tietokantaan. Jokaiselle käyttäjälle olisi tarkoitus luoda oma sivu, jossa näkyisi jotain tietoja, kuten rekisteröitymispäivämäärä ja onko käyttäjä atm paikalla. Eli ensimmäinen ongelma:

Miten saan tungettua päivämäärän tietokantaan silloin, kun käyttäjä painaa 'rekisteröidy'-nappia. Ja tarvitseeko minun tehdä tietokannan 'rek. pvm' kohtaan jotain muutoksia? (PhpMyAdminissa sen "tyypiksi" voi asettaa esim. DATE, DATETIME jne.) vai kelpaako pelkkä INT tai TEXT. Mieleen tuli kans rekisteröitymislomakkeen 'hidden input'.

Toinen ongelma:

Kuinka olisi järkevin ottaa selvää _jokaisella_ sivunlatauksella, onko käyttäjä paikalla vai ei?(Mikäli ei ole paikalla, näytetään login formi, jos on näytetään jotain muuta.) Tallennanko tietokantaan kohtaan 'paikalla' luvun 1, jos on ja luvun 0, jos ei ole? Silloin täytyisi siis tehdä joka sivulla kysely. Jossain olen tainnut nähdä, että tämä olisi totetutettu sessioneilla. Niistä ei ole vielä minkäänlaista tietoa, joten jos jonkin näköistä vinkkiä edes saisi, miten toteuttaa tämä. Valmista koodia en ole vailla, mahd. paljon koitan itse tehdä. :)

Grez [08.08.2011 01:52:15]

#

Itse laitan aina tietokantaan päivämäräätyypiksi datetime tai jos ehdottomasti en tarvitse kellonaikaa niin date. Mutta toisaalta, en pääsääntöisesti ohjelmoi PHP:lla (jossa päivämäärät ei mene yhtä luontevasti kuin jossain muualla). Toiseksi paras vaihtoehto on int ja käyttää vaikka unix timestampia muodossa olevaa aikaa. Text on ehdottomasti huonoin, jopa varchar olisi parempi, vaikka sekin on erittäin huono.

Voit tallettaa rekisteröimisajan PHP:stä tai vaikka käskeä tietokannan tekemään sen. Mitään ideaa en näe laittaa sitä piilokentäksi lomakkeelle.

Toiseen kysymykseen, että istunto ($_SESSION) varmaankin olisivat järkevin tapa.

nickname [08.08.2011 07:54:41]

#

Koitan saada päivämäärän tuolla unix timestampilla ja sessioneilla väsätä jonkin näköisen koodinpätkän, josta voisi katsoa onko käyttäjä paikalla. Kiitos nopeasta vastauksesta. :)

qeijo [08.08.2011 11:14:41]

#

Kun käyttäjä kirjautuu: tallennna istuntotunnus kantaan! => Sisällä!
Kun käyttäjä kirjautuu ulos: poista istuntotunnus! => Ulkona!

Ongelma! Jos käyttäjä ei käytä "Kirjaudu ulos" - painiketta tai istunto vanhenee, käyttäjä jää kirjautuneeksi! => Fail!

Ratkaisu(ish):

Jokaisen kirjautuneen käyttäjän sivulatauksen yhteydessä, luot päivityksen "aktiivinen" - tauluun (timestamp) joka on sidottu "käyttäjät" taulun id - kenttään.

Samalla tarkistat vanhentuneet muka "kirjautuneet" käyttäjät (Eli istuntotunnus olemassa, mutta ei ole sivulataustaulun mukaan olleet aktiivisia esim 30 min sisällä.) Heivaat ne helvettiin, eli tyhjennä käyttäjän istunto..

Eit: Sori hoonosoomi..

ZuBer [08.08.2011 12:07:34]

#

Eikö toimi esim.

login:

session_start();
$_SESSION['kayttaja'] = $_POST['tunnus'];
// logout:
session_destroy();

qeijo [08.08.2011 12:18:23]

#

ZuBer kirjoitti:

Eikö toimi esim.

login:

session_start();
$_SESSION['kayttaja'] = $_POST['tunnus'];

// logout:
session_destroy();

Joo o...

Mut pelkästään SESSION - muuttujilla ei saa tietoa ylläpidolle tai muille käyttäjille ketkä ovat kirjautuneena, ainoastaan asiakkaan ja palvelimen välillä.

Clacier [08.08.2011 18:37:57]

#

No tee vaikka taulu online, sarakkeet timestamp (bigint (20)) sekä nick (text).

Jokaiselle sivulle:

 <?php

if($_SESSION['loggedin']) { // Jos on kirjautunut
	$timeonline = time() - 1200; // Aika kuinka kauan näkyy onlinessa sivulatauksen jälkeen sekunteina, 1200s = 20 minuuttia
	mysql_query("DELETE FROM online WHERE time<".$timeonline);

	$meonline = mysql_query("SELECT * FROM online WHERE nick LIKE '".$_SESSION["nick"]."'");
	if(mysql_num_rows($meonline)) {
		mysql_query("UPDATE online SET time='".time()."' WHERE nick LIKE '".$_SESSION["nick"]."'");
	} else {
		mysql_query("INSERT INTO online (nick, time) VALUES ('".$_SESSION["nick"]."', '".time()."')");
	}
}

?>

lainaus:

(PhpMyAdminissa sen "tyypiksi" voi asettaa esim. DATE, DATETIME jne.)

Laita tyypiksi DATETIME ja käytä date("Y-m-d H:i:s")

lainaus:

vai kelpaako pelkkä TEXT.

Tällöin on ilmeisesti huono vertailla tai hakea vaikkapa 50 vanhinta käyttäjätunnusta.

lainaus:

Mieleen tuli kans rekisteröitymislomakkeen 'hidden input'.

Miksi? Näyttäisi koska käyttäjä on avannut sivun jossa rekisteröitymislomake on, ei sitä, koska se on oikeasti lähetetty.

-tossu- [08.08.2011 20:51:29]

#

nickname kirjoitti:

Miten saan tungettua päivämäärän tietokantaan silloin, kun käyttäjä painaa 'rekisteröidy'-nappia. Ja tarvitseeko minun tehdä tietokannan 'rek. pvm' kohtaan jotain muutoksia? (PhpMyAdminissa sen "tyypiksi" voi asettaa esim. DATE, DATETIME jne.)

Laita kentän tyypiksi TIMESTAMP ja oletusarvoksi CURRENT_TIMESTAMP.

nickname [15.08.2011 01:22:56]

#

Enköhän näillä ohjeilla pärjää. Kiitos!

Mitjander [16.08.2011 10:43:23]

#

Ja koodivinkeissä on esimerkki kirjautumisesta/rekisteröitymisestä:
Kirjautuminen / rekisteröityminen à la MySql


Sivun alkuun

Vastaus

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

Tietoa sivustosta