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!
Sekoilin näitten viritelmieni kanssa eihän tässä koodinpätkässä tkinteriä ole.
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
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.
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.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.