Avatar billede dj-hupi Nybegynder
02. august 2006 - 10:49 Der er 25 kommentarer og
1 løsning

avanceret SQL søgning

Jeg har en masse forme som jeg gerne vil søge i databasen med:

<table width="150" border="1" cellspacing="2" cellpadding="0">
    <tr>
        <td>Fornavn:</td>
        <td><input type="text" value="" name="firstname"/></td>
    </tr>
    <tr>
        <td>Efternavn:</td>
        <td><input type="text" value="" name="lastname"/></td>
    </tr>
    <tr>
        <td>Adresse:</td>
        <td><input type="text" value="" name="adresse"/></td>
    </tr>
    <tr>
        <td>Postnr:</td>
        <td><input type="text" value="" name="postnr"/></td>
    </tr>
    <tr>
        <td>Land:</td>
        <td><input type="text" value="" name="country"/></td>
    </tr>
    <tr>
        <td>Medlemsnummer:</td>
        <td><input type="text" value="" name="adresse"/></td>
    </tr>
   
</table>

Hvordan laver jeg bedst en SQL streng som passer ind til de argumenter jeg vil søge efter?

Det hele ligger i samme tabel.
Avatar billede michael_stim Ekspert
02. august 2006 - 10:57 #1
Du må definiere hvad brugeren vil søge efter. Det kan gøres i f ex en dropdown box. Ellers skal du have en masse OR.
SELECT * FROM tabel WHERE fornavn LIKE '%søgeterm%' OR efternavn LIKE....osv
Avatar billede nielle Nybegynder
02. august 2006 - 11:19 #2
Jeg holder på LIKE'en, men man skal lige tage højde for at folk ikke nødvendigvis udfylder alle felter.

Havde det været en opgave i PHP havde den været nem, men i ASP er den altså en smule mere besværlig:


sql = "SELECT * FROM dinTabel"

wherePart = ""

Sub AddToWhere(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If wherePart <> "" Then wherePart = wherePart & " OR "
        wherePart = " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

AddToWhere("firstname")
AddToWhere("lastname")
AddToWhere("adresse")
AddToWhere("postnr")
AddToWhere("country")
' AddToWhere("adresse") - er du klar over at du har to felter som hedder "adresse" i din form?

If wherePart <> "" Then    sql = " WHERE " & wherePart

sql = sql & " ORDER BY lastname, forstname"

Response.Write "DEBUG: " & sql
Avatar billede michael_stim Ekspert
02. august 2006 - 11:40 #3
Selvf. skal det være like ;o) Tænkte mere på at det skulle være de enkelte felter der skulle i dropdownen.
SELECT * FROM tabel WHERE &"dd-value"& LIKE '%søgeterm%'
Avatar billede michael_stim Ekspert
02. august 2006 - 11:41 #4
Så blev det forkert &" -> "&
Men i forstår sikkert ;o)
Avatar billede dj-hupi Nybegynder
02. august 2006 - 11:48 #5
Michael, som nielle siger er det ikke sikkert alle felter er fyldt ud
Og højst sandsynligt at de sikker kun søger på 1 ting.

Nielle kan du lave opgave i PHP også ?...

Jeg prøver lige at sætte det på og kigge på det i eftermiddag :)
Avatar billede nielle Nybegynder
02. august 2006 - 12:13 #6
Samme kode i PHP:

$sql = "SELECT * FROM dinTabel"

$wherePartArr = array();

function AddToWhere($key)
{
    if (isset($_POST[$key]) && trim($_POST[$key]) != "")
        $wherePartArr[] = "'%" . trim($_POST[$key]) . "%'";
}

$wherePart = implode(" OR ");
if ($wherePart != "")
    $wherePart = " WHERE $wherePart";

AddToWhere("firstname")
AddToWhere("lastname")
AddToWhere("adresse")
AddToWhere("postnr")
AddToWhere("country")
' AddToWhere("adresse") - er du klar over at du har to felter som hedder "adresse" i din form?

sql = $sql . $wherePart;

sql = sql . " ORDER BY lastname, forstname"

echo "DEBUG: " . sql
Avatar billede nielle Nybegynder
02. august 2006 - 19:40 #7
Fangede et par fejl (ok, en hel del):

$sql = "SELECT * FROM dinTabel";

$wherePartArr = array();

function AddToWhere($key)
{
    if (isset($_POST[$key]) && trim($_POST[$key]) != "")
        $wherePartArr[] = $key . " LIKE '%" . trim($_POST[$key]) . "%'";
}

AddToWhere("firstname")
AddToWhere("lastname")
AddToWhere("adresse")
AddToWhere("postnr")
AddToWhere("country")
' AddToWhere("adresse") - er du klar over at du har to felter som hedder "adresse" i din form?

$wherePart = implode(" OR ", $wherePartArr);
if ($wherePart != "")
    $wherePart = " WHERE $wherePart";

