Att skapa en community 1/3
Förord
Att skapa ett community
Användarinformation
Vi börjar med att skapa databasen där vi skall lagra användarna i vårat community.
Vad man nu måste tänka på är exakt vad man vill ha med för infomation om användaren. jag har bestämt mig för:
Användarnamn (userLoginName)
E-post (userEmail)
Användarens lösenord (userPassword)
Inloggad? Ja/Nej (userLoginStatus)
När registrerade användaren sig? (userRegistred)
När loggade användaren in senast? (userLoginLatest)
Användarens riktiga namn (userFullName)
En text som beskriver användaren (userpresentation)
En länk till användarens hemsida (userURL)
En adress där man kan hämta en bild på användaren (userPictureURL)
Jag tyckte att ett poäng-system för detta community kunde vara roligt, så det behövs det också (userpoints)
Jag har även med en kolumn i databasen där jag lagrar ett unikt ID för användaren (userID).
Detta för att senare kunna hålla reda på vilken användare som gör vad och en massa saker som förklaras senare.
Databasen
tblUsers
Kolumnnamn Datatyp Förklaring
userID Automatisk räknare Unikt ID för användaren
userLoginName Text (Varchar) Användarnamn
userPassword Text (Varchar) Lösenord
userEmail Text (Varchar) Användarens e-post
userLoginStatus Number (Tal, Int) Är använderen inloggad?
userRegistred Date/Time (Datum/Tid) När registrerades användaren?
userLoginLatest Date/Time (Datum/Tid) När loggade användaren in senast?
userFullName Text (Varchar) Användarens riktiga namn
userPresentation Memo (PM, Text) En text som beskriver användaren
userURL Text (Varchar) Användarens hemsida
userPictureURL Text (Varchar) Adress till en bild på användaren
userPoints Number (Tal, Int) Hur många poäng har användaren?
Datatyperna inom parantes är motsvarande datatyper i diverse olika databaser.
Inloggningen
Vi börjar med att göra ett formulär där man kan fylla i användarnamn och lösenord. Formuläret skall även innehålla en knapp som vi trycker på när vi skall logga in. För att hålla nere det antal sidor som skapas i det här projektet så väljer jag att använda samma fil för validering av inloggningen också (login.asp).När vi har fyllt i vårat användarnamn, lösenord och klickat på "logga in" så skickas vi alltså tillbaka till samma sida där det görs en kontroll av min querystring. Jag valde att lägga till ?action=login i den url som skickas av formuläret. Detta för att hålla reda på om man har klickat på knappen för att logga in eller inte (det finns andra sätt, men jag valde detta på grund av enkelheten).
Nu går vi över på ASP-koden
Det första jag gör är att kontrollera om min querystring innehåller action=login. Gör den det så skall jag köra resten av ASP-koden, annars visas bara inloggningsformuläret igen.Efter detta så passar jag på att lägga in värdena från formuläret i strängar, samtidigt som jag tar bort diverse ogiltiga tecken som kan störa min sql-sträng när jag sedan skall använda dessa strängar för att bygga denna.
Nu är det dags att bygga min sql-sträng som jag skall köra genom databasen sedan. Dett gör jag genom att välja ut ID(userID), användarnamn(userLoginName), fullständigt namn och epost(userEmail) från tabellen tblUsers där inmatad användarnamn och lösenord stämmer överens med de i databasen.
Nu är det dags att köra allting genom databasen och se om användaren har angett korrekta uppgifter. Detta gör jag genom att öppna mitt recordset och sedan kontrollera om jag fick något resultat tillbaka. Om jag inte fick något resultat betyder det att inloggningen misslyckades och jag skickar tillbaka användaren till inloggningen med ett meddelande.
Om jag däremot får ett rewsultat tillbaka så har inloggningen lyckats och jag lägger in ID(userID), användarnamn(userLoginName), fullständigt namn och epost(userEmail) i respektive session-variabler för att lättare kunna hålla reda på vilken användare som är inloggad jsut nu samtidigt som jag uppdaterar databasen med lite information, t.ex jag anger att användaren är inloggad, läggere på två poäng och sätter senaste inloggningsdatumet/tiden till Now().
Till sist så stänger vi databasen och skickar vidare användaren till nästa sida (den första efter inloggnigen).
login.asp
<%
if Request.QueryString("action") = "login" then
Dim objConn 'as object
Dim strConn 'as string
Dim strSQL 'as string
Dim strLoginName 'as sstring
Dim strPassword 'as string
Dim rstUser 'as recordset
'Deklarera variabler för inloggningsnamn och lösenord
'Ta bort ogiltiga tecken från användarnamn och löseord (' och %)
strLoginName = Replace(Request.Form("fldLoginName"), "'", "''")
strPassword = Replace(Request.Form("fldpassword"), "'", "''")
strLoginName = Replace(strLoginName, "%", "")
strPassword = Replace(strPassword, "%", "")
'Skapa databaskopplingen
Set objConn = server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db/community.mdb")
objConn.Open strConn
'Välj ut användaren som har angivet användarnamn och lösenord
strSQL = ""
strSQL = strSQL & "SELECT userID, userLoginName, userEmail, userFullName FROM tblUsers "
strSQL = strSQL & "WHERE userLoginName = '" & strLoginName & "' AND userPassword = '" & strPassword & "'"
'Öppna mitt recordset
Set rstUser = Server.CreateObject("ADODB.Recordset")
rstUser.Open strSQL, objConn, 3, 3
if (rstUser.EOF or rstUser.BOF) then 'Misslyckades inloggningen?
'Skicka tillbaka användaren till inloggnings-sidan med ett meddelande
Session("message") = "Misslyckad inloggning.
Försök igen"
Response.Redirect("login.asp")
else 'Inloggningen lyckades
Response.Write(strSQL)
'Deklarera sessions som hjälper mig hålla reda på den inloggade användaren
Session("userID") = rstUser(0)
Session("userLoginName") = rstUser(1)
Session("userEmail") = rstUser(2)
Session("userFullName") = rstUser(3)
'Uppdatera information om användaren
strSQL = ""
strSQL = strSQL & "UPDATE tblUsers SET "
strSQL = strSQL & "userLoginStatus = 1, " 'Användaren är inloggad
strSQL = strSQL & "userLoginLatest = '" & Now() & "', " 'Användarens senaste inloggning
strSQL = strSQL & "userPoints = userPoints+2 " 'Man får 2 poäng för att logga in
strSQL = strSQL & "WHERE userID = " & Session("userID")
objConn.Execute(strSQL)
'Skicka användaren till startsidan
Response.Redirect("main.asp")
end if
'Stäng recordset
rstUser.Close
Set rstUser = nothing
'Stäng databaskopplingen
objConn.Close
Set objConn = nothing
end if
%>
Inloggning
Registreringen
Vi börjar med att göra ett formulär där användaren skall mata in de uppgifter vill ha.Det vi vill ha med är: användarnamn, lösenord, e-post, fillständigt namn, adress till användarens hemsida, adress till en bild på användaren och en text där användaren presenterar sig själv.
Formuläret skickas till samma sida med querystringen action=register så att vi vet vad som skall göras.
Nu skall vi gå över till ASP-koden.
Det första jag gör är att kontrollera om min querystring innehåller action=register. Om så är fallet, så skall vi behandla data, annars så skrivs formuläret på sidan som vanligt.I min kontroll så börjar jag med att deklarera mina variabler, detta för att lättare hålla reda på vilka variabler som används i dokumentet, samt att det är god programmerings-sed att göra det. En kontroll görs för att se om någon sträng är tom.
Sedan så tar jag bort onödiga tecken som kan ställa till problem när jag skall skapa min sql-sträng (' och %).
Nu är det dags att skapa och öppna min databas-koppling. Detta gör jag på samma sätt som i login.asp.
Därefter skapar jag en sql-sträng för att kontrollera om användarnamnet redan finns och öppnar ett recordset som kör frågan mot databasen.
Om användaren finns så lägger jag in ett meddelande om detta i en session-variabel och skriver ut formuläret igen, där meddelandet skrivs ut och man får försöka igen med ett annat namn. Om det inte finns någon sådant användarnamn registrerat så skall jag bygga min sql-sträng som stoppar in all data i databasen.
Jag använder mig av INSERT INTO-kommandot eftersom det är bättre prestandamässigt sett om man jämför med .Update-kommandot som finns för recordsets.
Här stoppar jag in allting som har skickats med formuläret genom att köra sql-frågan mot databasen med hjälp av kommandot objConn.Execute(strSQL).
Nu är det dags att skicka tillbaka användaren till inloggningssidan med ett meddelande om att han/hon är registrerad.
register.asp
<%
if Request.QueryString("action") = "register" then
Dim objConn 'as object
Dim strConn 'as string
Dim strSQL 'as string
Dim strLoginName 'as sstring
Dim strPassword 'as string
Dim strEmail 'as string
Dim strFullName 'as string
Dim strURL 'as string
Dim strPictureURL 'as string
Dim strPresentation 'as string
Dim rstUser 'as recordset
'Kontrollera om någon sträng är tom if strLoginName = "" then strLoginName = " "
if strPassword = "" then strPassword = " "
if strEmail = "" then strEmail = " "
if strFullName = "" then strFullName = " "
if strURL = "" then strURL = " "
if strPictureURL = "" then strPictureURL = " "
'Ta bort ogiltiga tecken från alla strängar (' och %)
strLoginName = Replace(Request.Form("userLoginName"), "'", "''")
strPassword = Replace(Request.Form("userPassword"), "'", "''")
strEmail = Replace(Request.Form("userEmail"), "'", "''")
strFullName = Replace(Request.Form("userFullName"), "'", "''")
strURL = Replace(Request.Form("userURL"), "'", "''")
strPictureURL = Replace(Request.Form("userPictureURL"), "'", "''")
strPresentation = Replace(Request.Form("userPresentation"), "'", "''")
strLoginName = Replace(strLoginName, "%", "")
strPassword = Replace(strPassword, "%", "")
strEmail = Replace(Request.Form("userEmail"), "%", "")
strFullName = Replace(Request.Form("userFullName"), "%", "")
strURL = Replace(Request.Form("userURL"), "%", "")
strPictureURL = Replace(Request.Form("userPictureURL"), "%", "")
'Skapa databaskopplingen
Set objConn = server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db/community.mdb")
objConn.Open strConn
'Skapa sql-sträng för att kontrollera om anvndaren finns
strSQL = "SELECT userLoginName FROM tblUsers WHERE userLoginName = '" & strLoginName & "'"
'Skapa och öppna recordset
Set rstUser = objConn.Execute(strSQL)
if (rstUser.EOF or rstUser.BOF) then 'Namnet var ledigt.
'Skapa sql-sträng för att lägga in en ny användare
strSQL = ""
strSQL = strSQL & "INSERT INTO tblUsers ("
strSQL = strSQL & "userLoginName, userPassword, userEmail, userFullname, userURL, userPictureURL, "
strSQL = strSQL & "userPresentation, userLoginStatus, userRegistred, userLoginLatest, userPoints"
strSQL = strSQL & ")"
strSQL = strSQL & "VALUES ("
strSQL = strSQL & "'" & strLoginName & "', " 'Användarnamn
strSQL = strSQL & "'" & strPassword & "', " 'Lösenord
strSQL = strSQL & "'" & strEmail & "', " 'E-post
strSQL = strSQL & "'" & strFullName & "', " 'Fullständigt namn
strSQL = strSQL & "'" & strURL & "', " 'Hemsida
strSQL = strSQL & "'" & strPictureURL & "', " 'Bild-adress
strSQL = strSQL & "'" & strPresentation & "', " 'Presentation
strSQL = strSQL & "0, " 'Inte inloggad
strSQL = strSQL & "'" & Now() & "', " 'Registrerad dagens datum och tid
strSQL = strSQL & "'" & Now() & "', " 'Senast inloggad
strSQL = strSQL & "0" 'Antal poäng
strSQL = strSQL & ")"
'Kör sql-strängen mot databsaen
objConn.Execute(strSQL)
'Skicka tillbaka användaren till inloggnings-sidan med ett meddelande att han/hon är registrerad
Session("message") = "Du är registrerad.
Du kan nu logga in."
Response.Redirect("login.asp")
else 'Namnet var upptaget
'Skapa ett meddelande till användaren
Session("regmess") = "Namnet finns redan, försök med någonting annat."
end if
end if
%>
Registrera användare
<%
Response.Write(Session("regmess"))
Session("regmess") = ""
%>
Avslutningsvis
Observera att även om denna kod fungerar, så är det inget speciellt avancerat forum. Koden är endast till för att beskriva hur man kan gå tillväga när man bygger ett inloggningssystem. Det är alltså ingen idé att maila mig angående förbättringar av denna kod, det får ni klara själva. ;-)Om ni däremot skulle hitta något fel i artikeln så är ni hemskt välkomna att maila mig så skall jag rätta till detta.
Sina Tikab
tack för artikeln
Silvio Fumei
Jag har mailat ansvarig för Pellesoft.se om att denna artikel skall tas bort omgående. Jag skrev denna artikel 2005-06-22 för publicering på www.aspsidan.se. Någon annan har helt enkelt kopierat al ltext och angett att de är skribent.
Silvio Fumei
Upptäckte precis att jag angav fel datum då jag skrev originalet på denna artikel för ASPsidan.se. Rätt datum skall vara 2002-06-05, inget annat.