Visar inlägg med etikett Registrering. Visa alla inlägg
Visar inlägg med etikett Registrering. Visa alla inlägg

måndag 18 januari 2010

Registreringen i produktion

För att kunna testa registreringen publikt så skapar jag först en enkel MasterPage med en variabel Webname och tilldelade den "System9".

Sedan fixade jag en förstasida med länk till användarregistreringen och kopierar sedan över dem till den publika webben: http:www.server42.se.

Efter en del trassel så fungerar sidan och jag kompletterar den med länkar till koden och en länk för att återgå till förstasidan.

söndag 17 januari 2010

Registrering av användare (5)

Att lägga till fältet Lösenord är mycket enkelt. Först kopierar jag koden för användarnamnet som larmar om antalet tecken är färre än fem. Och därefter ändrar jag insertsatsen så att den även inkluderar Password.
INSERT INTO [User] (Username, Password, email, type) VALUES ('" & UserName.Text & "', '" & Password.Text & "')

Nu fungerar registreringen acceptabelt, men flera tillägg bör göras:
- kolla att användarnamn och lösenord inte innehåller blanka tecken
- ta hand om fel beroende på att databasen inte är tillgänglig.
- visa användarvillkor
- godkänna användarvillkor som förutsättning för registreringen
- registrera epostadress
- möjlighet att beställa användarnamn och lösenord med hjälp av lösenordet
- sidhuvudet bör kompletteras med uppgift om att logga in alternativ uppgift om användarnamn.
- loginsidan bör ha en länk till registreringssidan.
- En indexsida dit besökare kommer först med länk till registreringen.

Jag tycker att det är viktigt att dessa delar fungerar som de brukar så att intresserade inte avstår ifrån att registrera sig bara för att det verkar konstigt.

Registrering av användare (4)

Efter att i huvudsak givit upp att hitta på Microsofts spaggettiwebb, med inaktuellt innehåll, så har jag skaffat "murach's ADO.NET 3.5 Linq and Entity Framwork with VB 2008". 700 sidor med förhoppningsvis aktuell information. 375 kr + moms på adlibris.

Jag avstår dock tills vidare med att använda Linq och fortsätter att använda ADO.NET och SQL direkt ett tag till.

Kollen av om användarnamnet redan finns i databasen ser nu ut så här


Message.Text = ""
Dim conn As SqlConnection
Dim connectionstring As String = ConfigurationManager.ConnectionStrings("System91").ConnectionString
conn = New SqlConnection(connectionstring)
Dim comm As SqlCommand
comm = New SqlCommand("SELECT id, username FROM [User] WHERE username='" & UserName.Text & "'", conn)

Try
conn.Open()
Userid = comm.ExecuteScalar()
'ExecuteScalar returnerar första kolumnen i första posten om den finns, annars 0. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx Userid =

Catch ex As SqlException
Message.Text += " Databasfel. " & ex.Number & ": " & ex.Message '
Finally
conn.Close()
End Try


Några kommentarer och erfarenheter
- ConfigurationManager hämtar databasens lösenord från web.config.
- Variabler deklarerade i Try-delen är lokala inom det blocket och inte tillgängliga i t.ex. catch. Så jag har nu lagt deklarationerna före Try.

- Felmeddelandet vid databasfel har kompletterats

Nästa fas är att lagra det nya användarnamnet i databasen.

If Userid = 0 Then
Dim sql As String
sql = "INSERT INTO [User] (Username) VALUES ('" & UserName.Text & "')"
comm = New SqlCommand(sql, conn)
Try
conn.Open()
Dim res As Integer = comm.ExecuteNonQuery()
Message.Text += " Användarnamnet är registrerat. "
Catch ex As SqlException
Message.Text += " Databasfel " & ex.Number & ": " & ex.Message '
Message.Text += " Användarnamnet registrerades inte. "
Finally
conn.Close()
End Try
Else
Message.Text += " Användarnamnet är redan registrerat. "
End If

Men, som jag skrev i förra avsnittet, så har denna lösning ett allvarligt fel. Om någon skriver att användarnamn som redan finns kan ju denna person därefter direkt logga in med denna användares namn. Därför måste användarnamet skyddas med ett lösenord. Det får hanteras i avsnitt 5.

fredag 15 januari 2010

Registrering av användare (3)

Nu ska användarnamnet läggas in i databasen. Först gäller det dock att stoppa om det uppstått databasfel. Det sker med ok = False efter Catch. Därefter kan ok-varibeln kollas före uppdateringen.

Dessutom ska uppdateringen endast ske om Userid=0. I annat fall får användaren bara ett meddelande.

Uppdateringen sker igen inom Try...Catch.

SQL-satsen för att lägga in användarnamnet i databasen kan se ut så här:
INSERT INTO [User] (Username) VALUES ('" & UserName.Text & "')

Kommandot Insert utförs med objektet SQLcommand. Det är enormt omfattande och komplicerat. Det måste finns enklare beskrivning av hur man gör. Efter mycket sökande i Microsofts spagettidokumentation hittar jag Beginner Developer Learning Center, väljer web track och hamnar till slut på Lesson 7: Databinding to user interface controls. Lektionen är riktigt gammal - använder ASP.Net 2.0 (nu gäller 3.5) och SQL 2005 (numera 2008).

