27. oktober 2009 - 09:38Der er
3 kommentarer og 2 løsninger
Udtræk af databasen
Jeg sidder og arbejder med en side, hvor jeg skal have nogle data trukket ud af databasen.
Jeg har lavet et søgefelt, hvor man skal kunne indskrive søgeordet, og så finde den virksomhed, som det ralaterer til.
I datasen har jeg bl. andet en trade og name. Det er disse 2, som man skal kunne søge ud fra.
Lige nu virker det, så søger man f.eks på elartikler kommer der virksomheder op med dette. Men søger man på el, får man ligeledes begrav<b>el</b>sesforretninger op. Endvidere vil den ikke finde noget, når man søger på forretningens name.
Hvad har jeg fået lavet forkert?
if ($search) { $sql = "SELECT * FROM companies WHERE company_index_lvl > 0 AND name OR trade LIKE '%$search%' ORDER BY name"; } elseif ($mode == 'profile') { $sql = "SELECT * FROM companies WHERE id = $company_id LIMIT 1"; } else { $sql = "SELECT * FROM companies WHERE company_index_lvl > 0 ORDER BY name"; }
Du har ikke gjort noget som helst forkert. Men du skal kigge på din SQL-sætning:
$sql = "SELECT * FROM companies WHERE company_index_lvl > 0 AND name OR trade LIKE '%$search%' ORDER BY name";
For det første skal name og trade laves parvis, så du skal ændre det sidste til: $sql = "SELECT * FROM companies WHERE company_index_lvl > 0 AND name LIKE '%$search%' OR trade LIKE '%$search%' ORDER BY name";
Hvorfor finder den så begravelsesforretninger? Fordi din '%$search%' siger det - din søgestreng skal således bare optræde et vilkårligt sted i name eller trade. Du kan evt. overveje, om det kun skal optræde i begyndelsen ('$search'), eller om du skal kræve længere søgestrenge, da 'el' er en meget almindelig kombination af bogstaver i det danske sprog. Desværre hjælper det ikke på dit tilfælde med el.
Du har wild cards på begge sider af din søgestreng. Derfor vil alle records hvor el indgår komme med, så det er vel egentlig ikke en fejl? Hvis den kun skal ramme det præcise ord så skal '%' vel bare væk - eller har jeg misforstået noget?
Du skal sige: "WHERE company_index_lvl > 0 AND name LIKE .... OR company_index_lvl > 0 AND trade LIKE ...." Det er et spoergsmaal om prioriteter hvor AND har hoejere prioritet end OR.
Med hensyn til din searchterm saa kommer det an paa hvad du vil. Ved at saette wildcard % foran og efter $select saa beder du om hvad du faar - begrav el sesforretning indeholder el med nul eller mere bogstaver foran og nul eller mere bogstaver bagved. Hvis du kun vil have ord der begynder med din seachterm saa drop % foran $search.
mrgumble naaede at lave et svar mens jeg skrev mit. Vi siger det samme om searhtermen, men vi er uenige om SQL termen. Jeg lavede en lille test, og paa mit system vil mgumble's sql expression give ENTEN companies med index>0 og navn lig searchtermen ELLER companies med trade lig searchtermen uanset index. Hvis det ikke er det du vil er skemaet:
(index>0 AND searchterm) OR (index>0 AND searchterm). Paranteserne kan du droppe, de er kun tilfoejede for illustration.
Synes godt om
Slettet bruger
27. oktober 2009 - 10:32#5
Mange tak for jeres super gode svar - og hurtige. I mellemtiden sad jeg og kiggede og tænkte og kom også frem til at name og trade skulle laves parvis.
Hvis jeg fjerner % i søgestrengen, vil den ikke vise noget. Så det har jeg beholdt, og forklaringen er jo egentlig ret logisk, Det ikke gode søgeord at bruge ordet "el" eller "it".
Ellers virker det upåklageligt nu, og jeg vil gerne dele pointene mellem de svar jeg har brugt.
Synes godt om
Ny brugerNybegynder
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.