Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Hakukriteereistä päänvaivaa

Sivun loppuun

kamppis [10.03.2014 09:30:37]

#

Olisi ongelmia hakusivuston kautta. Minulla on tietokannassa henkilöitä joilla on mm. Ikä, paikkakunta, maakunta ja muuta pientä hakuehtoa. Pystyn kyllä hakea tietoa tietokannoista, mutta hakujen pitäisi toimia niin, että jos esimerkiksi pelkkä ikä on laitettu niin haku tapahtuu iän perusteella. Jos ikä sekä maakunta on valittu niin haku tapahtuu vain niiden perusteella.

Voin tehdä tämän niin, että laitan ehtolauseita joissa tyrmään jokaisen muun hakuehdon ja teen tämän jokaiselle hakupalkille, mutta voitte miettiä miten pitkät lauseet tulee jos vaikka noita hakupalkkeja on 5 tai 6 ja jokaisesta pitäisi tehdä jokaiset valintamahdollisuudet toistensa kanssa. Kuinkahan tälläinen on järkevintä hoitaa? Ideoita?

Grez [10.03.2014 09:39:44]

#

Tuohan on helppo toteuttaa. Eli lisätään hakuehtoihin vain ne valinnat, joihin on laitettu jotain, tai toisin sanoen jätetään rajauksesta kokonaan pois kentät, joita ei ole valittu.

Alla vielä pieni esimerkki. Et maininnut millä kehität, joten tein C#:lla ASP.Net MVC weppiframeworkillä ja Entity Framework ORMilla:

public ActionResult Search(SearchModel form)
{
    var tulos = db.Users.AsQueryable();
    if (form.Ikä.HasValue)
    {
        tulos = tulos.Where(t => t.Ikä == form.Ikä.Value);
    }
    if (!string.IsNullOrWhiteSpace(form.Paikkakunta))
    {
        tulos = tulos.Where(t => t.Paikkakunta == form.Paikkakunta);
    }
    if (!string.IsNullOrWhiteSpace(form.Maakunta))
    {
        tulos = tulos.Where(t => t.Maakunta == form.Maakunta);
    }
    if (!string.IsNullOrWhiteSpace(form.Muutapientä))
    {
        tulos = tulos.Where(t => t.Muutapientä == form.Muutapientä);
    }

    return View(tulos.Take(100).ToArray());
}

Reflektiolla voisi toteuttaa vielä siistimmin että ei tule turhaa toistoa, mutta tuossa nyt periaatteessa tuo idea.

kamppis [10.03.2014 10:34:16]

#

Kiitos! Ja tosiaan, unohtui mainita :D.. PHP:tä käytän. Koitan tuota illalla kotona ja jos jos tulee pulmia niin laitan vaikka koodin palasen tähän jos apua löytyisi tarkemmin. Mutta taisin saada käsityksen mitä ajat takaa!

Lebe80 [10.03.2014 10:52:19]

#

Rakennat hakukyselyn ihan if-ehdoin. Jos hakukysely tehdään MySQL-haulla, niin hakuehdoistahan voi helposti tehdä vaikkapa taulukon, jonka solut lopuksi yhdistetään " AND " -välimerkein.

The Alchemist [10.03.2014 15:24:24]

#

Käyttäisin kylläkin ihan asialle omistettua kirjastoa enkä räpeltäisi käsin. Se on niin nähty.

Esimerkiksi: http://fluentpdo.com/documentation.html

kamppis [11.03.2014 13:17:12]

#

The Alchemist kirjoitti:

Käyttäisin kylläkin ihan asialle omistettua kirjastoa enkä räpeltäisi käsin. Se on niin nähty.

Esimerkiksi: http://fluentpdo.com/documentation.html

Ei tarvinnut kirjastoa. Hoitui sillä, että teki taulukon ja sitten vain kävi läpi jokaisen kohdan, että jos teksti on erisuuri kuin "" niin siihen taulukkoon lisätään vastaava SQL-koodinpätkä. Lopussa sitten implodataan AND termi hakujen keskelle. Toimii loistavasti ja on todella helppo muokata mikäli vaikka yhdessä hakuehdossa on useampia kohtia

