webForumDet fria alternativet

Söktjänst!

ASP

16 svar · 441 visningar · startad av Asa

Medlem sedan dec. 20011 860 inlägg
Frågan#1

Håller på med en söktjänst men hur gör man för att kunna skriva som ni har på eran söksida.

Ex sökord1 And sökord2 eller sökord1 +sökord2

Medlem sedan juni 20003 076 inlägg
#2

hittade denna, kan det va nått! :)
https://www.webforum.nu/showthread.php?s=&threadid=54475&highlight=s�kmotor

Medlem sedan dec. 20011 860 inlägg
#3

Jadu! Var svårt å fatta nåt av det :/ Min kod ser ut så här!

<table cellspacing="0" cellpadding="0" width="450" border="0" align="center">
   <tr> 
     <form name="sok" method="post" action="index.asp?do=sok" onSubmit="return SokOrd()">
       <td>
           <input type="text" name="sok" size="30" maxlength="30">
           &nbsp; <input type="submit" name="Submit" value="Sök">&nbsp;
           <select name="falt">
              <option value="titel" name="falt">Titel
              <option value="forf" name="falt">Författare
              <option value="info" name="falt">Heltext
              <option value="artikeltyp" name="falt">Artikeltyp
              <option value="ref" name="falt">Ref/litteraturfört.
           </select></td>
     </form>
   </tr>
</table>

Och sen lite där den hämtar från databasen beroende på vad jag skrivit

Falt = Trim(Request.Form("falt"))
Sokordet = Request.Form("sok")

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

SQL = "Select * From filer Where " & Falt & " Like '%" & Sokordet & "%' Order By id Desc"
RecSet.Open SQL, Conn
Medlem sedan feb. 200112 078 inlägg
#4

Jag förstår inte vad som är så svårt med den.

Den loopar igenom alla items i ditt formulär. Placerar värdet av denn input/element i variabeln 'strValue'. I loopen ersätts sedan ' med '' och * med %. Det sista för att kunna använda wildcards (*). Om 'strValue' innehåller % så vet vi att vi måste använda SQL-parametern LIKE, eftersom det skall vara wildcards, så variabeln: 'strLogOp' blir LIKE. Om % inte finns, blir 'strLogOp' givetvis =. Sedan körs en ifråga som kollar ifall inputnamnet innehåller "get_" eller inte. Om den gör det läggs namnet, variabeln 'strLogOp' och värdet till efter varandra så att vi får typ namn =/LIKE värde.

Och sedan börjar det om med nästa formulärelement. :)

OveRRidE skrev:

Alla formular som skall inkluderas i sökningen måste heta get_formularnamn, där formularnamn är vad form-elementet heter.

Forumlarnamnet måste vara samma som kolumnen som skall sökas i. Skall du t.ex. inkludera kolumnen user i din sökning, måste det formularelementet heta get_user.

* (stjärna) är wildcard, och konverteras till % under körningen.

Medlem sedan dec. 20011 860 inlägg
#5

Jag får det dock ej å funka :/

Medlem sedan feb. 200112 078 inlägg
#6

Kod? Felmeddelande? På vilken rad?

Medlem sedan dec. 20011 860 inlägg
#7

Det den gör är att det visar allt ifrån databasen! Alltså alla innehåller det man skriver!

Hur får man det sen att göra sökorden fetstilta i resultaten?

Medlem sedan feb. 200112 078 inlägg
#8

Skriv ut din SQL-sats.

response.write SQL
Medlem sedan dec. 20011 860 inlägg
#9

Vad är WHERE 1=1 ??

Skriver bara ut:

SQL = "SELECT * FROM filer WHERE 1=1"

Medlem sedan dec. 20011 860 inlägg
#10

Det verka skriva ut samma info på alla

Medlem sedan feb. 200112 078 inlägg
#11

Hrm.

Använder du något av det som jag skrev i den andra tråden, koden alltså?

Kan du posta hela koden?

Medlem sedan dec. 20011 860 inlägg
#12

Här är koden. Vet ju inte riktigt var jag ska ändra och om man skulle ändra nåt:

<%Response.Buffer=True

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db/databas.mdb")%>

<html>
<head>
<title>Artikelsök</title>
<link rel="stylesheet" href="stil.css" type="text/css">
<script src="js.js"></script>
</head>

<body>

