Tervehdys Ohjelmaputkalaiset.
Tämän kertainen ongelmani liittyy MySQL hakukyselyiden WHERE kohtaan. Tarkoituksenani on hakea tietoa formiin täytetyillä ehdoilla, mutta ehdoissa on myös kohta "kaikki", jolloin sitä ei tarvita. Mikä on järkevä tapa toteuttaa kyseiset kohdat?
Oheinen tapa ei liene kovin hyvä?
<?php $ehto1 = $_POST['ehto1']; $ehto2 = $_POST['ehto2']; if($ehto1=='kaikki') { $tieto1 = 'tieto1 LIKE "%"'; } else { $tieto1 = 'tieto1 = '.$ehto1; } if($ehto2=='kaikki') { $tieto2 = 'tieto2 LIKE "%"'; } else { $tieto2 = 'tieto2 = '.$ehto2; } $sql = "SELECT * FROM tiedot WHERE $tieto1 AND $tieto2"; $result = mysql_query($sql); ?>
Optimaalisempaa on laittaa tyhjäksi ehdoksi tarkistus 1 = 1. Vielä parempi vaihtoehto on muodostaa kysely niin, että koko ehtoa ei tule, jos sitä ei tarvita:
<?php $ehdot = array(); $ehdot[] = "sana = 'hei'"; $ehdot[] = "tieto = 'omena'"; $sql = "SELECT * FROM taulu"; if (!empty($ehdot)) { $sql .= " WHERE " . implode(" AND ", $ehdot); }
Muista myös käsitellä syöte ennen kyselyn tekemistä: tarkista, että luvut ovat varmasti lukuja (vaikkapa is_numeric sopii tarkistukseen, ja intval muuttaa tekstin luvuksi), ja aja tekstit mysql_real_escape_string-funktion läpi, jottei käyttäjä voi syöttää haitallista tekstiä.
Kiitos paljon nopeasta vastauksesta. mysql_real_escape_string-funktioon olen törmännyt lukiessani ohjelmointiputkan forumeita ja tarkoituksenani on ollut alkaa sitä käyttämään. Jos tarkastan lukuja niin intval kannattaa tehdä heksalukujen välttämiseksi ja vasta sitten is_numeric? Tällä hetkellä tietokantaa käyttävät vain luotetut henkilöt.
Othnos kirjoitti:
Jos tarkastan lukuja niin intval kannattaa tehdä heksalukujen välttämiseksi ja vasta sitten is_numeric?
intval
riittänee, jos kyseessä on kokonaisluku. Jos tietoa ei voi muuntaa kokonaisluvuksi niin funktio palauttaa 0. Jos haluaa kuitenkin tarkistaa, että tieto on luku niin ensin is_numeric
ja sen jälkeen vasta intval
.
Othnos kirjoitti:
Tällä hetkellä tietokantaa käyttävät vain luotetut henkilöt.
Syöte pitää ehdottomasti tarkistaa joka tapauksessa, sillä luotettu henkilökin voi vahingossa syöttää tietoa virheellisessä muodossa ja tietämättään saada tuhoa aikaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.