ASP.NET Selected Walkthroughs finns det mer aktuella råd, men genomgående är att Microsoft föreslår mängder med objekt och verktyg som bara gör allt mer komplicerat. Det borde ju vara hur enkelt som helst att bara lägga in en post i en databas.

Nej, jag ger upp vad gäller MSDN och testar i stället asp.net - en webb MS driver specialiserad på ASP. Inte bättre! Kollar http://msdn.microsoft.com/en-us/aa336522.aspx.

onsdag 13 januari 2010

Registrering av användare (2)

I första avsnittet fanns det redan en databas och namnet var riktig angivet i koden. Men om databasen inte skulle finnas eller fungera så måste användaren få ett meddelande. Det åtgärdas med Message.Text = "Databasfel" efter Catch.

Dessutom ändras meddelandet om databasfel så att den texten läggs till ev tidigare meddelande: Message.Text += " Databasfel. "

Om användaren inte anger något namn utan bara klickar på registrera så måste det också komma ett meddelande. Och i det fallet ska det inte göras någon sökning i databasen. Det är lika bra att begära att användarnamnet ska innehålla minst fem tecken. Det åtgärdas med
Dim ok As Boolean = True
If UserName.Text.Length
< 5 Then
Message.Text += "Användarnamnet måste vara minst fem tecken långt. "
ok = False
End If
if ok then
'kod för databassökningen
end if

Denna kod kollar inte om användaren använt blanktecken. Det bör nog inte vara möjligt.

Nästa uppgift blir att avgöra om användarnamnet finns i databasen. Objektet SqlCommand har flera metoder för bearbetning av databasen. ExecuteScalar kan vara lämplig. Koden blir
Userid = comm.ExecuteScalar()
Message.Text = "Användarid=" & Userid
Om användarid (Userid) är 0 så finns det inte i databasen och ska lagras. Det sker i nästa avsnitt och då hanteras även ett betydelsefullt fel.

Registrering av användare (1)

Hur enkel kan man göra registrering av en användare? Eftersom man ska logga in sig med ett username så är denna uppgift ett minimum. Username måste lagras i en databas så registreringen kan kollas vid en inloggning.

Vid registreringen måste jag först kolla om användarnamnet redan finns i databasen och i så fall meddela användaren det. I annat fall kan jag lagra användarnamnet.

Så jag börjar då med det. Först skapar jag en MasterPage med två ContentPlaceholders - en i huvudet och en i bodyn.

Jag kommer genomgående använda språket Visual Basic och placera koden i en separat fil åtskild från designen som skapas automatiskt med HTLM, ASP, mm.

Skapar sedan ett nytt item med namnet UserRegistration med mallen Web Form och använder den just skapade MasterPagen.

I design lägger jag in texten "Användarnamn", en textruta som får namnet UserName och knappen "Registrera". Startar programmet med F5, den inbyggda lokala webbservern går igång och resultatet blir det avsedda. Nu ska koden läggas till som lagrar UserName i databasen.

Jag skapar en kodfil genom att klicka på knappen. Bestämmer mig för att komplettera sidan med meddelandefält Message så att jag kan visa ett meddelande skapat koden. Först visas meddelandet "Label" i rött. Sedan döper jag variabeln till Message och tilldelar den ett innehåll med message.text="Här kommer meddelandet". Det fungerar som det ska.

Nu gäller det att skapa kontakt med databasen, Då det är en känslig passage omger jag denna kod med Try och Catch som gör att ev fel i Try-delen fångas upp och kan hanteras i Catchdelen.

Första satsen är Dim conn As SqlConnection. SqlConnection är ett objekt som svarar för kontakten med MS SQL. Då objektet inte ingår som standard måste det importeras med Imports System.Data.SqlClient. Dessutom krävs Dim comm As SqlCommand. Objektet SqlCommand innehåller uppgifter om hur databasen ska accessas.

Därefter ska en variabel tilldelas namn på databasen. Det gör man på detta krångliga sätt:
Dim connectionstring As String = ConfigurationManager.ConnectionStrings("System91").ConnectionString. Objektet ConfigurationManager ger tillgång till information om databasen.

Därmed kan förbindelsen skapas med databasen: conn = New SqlConnection(connectionstring). Sedan kan objektet sqlcommando tilldelas sqlsatsen som t.ex. styr hämtningen av information från databasen.: comm = New SqlCommand("SELECT type FROM [User] WHERE username='" & UserName.Text & "'", conn). Själva hämtningen sker med conn.Open().

Hanteringen av data hoppar jag över för tillfället och markerar det bara med ett meddelande: message.text="Här ska data hanteras". I stället kompletterar jag koden så att databaskontakten kan testas genom att lägga till conn.Close().

Hela koden blir:
Message.Text = "Här kommer meddelandet"
Try
Dim conn As SqlConnection
Dim comm As SqlCommand
Dim connectionstring As String = ConfigurationManager.ConnectionStrings("System91").ConnectionString
conn = New SqlConnection(connectionstring)
comm = New SqlCommand("SELECT type FROM [User] WHERE username='" & UserName.Text & "'", conn)
conn.Open()
Message.Text = "Här ska data hanteras"
conn.Close()
Catch
End Try

Fortsättning följer i Registrering av användare (2).