<table cellspacing="0" cellpadding="0" width="450" border="0" align="center">
   <tr> 
     <form name="sok" method="post" action="index.asp?do=sok" onSubmit="return SokOrd()">
       <td>
           <input type="text" name="sok" size="30" maxlength="30" onChange="javascript:while(''+this.value.charAt(0)==' ')this.value=this.value.substring(1,this.value.length);">
           &nbsp; <input type="submit" name="Submit" value="Sök">&nbsp;
           <select name="falt">
              <option value="titel" name="falt">Titel
              <option value="forf" name="falt">Författare
              <option value="info" name="falt">Heltext
              <option value="artikeltyp" name="falt">Artikeltyp
              <option value="ref" name="falt">Ref/litteraturfört.
           </select></td>
     </form>
   </tr>
<%If Request.QueryString("do") = "sok" Then%>
  <tr> 
      <td height="14" colspan="3"><hr size="1" color="#000000" noshade></td>
    </tr>
  <tr> 
      <td colspan="3"><b>Sökresultat</b></td>
    </tr>
  <tr> 
      <td height="14" colspan="3"><hr size="1" color="#000000" noshade></td>
    </tr>
<%Falt = Trim(Request.Form("falt"))
Sokordet = Request.Form("sok")
If Sokordet = "" Then
      Response.Redirect "index.asp"
End If

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

SQL = "SELECT * FROM filer WHERE 1=1 "
	
	for each item in request.form
		strValue = trim(request.form(item))
		strValue = replace(strValue,"'","''")
		strValue = replace(strValue,"*","%")
		if instr(strValue,"%") > 0 then
			strLogOp = "LIKE"
		else
			strLogOp = "="
		end if
		
		'SQL = SQL & "AND "
		
		if cstr(left(item,4)) = "get_" AND len(request.form(item)) > 0 then
			SQL = SQL & "AND "
			'generera kolumnnamnet
			SQL = SQL & right(item,len(item)-4)
			'generera värdet
			SQL = SQL & " " & strLogOp & " '" & strValue & "' "
		end if
	next

RecSet.Open SQL, Conn

If RecSet.EOF Then%>
   <tr>
      <td colspan="3">Det fanns inga träffar</td>
   </tr>
   <tr>
      <td colspan="3"><hr size="1" color="#000000" noshade></td>
   </tr>
<%Else
I=1
Do Until RecSet.EOF

Info = replace(RecSet("info"),Sokordet,"<b>" & Sokordet & "</b>",1,-1,1)
Titel = replace(RecSet("titel"),Sokordet,"<b>" & Sokordet & "</b>",1,-1,1)
Forf = replace(RecSet("forf"),Sokordet,"<b>" & Sokordet & "</b>",1,-1,1)
%>
  <tr> 
    <td colspan="3">
       <table width="100%">
         <tr> 
           <td width="20" rowspan="2" valign="top"><span class="rub"><b><%=I%>.</b></span></td>
           <td><span class="rub"><a href="articel.asp?id=<%=RecSet("id")%>" target="_blank"><%=Titel%></a></span></td>
         </tr>
         <tr> 
           <td><%=Left(Info,200)%><br><font COLOR="#cc6600"><i>Författare: <%=Forf%></i></font></td>
         </tr>
         <tr>
           <td colspan="2">&nbsp;</td>
         </tr>
      </table>
     </td>
   </tr>
<%I=I+1
RecSet.MoveNext
Loop

RecSet.Close
Set RecSet = Nothing
End If

End If%>

</table>

</body>
</html>

<%Conn.Close
Set Conn = Nothing%>
Medlem sedan feb. 200112 078 inlägg
#13
<%Response.Buffer=True

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db/databas.mdb")%>

<html>
<head>
<title>Artikelsök</title>
<link rel="stylesheet" href="stil.css" type="text/css">
<script src="js.js"></script>
</head>

<body>

<table cellspacing="0" cellpadding="0" width="450" border="0" align="center">
   <tr> 
     <form name="sok" method="post" action="index.asp?do=sok" onSubmit="return SokOrd()">
       <td>
           <input type="text" name="sok" size="30" maxlength="30" onChange="java script:while(''+this.value.charAt(0)==' ')this.value=this.value.substring(1,this.value.length);">
             <input type="submit" name="Submit" value="Sök"> 
           <select name="falt">
              <option value="titel" name="falt">Titel
              <option value="forf" name="falt">Författare
              <option value="info" name="falt">Heltext
              <option value="artikeltyp" name="falt">Artikeltyp
              <option value="ref" name="falt">Ref/litteraturfört.
           </select></td>
     </form>
   </tr>
