2016-05-20 7 views
1

Ich habe unter einem Suchskript, um eine Stichwortsuche in einer Tabellenspalte durchzuführen.Suche ein oder mehrere Schlüsselwörter in mehreren Tabellenfeldern

Seite:

<form name="form_6" method="get" action="results_keywords.asp"> 
<input name="keyword" type="text" placeholder="keyword" size="30"> 
<input id="submit" type="submit" value="search"> 
</form>  

Teil Ergebnisseite:

<% 
Dim rsKeyword__MMColParam 
rsKeyword__MMColParam = "1" 
If (Request.QueryString("keyword") <> "") Then 
    rsKeyword__MMColParam = Request.QueryString("keyword") 
End If 
%> 
<% 
Dim rsKeyword 
Dim rsKeyword_numRows 

Set rsKeyword = Server.CreateObject("ADODB.Recordset") 
rsKeyword.ActiveConnection = MM_cnKeywords_STRING 
rsKeyword.Source = "SELECT * FROM reports WHERE keyword = '" + Replace(rsKeyword__MMColParam, "'", "''") + "' ORDER BY number DESC" 
..... 

Dies funktioniert gut. Nun möchte ich das gleiche GET-Suchfeld ausführen, um in 10 verschiedenen Tabellenspalten zu suchen (keyword01, keyword02, etc.).

Perfekt wäre, wenn das GET-Suchfeld mehrere Schlüsselwörter enthalten könnte, nach denen in den erwähnten 10 verschiedenen Tabellenspalten gesucht wird. Ist das möglich? Jede Hilfe/Anregung wird sehr geschätzt.

Der Wechsel von Access Table zu einer SQL-Datenbank ist nicht möglich.

Antwort

0

Es ist nicht ganz klar, ob Sie nach einem einzelnen Schlüsselwort in mehreren Spalten oder nach allen Schlüsselwörtern in allen Spalten oder nach was suchen möchten. Ich ging mit der einfachsten Option darunter, dh 10 Eingabefelder, wobei das im ersten eingegebene Schlüsselwort mit der ersten Schlüsselwortspalte, das zweite mit der zweiten Spalte usw. übereinstimmt. Ich war mir auch nicht sicher, ob dies der Fall sein sollte eine AND Suche oder eine OR Suche; Ich vermutete Letzteres. (Sie könnten dem Formular ein Feld hinzufügen, damit der Benutzer UND oder ODER auswählen kann.)

Dies könnte für die Verwendung der Querystring zu unhandlich werden. Wenn das passiert, ändern Sie einfach die Methode auf "post" und verwenden Sie Request.Form() anstelle von Request.Querystring().

<form method="get" action="mypage.asp"> 
<p>Enter keyword(s) to search for: 
<% 
For i = 1 to 10 
    Response.Write "<br>Field " & i & ": <input type='text' name='kw" & i & "' size='15'>" 
Next 
%> 
</p> 
<p><input type="submit" value="Search"></p> 
</form> 

<% 
dim i, kw(10), rs, sql 

For i = 1 to 10 
    kw(i) = Request.Querystring("kw" & i) 
    kw(i) = Replace(kw(i),"'","''") '- double up apostrophes 
    '- if this is a form for internal use only, you can stop here. 
    '- Otherwise, try to clean things up a bit. 
    kw(i) = Replace(Replace(kw(i),",",""),";","") '- remove commas and semicolons 
    '- etc. - do whatever you can to ensure the inputs are keywords, not sql statements 
Next 

sql = "SELECT * FROM reports WHERE " 
For i = 1 to 10 
    If kw(i) <> "" Then 
     sql = sql & "(keyword" & Right(100+i,2) & " = '" & kw(i) & "') OR " 
     '- that "Right(...)" business is so that you get keyword01, not keyword1 
    End If 
Next 
sql = Left(sql,Len(sql)-4) '- remove last "OR" 
sql = sql & " ORDER BY number" 
rs = Server.Createobject("ADODB.Recordset") 
rs.ActiveConnection = MM_cnKeywords_STRING 
rs.Source = sql 
... 
%> 
0

Sehen Sie, ob dies hilft.

rsKeyword__MMColParam = "1" 
If (Request.QueryString("keyword") <> "") Then 

'Assuming keywords entered in the search field are separated by a comma. 
'Place keywords in an array 
CDArray = Split(Request.QueryString("keyword") , ",") 

'Get the number of keywords entered to use for the loops 
jMax = ubound(CDArray) 
End If 

'create a variable to store the search criteria 
Dim mysearch 

'Use a real field name, e.g, the record id field to use 
'as a beginning dummy search criteria. 
'Makes the following loops easier to add/manage. 
mysearch = " (afieldname <> '')" 


'Loop through the array for each field you want to search. 
'In this case, 10 fields. 
'Adding the results to the variable. 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname1 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname2 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname3 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname4 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname5 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname6 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname7 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname8 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname9 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname10 LIKE '%" & CDArray(j) & "%')" 
next 

'Now add the completed search variable to the select string 
rsKeyword.Source = "SELECT * FROM reports WHERE" & mysearch & " ORDER BY number DESC" 
0

@Martha Meine Idee ist es, eine (mehr) Keyword-Suche mit einem Eingabefeld mit 10 Tabellenspalten mit max auszuführen. 10 Schlüsselwörter/Bericht.

@Craig Die Verwendung dieses Codes führt zu einem internen Serverfehler. Wo ist mein Fehler?

<% 
Dim rsKeyword__MMColParam 
rsKeyword__MMColParam = "1" 
If (Request.QueryString("Keyword") <> "") Then 
CDArray = Split(Request.QueryString("Keyword") , ",") 
jMax = ubound(CDArray) 
End If 
%> 
<% 
Dim rsKeyword 
Dim rsKeyword_numRows 
Dim mysearch 

mysearch = " (Keyword01 <> '')" 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword01 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword02 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword03 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword04 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword05 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword06 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (fieldname07 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword08 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword09 LIKE '%" & CDArray(j) & "%')" 
next 

for j = 0 to jMax 
mysearch = mysearch & " OR (Keyword10 LIKE '%" & CDArray(j) & "%')" 
next 

Set rsKeyword = Server.CreateObject("ADODB.Recordset") 
rsKeyword.ActiveConnection = MM_cnKeyword_STRING 

rsKeyword.Source = "SELECT * FROM reports WHERE " & mysearch & " ORDER BY number DESC" 
rsKeyword.CursorType = 0 
rsKeyword.CursorLocation = 2 
rsKeyword.LockType = 1 
rsKeyword.Open() 

rsKeyword_numRows = 0 
%>