Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python 3, TKinter ja Email-osotteiden tarkistus

kurssiopiskelija [01.01.2012 15:55:01]

#

Morjensta vaan kaikille ! Kaipaisin oppineemmilta neuvoa tässä ohessa mukana olevan koodinpätkän ongelman Email-osotteiden muodon tarkistamisesta.
Tuolla oli joitakin vanhoja PHP:n liittyviä pätkiä, mutta kun verkkokurssillamme on menossa juuri nyt tkinter ja vähän sqlitea olisi mukava saada vinkkiä tai ratkaisu kokeiltavaksi

import sqlite3

# Avataan tietokantayhteys - huom. tämä luo tietokannan ellei sitä ole
conn = sqlite3.connect('yhteystiedot.s3db')

# Luodaan tietokantakursori, jonka kautta käsittely tapahtuu
c = conn.cursor()

# luodaan taulu ellei ole
stm = "create table if not exists YHTEYSTIEDOT(ETUNIMI varchar(20),SUKUNIMI varchar(20), PUH varchar(20), EMAIL varchar(30))"
c.execute(stm)

# 1. yksinkertainen tietueen lisäys ---------------------------------------------

print("Tietueen lisäys, tapa 1")
etunimi = input("Anna etunimi:")
sukunimi = input("Anna sukunimi:")
puh  = input("sitten puh:")
email = input("Vielä email osoite:")
#********************************************************
# Tähän kohtaan ilmeisesti jonkinlainen funktio ?
# Onko Python moduleista lisäapua ? import mail ?
# def tarkista_email():  mutta sitten miten ohjelman saa tarkistamaan että
# email osoitteessa on tarvittavat osatejijät nimi, @ , palvelinosoite
#**************************************************************
stm = "insert into YHTEYSTIEDOT(ETUNIMI,SUKUNIMI,PUH,EMAIL) values('" + etunimi + "','" + sukunimi + "','" + puh + "','" + email + "')"
c.execute(stm)
# sqlite toimii transaktiopohjaisesti, commit tarvitaan
conn.commit()
# Haetaan taulusta yksi tietue
# Haku nimellä

print("Hae etunimellä")

nimi = input("Anna nimi:")
stm = "select ID,ETUNIMI,SUKUNIMI,PUH,EMAIL from YHTEYSTIEDOT where ETUNIMI = ?"
rs = c.execute(stm, [nimi])
rivi = c.fetchone()
if (rivi != None):
    print(rivi[0],rivi[1],rivi[2],rivi[3])
else:
    print("ei riviä")

print("Haetaan puhelinnumerolla")

puh = input("Anna puhelinnumero tai sen osa:")
puh = puh + "%"  # % SQL jokerimerkki (like-operaatiossa)
stm = "select ID,ETUNIMI,SUKUNIMI,PUH,EMAIL from YHTEYSTIEDOT where PUH = ?"
rs = c.execute(stm, [nimi])
rivi = c.fetchone()
if (rivi != None):
    print(rivi[0],rivi[1],rivi[2],rivi[3])
else:
    print("ei riviä")

# tietokantayhteys suljetaan
c.close()
conn.close()

Mod. lisäsi kooditagit!

kurssiopiskelija [01.01.2012 15:58:57]

#

Sekoilin näitten viritelmieni kanssa eihän tässä koodinpätkässä tkinteriä ole.

kaviaari [01.01.2012 17:28:39]

#

Päätä mitä vaatimuksia sähköpostiosoitteen pitää mielestäsi täyttää ja kirjoita funktio joka tarkistaa täyttyvätkö vaatimukset. Olette varmastikin kurssilla käsitelleet merkkijonojen käsittelyä. Karkeana esimerkkinä @ -merkin hakeminen tapahtuisi vaikka seuraavasti:

def onkoMiukumauku(osoite):
  return "@" in osoite

ErroR++ [01.01.2012 18:43:27]

#

kurssiopiskelija kirjoitti:

Sekoilin näitten viritelmieni kanssa eihän tässä koodinpätkässä tkinteriä ole.

Huomaatko ensimmäisen viestisi yläkulmassa olevan Muokkaa -napin? napsauta sitä ja muuta otsikkoa. Lisäksi kannattaa lukea keskustelun ohjeet ja käyttää kooditageja.

Yucca [02.01.2012 00:24:37]

#

kaviaari kirjoitti:

Päätä mitä vaatimuksia sähköpostiosoitteen pitää mielestäsi täyttää ja kirjoita funktio joka tarkistaa täyttyvätkö vaatimukset.

Vaatimuksethan on jo määritelty RFC 5322:ssa. Toteutus on ehkä vähän isompi työ kuin annat ymmärtää. Jos se tehdään oikein, siinä menee luultavasti aika monta kertaa enemmän aikaa kuin yhden verkkokurssin suorittamisessa on kohtuullista. Ks. esim. Stackoverflow’n sivua osoitteen validoinnista.

Mutta mitä osoitteen tarkistamisella halutaan saavuttaa? Mikään muototarkistushan ei takaa, että osoite toimii. Ja toisaalta triviaalit tarkistukset (joissa huomataan esim. että @-merkki puuttuu, jolloin meiliosoitteen paikalle on todennäköisesti kirjoitettu katuosoite tms.) pitäisi tehdä mahdollisimman lähellä tiedon alkuperäistä lähdettä, jolloin voi vielä yrittää vuorovaikutteisesti korjata asian.

Mutta jos kurssilla vaaditaan jotain tarkistusta, niin seuraava säännöllinen lauseke lienee kohtuullinen kompromissi:

\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

Se havaitsee joukon tavallisimpia selviä, havaittavissa olevia virheitä ja toisaalta hylkää suhteellisen pienen osan oikeasti käytössä olevista osoitteista.

kurssiopiskelija [02.01.2012 07:44:17]

#

Kiitoksia erityisesti Yuccalle vastauksesta ja linkistä. Juuri näitä merkkijonoja yritin omalla tavallani ohjelmaan laittaa esim.
def_tarkista_email(nimi,merkki,osoite): Ja sen jälkeen määritellä esim.
merkki = "@", mutta siihen tyssäsi. Kiitos myös linkistä. Ennen seuraavaa vierailuani "Putkassa" yritän toki tutustua tarkemmin noihin keskustelupalstan ohjeisiin ja koodienoikeisiin kirjoitustapaan. Nyt käytin siihen kirjautumisen jälkeen liian vähän aikaa. Olen pahoillani

Vastaus

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

Tietoa sivustosta