webForumDet fria alternativet

Om tabellen inte finns?

ASP

15 svar · 482 visningar · startad av Gardell

Medlem sedan juli 2002688 inlägg
Frågan#1

Hej!

Jag listar först alla tabellnamn i Access och skickar det sedan via querystringen till en sida där jag listar alla inlägg i den tabellen. Men, om man skulle "råka" ändra tabellnamnet i querystringen så får man ju förstås ett fult felmeddelande.. Jag tänkte om det gick att göra ett eget sådant?

Tacksam för svar. :)

Medlem sedan dec. 19996 721 inlägg
#2

Visa gärna mer av din kod/tillvägagångssätt så kan vi titta vidare.

Medlem sedan juli 2002688 inlägg
#3

Okej. :) Inte så komplicerat..

tabletest.asp?nav=backup

Dim category
category = Request.Querystring("nav")

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db.mdb")

Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "Select * From " & category & " Order By artnr Desc", Connect, 3, 3

If RecSet.EOF OR RecSet.BOF Then
	Response.Write("Tomt")
Else

Do Until RecSet.EOF
Medlem sedan aug. 20003 575 inlägg
#4

Glöm bara inte att säkra mot SQL injections.

Medlem sedan juni 2000974 inlägg
#5

DU kan väl köra med

IF request.querystring("ditt_namn") = "visa all data" THEN
response.write "All data visas här..."
ELSE
response.write "Eget felmeddelande visas här."
END IF

Medlem sedan juli 2002688 inlägg
#6

Hur menar du Nickemannen? :)

Nej, Riffles.. Det var inte så jag tänkte. Eftersom jag inte kommer veta namnet på alla tabeller som skickas med. Jag vill ha en säkerhet, eller typ eget felmeddelande om nån skulle vara klåfingrig och ändra till en tabell som inte finns..

Edit: Jag söker alltså ungefär nåt som är lika smidigt som RecSet.EOF/.BOF.. Fast i tabellväg..

Medlem sedan aug. 20003 575 inlägg
#7

Ja,

strVariabel = Replace(Request.XXXX("xxxx"), "'", "''")
Medlem sedan juli 2002688 inlägg
#8

Ahh, tack. :) Mycket jag borde lära mig om säkerhet mot databasen..

Medlem sedan dec. 19996 721 inlägg
#9

Jag skulle gärna vilja veta själva syftet med tekniken. En lösning med "dynamiska" tabellnamn är i 99,9% av fallen helt fel väg att gå.

Medlem sedan juli 2002688 inlägg
#10

Jo, jag arbetar på en webbshop där administratören ska kunna lägga till nya kategorier. Varje kategori kommer få sin egen tabell, och då måste ju dessa listas. För att sedan komma till vald kategori så måste det ju bli så här, eller finns det några smidigare sätt? :q

Jag har ändrat lite på koden.. Hur kan den skrivas bättre i övrigt? :)

Exakt så här ser det ut nu:

<%
' QueryStringvärden

Dim strTbl
strTbl = Replace(Request.Querystring("nav"), "'", "''")

' Databassökväg och SQL-sats

objPath = "d4t4b4s3/articles-xtre2xvte9514.mdb"
strSQL = "SELECT * FROM " & strTbl & " ORDER BY artnr DESC"

' Anslut databasen

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(objPath))

Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS = objConn.Execute(strSQL)

' Om databasen är tom

If objRS.EOF OR objRS.BOF Then
	Response.Write("<p />Fel: angiven kategori hittas ej. Inga inlägg kan visas.")
Else

Do Until objRS.EOF

' Moms

If moms = "exkl" Then
	price = objRS("price") * 0.75
Else
	price = objRS("price")
End If

%>	
<table style="width:500px;padding:0px;border:0px;">

	<tr>
	<td style="width:100px;padding:5px;"><a href="article.asp?nav=<%=strTbl%>&artnr=<%=objRS("artnr")%>"><img src="prodImg/small_<%=objRS("pic1")%>" alt="Produktbild" /></a></td>
	<td style="width:300px;padding:5px;"><a href="article.asp?nav=<%=strTbl%>&artnr=<%=objRS("artnr")%>"><%=objRS("name")%></a></td>
	<td style="width:100px;padding:5px;"><%=price%>:-</td>
	</tr>

</table>
<%

' Fixa nästa post

objRS.MoveNext
	Loop

' Koppla från databas

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

End If

%>
Medlem sedan dec. 19996 721 inlägg
#11

I så fall ska du bygga om på en gång! Samla alla kategorier i en tabell och skicka med en nyckel som identifierar vilka rader ur denna tabell som vill ha.

strNav = Replace(Request.Querystring("nav"), "'", "''")

' Databassökväg och SQL-sats

objPath = "d4t4b4s3/articles-xtre2xvte9514.mdb"
strSQL = "SELECT * FROM kategorier where nav='" & strNav & "' ORDER BY artnr DESC"
Medlem sedan juli 2002688 inlägg
#12

Ptja, du har rätt. Det är väl mest rätt egentligen. :) Tyckte databasstrukturen skulle blivit snyggare med tabeller.. Men det är det väl ingen som bryr sig om egentligen.

Tack så mycket! :) I övrigt, finns det någon optimering jag kan göra?

Medlem sedan dec. 19996 721 inlägg
#13

Gardell skrev:

Ptja, du har rätt. Det är väl mest rätt egentligen. :) Tyckte databasstrukturen skulle blivit snyggare med tabeller.. Men det är det väl ingen som bryr sig om egentligen.

Det är just det vi gör. Databasstrukturen hade varit synnerligen "osnygg" med tabellförekomster som en del av datainnehållet.

Gardell skrev:

I övrigt, finns det någon optimering jag kan göra?

Den kod du visat är, förutom det nämnda problemet, helt OK. Du kan dock med gott samvete ta bort raden...

Set objRS = Server.CreateObject("ADODB.Recordset")

...eftersom recordsetet skapas om på raden under. Använder man .Execute behövs inte CreateObject.

Medlem sedan juli 2002688 inlägg
#14

Okej. :p Tyckte det skulle varit mer "sorterat" med tabeller. :) Nåja..

Tack så mycket för hjälpen! :bire

Medlem sedan dec. 19996 721 inlägg
#15

Gardell skrev:

Okej. :p Tyckte det skulle varit mer "sorterat" med tabeller. :) Nåja..

Tack så mycket för hjälpen! :bire

Vassego! :bire

För tydlighets skull. Problemen med att ha dynamiska tabeller är många, t.ex.:

  • Det går inte att söka ut vilka tabeller som finns i databasen, utan att utnyttja krystade s.k schema-sökningar, som inte minst är svåra att flytta om man byter databasmotor.
  • Man ökar risken för sql injection
  • Det blir ohanterligt att uppdatera struktur och data. Ponera att du vill lägga till en extra kolumn i kategoritabellen eller uppdatera alla rader med ett visst värde. Inte så smidigt med massor av tabeller.
Medlem sedan juli 2002688 inlägg
#16

Ah, där ser man. :)

287 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
137 ms — deklarationer (db)
0 ms — hämta statistik (cache)
147 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)