Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL: Hakukyselyt

Othnos [27.04.2010 15:14:38]

#

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);

?>

Metabolix [27.04.2010 16:17:33]

#

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ä.

Othnos [27.04.2010 18:51:56]

#

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.

trilog [27.04.2010 19:05:53]

#

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.

Vastaus

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

Tietoa sivustosta