<%If Request.QueryString("do") = "sok" Then%>
  <tr> 
      <td height="14" colspan="3"><hr size="1" color="#000000" noshade></td>
    </tr>
  <tr> 
      <td colspan="3"><b>Sökresultat</b></td>
    </tr>
  <tr> 
      <td height="14" colspan="3"><hr size="1" color="#000000" noshade></td>
    </tr>
<%Falt = Trim(Request.Form("falt"))
Sokordet = Request.Form("sok")
If Sokordet = "" Then
      Response.Redirect "index.asp"
End If

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

SQL = "SELECT * FROM filer WHERE 1=1 "
	
	[red]strValue = request.form("text")
		strValue = replace(strValue,"'","''")
		strValue = replace(strValue,"*","%")
		if instr(strValue,"%") > 0 then
			strLogOp = "LIKE"
		else
			strLogOp = "="
		end if
		
			SQL = SQL & "AND "
			'generera kolumnnamnet
			SQL = SQL & "falt"
			'generera värdet
			SQL = SQL & " " & strLogOp & " '" & strValue & "' "[/red]

RecSet.Open SQL, Conn

If RecSet.EOF Then%>
   <tr>
      <td colspan="3">Det fanns inga träffar</td>
   </tr>
   <tr>
      <td colspan="3"><hr size="1" color="#000000" noshade></td>
   </tr>
<%Else
I=1
Do Until RecSet.EOF

Info = replace(RecSet("info"),Sokordet,"<b>" & Sokordet & "</b>",1,-1,1)
Titel = replace(RecSet("titel"),Sokordet,"<b>" & Sokordet & "</b>",1,-1,1)
Forf = replace(RecSet("forf"),Sokordet,"<b>" & Sokordet & "</b>",1,-1,1)
%>
  <tr> 
    <td colspan="3">
       <table width="100%">
         <tr> 
           <td width="20" rowspan="2" valign="top"><span class="rub"><b><%=I%>.</b></span></td>
           <td><span class="rub"><a href="articel.asp?id=<%=RecSet("id")%>" target="_blank"><%=Titel%></a></span></td>
         </tr>
         <tr> 
           <td><%=Left(Info,200)%><br><font COLOR="#cc6600"><i>Författare: <%=Forf%></i></font></td>
         </tr>
         <tr>
           <td colspan="2"> </td>
         </tr>
      </table>
     </td>
   </tr>
<%I=I+1
RecSet.MoveNext
Loop

RecSet.Close
Set RecSet = Nothing
End If

End If%>

</table>

</body>
</html>

<%Conn.Close
Set Conn = Nothing%>
Medlem sedan dec. 20011 860 inlägg
#14

Jobbigt! :(

Microsoft JET Database Engine fel '80040e10'
Det har inte angetts något värde för en eller flera nödvändiga parametrar

/site/patrikJ/index.asp, rad 74

Medlem sedan feb. 200112 078 inlägg
#15

..och hur ser SQL-satsen ut? Felsök alltid med response.write.

Medlem sedan dec. 20011 860 inlägg
#16

Ska komma ihåg det!

SELECT * FROM filer WHERE 1=1 AND Falt = ''

Alla sökfält är antingen Text eller PM

Så här men det går ej med And :/:

SELECT * FROM filer WHERE 1=1 AND info = 'hanna and den'

SQL = "SELECT * FROM filer WHERE 1=1 "
	
	strValue = request.form("sok")
		strValue = replace(strValue,"'","''")
		strValue = replace(strValue,"*","%")
		if instr(strValue,"%") > 0 then
			strLogOp = "LIKE"
		else
			strLogOp = "="
		end if
		
			SQL = SQL & "AND "
			'generera kolumnnamnet
			SQL = SQL & Falt
			'generera värdet
			SQL = SQL & " " & strLogOp & " '" & strValue & "' "
Medlem sedan aug. 2002207 inlägg
#17

Ta en titt på 4guysfromrolla.com
Om jag inte minns fel så har dom en mycket bra guide till hur man gör en mycket bra sökmotor där :)

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