Avatar billede fixbabe Nybegynder
07. april 2007 - 18:31 Der er 4 kommentarer og
1 løsning

Søge funktion viser alt i databasen

Jeg arbejder lidt på en søge funktion, problemer er nu at uanset hvad jeg søger efter så lister den alt hvad der i databasen uanset om jeg skriver et navn præcist som det står i databasen, jeg har også prøvet at søge på id men da lister den også alt..


$result = mysql_query("
SELECT *
FROM databasen
WHERE id LIKE '%$bookid%'
OR name LIKE '%$demoname%'
OR sang LIKE '%$map%'
OR abc LIKE '%$mod%'
OR date LIKE '%$date%'
");
Avatar billede fixxxer Nybegynder
07. april 2007 - 19:56 #1
Forestil dig følgende SQL statement hvor kun variablen $demoname er udfyldt:

SELECT *
FROM databasen
WHERE id LIKE '%%'
OR name LIKE '%bamses venner%'
OR sang LIKE '%%'
OR abc LIKE '%%'
OR date LIKE '%%'

Felterne id, sang, abc og date vil alle returnere true da wildcardet %% betyder HVAD SOM HELST.
Derfor får du samtlige rækker tilbage.

Måske burde statementen se sådan ud:

SELECT *
FROM databasen
WHERE id LIKE '%%'
AND name LIKE '%bamses venner%'
AND sang LIKE '%%'
AND abc LIKE '%%'
AND date LIKE '%%'

Igen vil id, sang, abc og date være true, men kun rækker der faktisk indeholde ordet bamses venner i feltet name, kommer med i resultatet.
Avatar billede martinbk Nybegynder
07. april 2007 - 22:33 #2
Fixxer's løsning ville nok løse dit problem, dog synes jeg det er utrolig grimt med så mange LIKE paramtere hvis felterne reelt ikke er udfyldt, du bør checke på dit input og konstruere din SQL ud fra det så du får optimeret din søgning, et eksempel:

if (isset($bookid) && !empty($bookid)) {
    $tmpsql[] = "id = '$bookid'";
}
if (isset($demoname) && !empty($demoname)) {
    $tmpsql[] = "name LIKE '%$demoname%'";
}
if (isset($map) && !empty($map)) {
    $tmpsql[] = "sang LIKE '%$map%'";
}
if (isset($mod) && !empty($mod)) {
    $tmpsql[] = "abc LIKE '%$mod%'";
}
if (isset($date) && !empty($date)) {
    $tmpsql[] = "date LIKE '%$date%'";
}

$result = mysql_query("SELECT * FROM databasen WHERE ". implode(' AND ', $tmpsql));


undgå også LIKE hvor det er muligt, jeg ville antage at id er en integer eller lign. derfor kan du må fordel lave en sammenligning istedet for en søgning, date kunne også godt tyde på at være et DATETIME felt eller lign. igen er LIKE langt fra optimalt, men det kræver self. lidt uddybning fra spørgers side at svare på

mvh
Martin
Avatar billede martinbk Nybegynder
08. april 2007 - 20:16 #3
kom du nogensinde videre ?..........
Avatar billede fixbabe Nybegynder
08. april 2007 - 20:24 #4
Ja dog ikke med nogen af jeres løsninger, jeg lavede en dropdown box med de ting jeg ville søge i og begrænsede sådan min søgning da jeg syntes din løsning virker meget indviklet (nok fordi jeg ikke har sat mig så meget ind i den endnu)

$res = mysql_query("SELECT * FROM database WHERE `$type` LIKE '%$input%' AND public=1");

Men i kan jo dele points hvis det var noget
Avatar billede fixbabe Nybegynder
15. april 2007 - 13:41 #5
Nå ikke, så lukker jeg, tak for hjælpen
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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