ptr_lksMedlem sedan juni 2005584 inlägg Hej wf,
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
Vad tycker ni? bra lösning eller inte?
TravoniMedlem sedan okt. 20041 556 inlägg Det är så du skall göra.
Då kan du återanvända din databaskoppling på alla sidor.
ptr_lksMedlem sedan juni 2005584 inlägg
Travoni skrev:
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
%>
@ndersMedlem sedan juni 200032 969 inlägg Vad är connect, som du skickar in i funktionerna, men aldrig använder?
Indenteringen säger jag ingenting om denna gång, men jag gråter. :'(
ptr_lksMedlem sedan juni 2005584 inlägg
@nders skrev:
Vad är connect, som du skickar in i funktionerna, men aldrig använder?
Vet inte.. hittade ett exempel, som jag tyckte blev godkännt av Travoni
Hur skulle det stå istället?
Indenteringen säger jag ingenting om denna gång, men jag gråter. :'(
Men snälla @nders, jag gör mitt bästa.. hur skulle du ha indenterat?
@ndersMedlem sedan juni 200032 969 inlägg
Hur skulle det stå istället?
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.
ptr_lksMedlem sedan juni 2005584 inlägg
@nders skrev:
När man indenterat ordentligt
som sagt så har jag jävligt svårt för detta...
@nders skrev:
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
%>
@ndersMedlem sedan juni 200032 969 inlägg
Menart du så här
Jag hade nog lagt den raden överst i filen dbkoppling.asp istället.
EDIT: Efter din redigering alltså; Ja.
- - - - -
Over and out.
emissionMedlem sedan dec. 19996 721 inlägg
ptr_lks skrev:
som sagt så har jag jävligt svårt för detta...
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
emissionMedlem sedan dec. 19996 721 inlägg
doggelito skrev:
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 ;)
ptr_lksMedlem sedan juni 2005584 inlägg är ju noob på detta med includes..
Hej wf,
är det rätt srivet om jag gör på detta sättet?
<!-- #include virtual="/includes/dbkoppling.asp" -->
<!-- #include virtual="/includes/koll_inloggningen.asp" -->
<%
Call PageAccess()
strMessage = Server.HTMLEncode(Trim(Replace(Request("txtChatt"), "'", "''")))
Call dbOpen()
strSQL = "INSERT INTO skickade (avUser, mess, tidpkt) VALUES ('"_
& Session("Inloggad") & "', '" & strMessage & "', '" & Now & "');"
minCon.Execute strSQL
Call dbClose()
%>
<html>
<head>
<title>Chatta</title>
<script language="JavaScript">
<!--
window.parent.frm_messages.location.href += '';
//-->
</script>
</head>
<body bgcolor="#FFFFFF">
</body>
</html>
TravoniMedlem sedan okt. 20041 556 inlägg 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.
emissionMedlem sedan dec. 19996 721 inlägg 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.
GlitterMedlem sedan juli 2003465 inlägg
ptr_lks skrev:
Hej wf,
är det rätt srivet om jag gör på detta sättet?
...
<html>
<head>
<title>Chatta</title>
<script language="JavaScript">
<!--
window.parent.frm_messages.location.href += '';
//-->
</script>
</head>
<body bgcolor="#FFFFFF">
</body>
</html>
Jo förutom Html koden som man också bör Indentera så man har lite koll på taggarna...
typ så här
...
<html>
<head>
<title>Chatta</title>
<script language="JavaScript">
<!--
window.parent.frm_messages.location.href += '';
//-->
</script>
</head>
<body bgcolor="#FFFFFF">
</body>
</html>