jag har hittat en "sak" på nätet:
Det rekomenderades att inkludera en databaskopplingsfil.
Function dbOpen(Connect)
Set Connect = server.createobject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & server.mappath ("databas.mdb ")
Set Connect = Connect
End Function
Function dbClose(Connect)
Connect.Close
Set Connect = Nothing
End Function
När man senare ska anropa dessa funktioner så skriver man bara...
Call dbOpen(Connect) 'Öppnar databasen
' Här skriver du all annan kod
Call dbClose(Connect) 'Stänger databasen
Det är så du skall göra.
Då kan du återanvända din databaskoppling på alla sidor.
Så det skall se ut ngt liknande:
dbkoppling.asp
<%
Function dbOpen(Connect)
Set minCon = Server.CreateObject( "Adodb.Connection" )
minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("*")
minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
minCon.open
End Function
Function dbClose(Connect)
minCon.Close
Set minCon = Nothing
End Function
%>
test.asp
<!--#include file="dbkoppling.asp" -->
<%
Call dbOpen(Connect)
strUser = replace(Request("chattnamn"), "'", "''")
strPasw = replace(Request("txtPassword"), "'", "''")
strSQL = "SELECT * FROM chattare WHERE Chattnamn = '"_
& strUser & "' AND Chattpassw ='" & strPasw & "';"
Set rs = minCon.execute (strSQL)
if not rs.EOF then
strSQL = "UPDATE chattare SET OnLine = 1 WHERE chattnamn ='" & strUser & "';"
minCon.execute strSQL,,128
strSQL = "INSERT INTO skickade (from, skrivet, tidpkt) VALUES ("_
& "'System', '<i>" & strUser & "</i> Steg in i chatten', '" & Now & "');"
minCon.execute strSQL,,128
Session("Inloggad") = chattare("anvID")
Call dbClose(Connect)
Response.Redirect "chatt.asp"
else
Call dbClose(Connect)
Response.Redirect("error.html")
end if
end if
%>
Eftersom det inte används, så är det bara att ta bort ur koden. Både i funktionsdefinitionen och när du kallar på funktionen.
- - - - - - - -
Indenterat:
<%
Function dbOpen(Connect)
Set minCon = Server.CreateObject( "Adodb.Connection" )
minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("*")
minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
minCon.open
End Function
Function dbClose(Connect)
minCon.Close
Set minCon = Nothing
End Function
%>
. . . . . . . . .
<!--#include file="dbkoppling.asp" -->
<%
Call dbOpen(Connect)
strUser = replace(Request("chattnamn"), "'", "''") strPasw = replace(Request("txtPassword"), "'", "''")
strSQL = "SELECT * FROM chattare WHERE Chattnamn = '"_
& strUser & "' AND Chattpassw ='" & strPasw & "';"
Set rs = minCon.execute (strSQL)
if not rs.EOF then
strSQL = "UPDATE chattare SET OnLine = 1 WHERE chattnamn ='" & strUser & "';"
minCon.execute strSQL,,128
strSQL = "INSERT INTO skickade (from, skrivet, tidpkt) VALUES ("_
& "'System', '<i>" & strUser & "</i> Steg in i chatten', '" & Now & "');"
minCon.execute strSQL,,128
Session("Inloggad") = chattare("anvID")
Call dbClose(Connect)
Response.Redirect "chatt.asp"
else
Call dbClose(Connect)
Response.Redirect("error.html")
end if
[b]end if[/b]
%>
När man indenterat ordentligt ser man att något är konstigt, det ligger ett end if och släpar, som inte har någon if ovanför.
I övrigt:
Funktioner skall returnera något, ett värde eller ett objekt till exempel. Returnerar man ingenting bör man använda subrutiner istället. Jag hade då låtit dessa se ut typ så här:
Sub dbOpen()
Set minCon = Server.CreateObject( "Adodb.Connection" )
minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("*")
minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
minCon.open
End Sub
Sub dbClose()
minCon.Close
Set minCon = Nothing
End Sub
Glöm inte bort att dim:a minCon utanför subrutinen dbOpen(), så den är global, och inte endast fungerar inuti dbOpen().
Slutligen: from ä ett reserverat ord i SQL. Du kommer att få ett felmeddelande om du ställer SQL-frågor där from används som fältnamn.
Glöm inte bort att dim:a minCon utanför subrutinen dbOpen(), så den är global, och inte endast fungerar inuti dbOpen().
Menart du så här
<%
dim minCon
Sub dbOpen()
Set minCon = Server.CreateObject( "Adodb.Connection" )
minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("*")
minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
minCon.open
End Sub
Sub dbClose()
minCon.Close
Set minCon = Nothing
End Sub
%>
Principen med indentering är att man avgränsar logiska block genom att justera dem dem horisontellt. Ett logiskt block är en programsats som har en definierad början och ett definierat slut.
Ex:
If userName="kalle" Then ' [B]Här börjar en if-sats. Nästa rad ska skjutas in[/B]
Response.Write "Hej Kalle! "
If startDate>Now() Then '[B]Här börjar en till if-sats. Nästa rad ska skjutas in[/B]
Response.Write "Du får inte vara med ännu.."
Else '[B]Blocket är slut, så vi hoppar tillbaka igen, men eftersom det är en Else så blir nästa rad inskjuten[/B]
Response.Write "Du får vara med nu.."
End If '[B]Blocket är slut[/B]
Response.Write "<br>"
End If
Sub dbOpen '[B]Subben börjar[/B]
Set minCon = Server.CreateObject( "Adodb.Connection" )
minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("*")
minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
minCon.open
End Sub '[B]Subben slutar[/B]
Do Until objRS.EOF '[B]Do Until-loopen börjar[/B]
Response.Write objRS("Kaka")
For i=1 to 5 '[B]For-loopen börjar[/B]
Response.Write "Kaka"
Next '[B]For-loopen slutar[/B]
objRS.Movenext
Loop '[B]Do Until-loopen slutar[/B]
Ursäkta om jag kommer in och stör orginaltråden, hoppas det är ok. :)
Nu, när vi är inne på indentering, finns det nån regel om radbryt i koden? Alltså för att få koden mer lättläst.
Jag hade vilja skriva detta stycke på detta viset, rätt? fel?
Do Until objRS.EOF 'Do Until-loopen börjar
Response.Write objRS("Kaka")
For i=1 to 5 'For-loopen börjar
Response.Write "Kaka"
Next 'For-loopen slutar
objRS.Movenext
Loop 'Do Until-loopen slutar
Jag hade vilja skriva detta stycke på detta viset, rätt? fel?
Indentering handlar om att göra koden lättläst och strukturerad, så om radbrytningar gör koden mer lättläst så är det utan tvekan rätt. Det finns inga regler att följa, utom möjligtvis sådana man har enats om med sina medutvecklare. Här på forumet är det dock en "god regel" att använda sig av indentering, eftersom det gör det så mycket lättare att förstå okänd kod.
Vill man träna så kan man ju alltid prova att programmera i Python, där indenteringen är helt avgörande för programmens funktion ;)
Använd gärna file istället för virtual om du kan...
Lägg till ,,128 (Betyder att sql:en inte skall returnera något)
minCon.Execute strSQL , , 128
Används på Update, insert och delete. Ej på select!
Annars så ser det bra ut.
Inte för att det spelar så stor roll här, men en bra generell praxis är att inte HTML-encoda det som du stoppar in i databasen. Det ska man göra när man visar det man hämtat från databasen.