$sql .= $wherePart;
$sql .= " ORDER BY lastname, forstname";

echo "DEBUG: $sql";
Avatar billede dj-hupi Nybegynder
02. august 2006 - 19:46 #8
Okey takker :)

Ja der var lidt i den første ;) ... Kigger på det :)
Avatar billede dj-hupi Nybegynder
02. august 2006 - 20:43 #9
Har lidt problemer med det ... Kan i se jer ud af det?

<FORM METHOD="POST" ACTION="default_search.asp?search=search">
<table width="150" border="1" cellspacing="2" cellpadding="0">
    <tr>
        <td>Fornavn:</td>
        <td><input type="text" value="" name="firstname"/></td>
    </tr>
    <tr>
        <td>Efternavn:</td>
        <td><input type="text" value="" name="lastname"/></td>
    </tr>
    <tr>
        <td>Adresse:</td>
        <td><input type="text" value="" name="adresse"/></td>
    </tr>
    <tr>
        <td>By:</td>
        <td><input type="text" value="" name="city"/></td>
    </tr>
    <tr>
        <td>Postnr:</td>
        <td><input type="text" value="" name="postnr"/></td>
    </tr>
    <tr>
        <td>Land:</td>
        <td><input type="text" value="" name="country"/></td>
    </tr>
    <tr>
        <td>Medlemsnummer:</td>
        <td><input type="text" value="" name="medlemsnr"/></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" name="Submit"></td>
    </tr>
</table>
</form>

<%
If Request.Querystring("search") <> "" then
sql = "SELECT * FROM medlemmer"

wherePart = ""

Sub AddToWhere(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If wherePart <> "" Then wherePart = wherePart & " OR "
        wherePart = " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

AddToWhere("fornavn")
AddToWhere("efternavn")
AddToWhere("adresse1")
AddToWhere("bynavn")
AddToWhere("postnr")
AddToWhere("country")
AddToWhere("medlemnr")

If wherePart <> "" Then    sql = " WHERE godkendt = 1 AND " & wherePart
sql = sql & " ORDER BY efternavn, fornavn"

Response.Write "DEBUG: " & sql

End if

%>
Avatar billede nielle Nybegynder
02. august 2006 - 20:59 #10
Kaldene til AddToWhere(...) skal stemme overens med hvad felterne hedder i din formular.
Avatar billede dj-hupi Nybegynder
02. august 2006 - 21:01 #11
Arrh okey, men hvordan er jeg så sikker på de rammer dem i tabellen ?
Avatar billede dj-hupi Nybegynder
02. august 2006 - 21:02 #12
Skal de være ens i tabellen og formlerne ?
Avatar billede dj-hupi Nybegynder
02. august 2006 - 21:09 #13
Såå tror jeg at jeg fik fat i det ...
Avatar billede nielle Nybegynder
02. august 2006 - 21:10 #14
Vi kan sagtens lave en løsning hvor de kan hedde et navn i dine forms og et andet navn i din database-tabel

Men er der nogen speciel gurnd til at du ønsker at det skal være forskellige navne de to stedet?
Avatar billede dj-hupi Nybegynder
02. august 2006 - 21:14 #15
Nej slet ikke :)
Avatar billede nielle Nybegynder
10. august 2006 - 10:57 #16
Har du fået det til at fungere?
Avatar billede dj-hupi Nybegynder
10. august 2006 - 20:33 #17
Hej Nielle...
Ja det fungere nogenlunde...

Dog driller det hvis jeg sætter flere AND ind :S
If wherePart <> "" Then sql = sql & " WHERE medlemnr <> 0 AND medlemnr <> "" godkendt = 1 AND " & wherePart
sql = sql & " ORDER BY efternavn, fornavn"

Kommer til at blive:

SELECT * FROM medlemmer WHERE medlemnr <> 0 AND medlemnr <> " godkendt = 1 AND landekode LIKE '%DK%' ORDER BY efternavn, fornavn
Avatar billede dj-hupi Nybegynder
10. august 2006 - 20:34 #18
Hjælper heller ikke hvis jeg sætter 2 "" mere ind:

