Hei. Sivuillani on käytössä /report- komento, ilmiannot tallentuvat mysqliin reports tableen, nick|kohde|väärinkäyttö. Moderaattorit voivat lukea näitä ns. moderaattorisivulla, ja tarkoituksena olisi tehdä bannien antaminen mahdolliseksi.
Miten tuollainen bannisysteemi olisi hyvä tehdä? Tarkoituksena olisi siis saada sellainen että voi asettaa esim. 1 päivän bannin (aka. mute), joka poistuu itsestään kyseisen päivän kuluessa.
Tein erillisen tablen ban, minkälaisia sarakkeita sinne kuuluisi laittaa?
Olisko ihan vaikka id|aika|nick_id|syy_id|pituus_id
Tässä siis syy_id on viittaus syy-tauluun ja pituus_id on viittaus bannien pituuteen. Haku on ihan peruskauraa siinä vaiheessa, kun olet tulostamassa kirjoituslomaketta esille, niin katsot onko kirjautunut ja onko banneja. Ei ollenkaan paha rasti.
Suurin piirtein tuollaista ajattelinkin. Mutta, otetaan vaikka tiedosto ban.php joka tarkistaa, onko banneja. Miten? Miten PHP:llä voi tarkistaa, onko aika+pituus_id päivämäärä mennyt jo? Olisi tarkoitus myös pystyä antaa esim. 10min tai 1h "pelikieltoja". Missä muodossa kyseinen pituus_id kannattaisi lisätä, että php osaisi sitä käsitellä? Voiko pituus_id olla esim. "1h" tai "1d" ?
E: Nyt on table mute. Sisältö:
id|nick|mod|syy|aika|pituus
1|jorma|ilkeämod|peeloilu|2010-08-11 22:34:17|1d
Miten tarkistus, onko kyseinen aika+pituus mennyt?
Pistä pituus_id ihan vain sekunteina. Tällöin on helppo tarkistaa, onko banni vanhentunut:
villev kirjoitti:
Pistä pituus_id ihan vain sekunteina. Tällöin on helppo tarkistaa, onko banni vanhentunut:
Okei. Varchar lienee sopiva sekuntien tallentamiseen mysliin?
Miksi ihmeessä ei jokin numeerinen tyyppi? Unix-aikaleima mahtuu etumerkittömänä neljään tavuun (Myslin INT UNSIGNED) vuoteen 2106 asti.
En tiedä. En ole hyvä myslissä, siksi päätinkin kysyä. Mikäs sitten? INT? :(
Voi sen vertailun tehdä suoraan hakulausekkeessakin, tyyliin:
SELECT NOW() > '2010-08-11 22:34:17';
Kannattanee tallentaa bannien päättymisaika myös aikaleimana. Tuollainen "1d" on hyvin epämääräinen, ja se estää tietojen joustavan käytön. Jos taas haluat käyttää sekunteja niin tallenna bannien pituus sekunteina. Mielestäni selvintä on kuitenkin tallentaa selvät ajankohdat, milloin banni on annettu ja milloin se päättyy.
Clacier kirjoitti:
Okei. Varchar lienee sopiva sekuntien tallentamiseen mysliin?
Oikea tyyppi olisi jokin numeerinen, esim. INT.
Joo, laitoin INT. Tuli jo outo ongelma, miksei tämä suostunut lisäämään mitään? :O
Tarkista MySQL:n virheet funktiolla mysql_error
.
Tauluun olisi järkevämpää tallentaa yksinkertaisesti bannin alkamis- ja loppumisajankohta, jolloin bannauksen voisi helposti tarkistaa näin:
SELECT COUNT(*) AS banneja_voimassa FROM bannit WHERE kayttaja = ? AND NOW() BETWEEN alkaa AND loppuu
Looginen tietotyyppi loppumisajalle on DATETIME.
Aihe on jo aika vanha, joten et voi enää vastata siihen.