webForumDet fria alternativet

hjälp med att bygga ihop en SQL-fråga

ASP

11 svar · 388 visningar · startad av oola

Medlem sedan feb. 2004123 inlägg
Frågan#1

Såhär är det. Du ska kunna söka efter en person.

Sidan innehåller, förutom en submit-knapp, 4 olika formelement:

Förnamn: textfält
Efternamn: textfält
Avdelning: Listbox
Land: Listbox

Tabellen Person i databasen består av ett Id samt de fyra egenskaperna som radades upp ovan.

Nu ska alltså en person kunna hittas och mitt problem är att få till korrekta SQL-frågor. Om användaren struntar i att fylla i ngt av fälten ska dessa inte inkluderas i SQL-frågan så att SQL-frågan blir olika beroende på vad användaren fyller i.

Ett sätt att göra det är förstås med massor av If-satser men det undviker jag gärna då det blir alltför jobbig kod.

Kan ni kanske ge mig några exempel på hur just du gjort det eller kan ni bara ge mig lite tips?

Medlem sedan apr. 20031 660 inlägg
#2

HEJ!

Det är inte så klurigt, gör if-satser din sql-sats.


sql="SELECT * FROM tbl"

if fornamn<>"" then sql2 = " fornamn='" & fornamn & "'
if efternamn<>"" then sql2 = sql2 & " efternamn='" & efternamn & "'
osv

if sql2<>"" then sql = sql & " WHERE"

slutsql=sql & sql2

Sedan kan du bygga vidare på liknande sätt för att söka ASC eller DESC på respektive fält, det är samma princip.

Medlem sedan nov. 20017 144 inlägg
#3

Skulle kanske ha gjort ungefär så här:

fornamn		= "Kalle"
efternamn	= "Jonsson"
avdelning 	= "dialys"
land 		= ""

andor		= "and"         'Skall det vara and eller or?

	function dbSearch(str,k)
		if str <> "" then dbSearch = k & " like '%" & str & "%' "&  andor &" "
	end function

sql= "SELECT fornamn,efternamn,avdelning,land from table WHERE "
sql = sql & dbSearch(fornamn, "fornamn")
sql = sql & dbSearch(efternamn, "efternamn")
sql = sql & dbSearch(avdelning, "avdelning")
sql = sql & dbSearch(land, "land")
sql = left(sql, len(sql) - 4)
							
Set Rs = execute(sql)

Kontrollera att minst ett fält är ifyllt, annars så kommer du få fel.

Medlem sedan feb. 2004123 inlägg
#4

Tack för svaren! Återkommer med vilken lösning som var bäst :)

Medlem sedan feb. 2004123 inlägg
#5

Använde egentligen en blandning av era svar men det går ju bara att acceptera ett inlägg som rätt tyvärr :)

Medlem sedan juni 200032 967 inlägg
#6

Du kan ju alltid visa det slutgiltiga resultatet också, så får andra som har samma problem lite mer hjälp. :)

mvh

Medlem sedan feb. 2004123 inlägg
#7
	F_Name=request.querystring("F_Name")
	L_Name=request.querystring("L_Name")
	D_Id=request.querystring("D_Id")
	C_Id=request.querystring("C_Id")

	SQL="SELECT * FROM Person"
	
	if F_Name<>"" then sql2 = sql2 & " F_Name like '%" & F_Name & "%' AND"
	if L_Name<>"" then sql2 = sql2 & " L_Name like'%" & L_Name & "%' AND"
	if D_Id<>"*" then sql2 = sql2 & " D_Id =" & D_Id & " AND"
	if C_Id<>"*" then sql2 = sql2 & " C_Id =" & C_Id & " AND"

	if sql2<>"" then 
		SQL= SQL& " WHERE"
	else
		'Denna else-sats behövs eftersom SQL-strängen kapas längre ner. Om de fyra X:en inte skulle vara där blir frågan kaputt.
		SQL= SQL& "XXXX"
	end if
	
	SQL=SQL & sql2
	
	SQL = left(SQL, len(SQL) - 4)

Du har en poäng där och här kommer därför en lösning. Kanske inte den bästa eller effektivaste men den fungerar iaf :)

Medlem sedan dec. 19991 072 inlägg
#8

Glöm inte att skydda dit mot SQL-injection sen heller!

Dvs. används antingen en parameteriserad fråga eller skydda dig iaf mot '-tecknet.

Du kan läsa mer om det på:
http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a

Medlem sedan apr. 20031 660 inlägg
#9

HEJ!

Jag förstår inte varför du har med else-satsen med XXXX, de borde du kunna arbeta bort genom att justera Left-funktionen?

Medlem sedan feb. 2004123 inlägg
#10

Hmm...det är väl om sql 2 är tom, då måste jag lägga till något annars tar Left-funktionen bort sånt som är viktigt.

Går också att skrive WHERE direkt i första SQL-frågan och lägga till ett mellanslag efter varje AND.

Jaja, det var iaf ett enkelt sätt att jobba sig runt ett problem.

Medlem sedan apr. 20031 660 inlägg
#11

HEJ!

Nej, du kan inte lägga WHERE i första sql-variabeln, OM man inte fyller i något fält att leta efter. (Har du kanske redan stoppat?)

Såg att jag missat att få med AND efter varje sql2, och det behövs ju, om söker på mer än ett fält.
Då kan man lösa det som du gjort.

Medlem sedan feb. 2004123 inlägg
#12

Fast det gick, jag ändrade faktiskt, skrev dit WHERE i första sql-en och sen oavsett vad som händer köra: SQL = left(SQL, len(SQL) - 5) istället för -4.

Jaja, spelar egentligen inte så stor roll hur man gör det.

267 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)