The Alchemist [11.03.2014 13:31:26]

#

Niinhän se menee ja juuri sellaista paskaa en haluaisi koodiini joutua laittamaan. Joudut kopioimaan samat turhanpäiväiset rimpsut jokaiseen funktioon, missä on tarvetta rakentaa kyselyt ajonaikaisesti. Tiedän myös, että kopioit rikkinäisen koodinpätkän, joten tekemäsi koodi on ilmeisesti sekin rikki. Onnea matkaan.

feenix [11.03.2014 15:09:44]

#

Onneksi sinun ei tarvitsekaan. Toki käyttämällä loistavaa kirjastoa, jonka linkkasit, joutuisi "räpeltämään käsin" heti jos tarvitseekin or-ehtoa andien sijasta. Sepäs onkin kätevää?

Lebe80 [11.03.2014 15:35:22]

#

Itse kyllä ymmärrän kirjaston käytön, mutten sitä, etteikö sitä ilman tätä pikkujuttua voisi tehdä. Tietenkin AP:n projektihan voi olla maailman suurin projekti, mutta kysymykseen varmaan paras vastaus olisi ne muutaman if-lauseen mukaan rakennettu lopputulos, kun kokemustakaan ei tunnu niin kauheasti olevan.

p99o [11.03.2014 20:09:25]

#

Vaikuttaa siltä että tämä on sama ongelma jota itse mietin

katso: https://www.ohjelmointiputka.net/keskustelu/27584-where-ehdot-syötettyjen-tietojen-mukaan/sivu-1

kamppis [11.03.2014 22:32:42]

#

The Alchemist kirjoitti:

Niinhän se menee ja juuri sellaista paskaa en haluaisi koodiini joutua laittamaan. Joudut kopioimaan samat turhanpäiväiset rimpsut jokaiseen funktioon, missä on tarvetta rakentaa kyselyt ajonaikaisesti. Tiedän myös, että kopioit rikkinäisen koodinpätkän, joten tekemäsi koodi on ilmeisesti sekin rikki. Onnea matkaan.

Mitähän ihmettä nyt höläjät? Koodi toimii loistavasti ja mitään ongelmia ei ole tullut vaikka millaisen hakuhelvetin sille antoi tulikokeeksi.. Koko pätkä vei yhteensä kaikkien valintojen kanssa naurettavan vähän rivejä.

edit: En katsonut linkkiäsi, joten enpä tiedä mitä koodia tarkoitat. Ihmeellinen väitös kuitenkin herran suusta. Eihän mikään koodi yleensäkkään toimi 1:1 oman projektin kanssa ilman pieniä muutoksia, mutta pääidean kun oivaltaa niin se auttaa paljon

Metabolix [11.03.2014 22:54:19]

#

Oletko kokeillut myös tällaista hakusanaa (esim. ikänä tai paikkakuntana):

' OR 1=1 OR ''='

kamppis kirjoitti:

En katsonut linkkiäsi, joten enpä tiedä mitä koodia tarkoitat.

Ja sehän on todella vaikea katsoa – varmaan vaikeampaa kuin tuon tekstin kirjoittaminen? Mielestäni ei ole kovin kohteliasta laittaa samaa kysymystä monelle foorumille, ei varsinkaan ilman, että kertoo, mihin kaikkialle on sen laittanut.

MuroBBS:ssä siis on annettu tällainen vaarallinen ja muutenkin aika ruma koodi:

http://murobbs.plaza.fi/ohjelmointi/1100695-hakukriteereista-paanvaivaa-php-sql.html#post1712851263:

if ($_POST["ika"]!=""){$sql[]="ika='".$_POST["ika"]."'";}
if ($_POST["paikkakunta"]!=""){$sql[]="paikkakunta='".$_POST["paikkakunta"]."'";}
if(isset($sql)){ //tehdään kysely vain jos edes joku hakuehto on annettu
$query="SELECT * FROM henkilöt WHERE ".implode(" AND",$sql);
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta