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ä. :)
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.
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. :)
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..
Eikö toimi esim.
login:
session_start(); $_SESSION['kayttaja'] = $_POST['tunnus']; // logout: session_destroy();
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ä.
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.
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
.
Enköhän näillä ohjeilla pärjää. Kiitos!
Ja koodivinkeissä on esimerkki kirjautumisesta/rekisteröitymisestä:
Kirjautuminen / rekisteröityminen à la MySql
Aihe on jo aika vanha, joten et voi enää vastata siihen.