If wherePart <> "" Then sql = sql & " WHERE medlemnr <> 0 AND medlemnr <> """" godkendt = 1 AND " & wherePart
sql = sql & " ORDER BY efternavn, fornavn"
Avatar billede dj-hupi Nybegynder
10. august 2006 - 20:47 #19
Har fixet det :)
Avatar billede dj-hupi Nybegynder
10. august 2006 - 20:47 #20
Kom med et svar ;)
Avatar billede dj-hupi Nybegynder
10. august 2006 - 20:54 #21
Undskyld jeg var lidt for hurtig.

If Request.form("searchperson") <> "" then
sql = "SELECT * FROM medlemmer"

wherePart = ""

Sub AddToWhere(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If wherePart <> "" Then wherePart = wherePart & " OR "
        wherePart = " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

AddToWhere("medlemnr")
AddToWhere("fornavn")
AddToWhere("efternavn")
AddToWhere("adresse1")
AddToWhere("bynavn")
AddToWhere("postnr")
AddToWhere("landekode")

If wherePart <> "" Then sql = sql & " WHERE status > 1 and godkendt = 1 and slettet <> 1 AND " & wherePart
sql = sql & " ORDER BY medlemnr, fornavn, efternavn"
    response.write sql
                    Set rs = conn.Execute(sql)
                        DO WHILE NOT rs.EOF
                       
                        %>
                       
                        <table border="0">
                            <tr>
                                <td><b>Medlems nr:</b> <%=rs("medlemnr")%></td>
                                <td><b>Navn:</b> <%=rs("fornavn")%>&nbsp;<%=rs("efternavn")%></td>
                                <td><b>Adresse:</b> <%=rs("adresse1")%></td>
                                <td><b>Postnr:</b> <%=rs("postnr")%></td>
                                <td><b>Land:</b> <%=rs("landekode")%></td>
                            </tr>
                        </table>
                        <%
                       
                        rs.MoveNext
                            Loop
                           
                        rs.close
End if

Den henter kun et kriterie ud ??
SELECT * FROM medlemmer WHERE status > 1 and godkendt = 1 and slettet <> 1 AND postnr LIKE '%5000%' ORDER BY medlemnr, fornavn, efternavn

Og jeg søgte på postnr = 5000 og efternavn = Jensen
Avatar billede nielle Nybegynder
15. august 2006 - 11:07 #22
Min fejl. Jeg har rettet fejlen, som var i AddToWhere() funktionen - prøv selv at finde den.

Desuden har jeg formateret din kode på en ensartet måde. Det gør underværker for læsevenligheden, og gør det dermed nemmere at undgå fejl, samt at vedligeholde koden sidenhen:

Sub AddToWhere(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If wherePart <> "" Then wherePart = wherePart & " OR "
        wherePart = wherePart & " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

If Request.Form("searchperson") <> "" Then
    sql = "SELECT * FROM medlemmer"

    wherePart = ""
    AddToWhere("medlemnr")
    AddToWhere("fornavn")
    AddToWhere("efternavn")
    AddToWhere("adresse1")
    AddToWhere("bynavn")
    AddToWhere("postnr")
    AddToWhere("landekode")

    If wherePart <> "" Then sql = sql & " WHERE status > 1 AND godkendt = 1 AND slettet <> 1 AND " & wherePart
sql = sql & " ORDER BY medlemnr, fornavn, efternavn"
    Response.Write sql

    Set rs = Conn.Execute(sql)
   
    Do While Not rs.EOF
%>

    <table border="0">
        <tr>
            <td><b>Medlems nr:</b> <%=rs("medlemnr")%></td>
            <td><b>Navn:</b> <%=rs("fornavn")%>&nbsp;<%=rs("efternavn")%></td>
            <td><b>Adresse:</b> <%=rs("adresse1")%></td>
            <td><b>Postnr:</b> <%=rs("postnr")%></td>
            <td><b>Land:</b> <%=rs("landekode")%></td>
        </tr>
    </table>
<%
        rs.MoveNext
    Loop

    rs.close
    Set rs = Nothing
End If
Avatar billede dj-hupi Nybegynder
15. august 2006 - 22:28 #23
Arrh flyttet AddToWhere funktionen.

Tusind tak ..
Avatar billede nielle Nybegynder
15. august 2006 - 22:37 #24
Nej det er ikke kun det ... og flytningen er mere af kosmetisk natur. Fejlen var noget helt andet.

Gammel version:

Sub AddToWhere(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If wherePart <> "" Then wherePart = wherePart & " OR "
        wherePart = " " & key & " LIKE '%" & value & "%'"
    End If
End Sub

Rettet version:

Sub AddToWhere(key)
    value = "" & Request.Form(key)

    If value <> "" Then
        If wherePart <> "" Then wherePart = wherePart & " OR "
        wherePart = wherePart & " " & key & " LIKE '%" & value & "%'"
    End If
End Sub


... og et svar :^)
Avatar billede dj-hupi Nybegynder
15. august 2006 - 22:42 #25
Arrh du henter den ind i variablen igen :)
Avatar billede nielle Nybegynder
15. august 2006 - 22:48 #26
Funktionen AddToWhere() lægger et led til wherePart for hvert felt (key) som er udfyldt.

I den fejlflydte version stod der:

wherePart = " " & key & " LIKE '%" & value & "%'"

- hvilket vil sige at wherePart blev overskrevet med det man nu fandt for den aktuelle værid.

I den rettet version:

wherePart = wherePart & " " & key & " LIKE '%" & value & "%'"

- bliver værdien lagt til i enden af wherePart.

Det der gik galt var altså at man aldrig ville få andet end den *sidste* af værdierne. De andre blev simpethen "smidt væk" undervejs.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester