Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Etsi-toiminto (kaikkia kohtia ei täytetty)

Sivun loppuun

ZuBer [09.08.2011 17:35:15]

#

Moi!

Teen hakutoimintoa. Otetaan esimerkki(tarua) niin on helpompi selittää:

Minulla on tulossa (leikisti) Autosivu, jossa on MySql-tietokantaan merkittynä tietoja autoista(esim. merkki, vuosimalli, väri, rekisterinumero, omistaja...).
Haluan tehdä toiminnon, jolla voi etsiä autoja tietokannasta.

Merkki
[tekstikenttä]

Vuosimalli
[tekstikenttä]

Väri
[tekstikenttä]

Rekisterinumero
[tekstikenttä]

Omistaja
[tekstikenttä]

Kaikkia kenttiä ei ole kuitenkaan pakollista täyttää. Miten saa koodin tajuamaan, mitkä kentät ovat täytettynä ilman, että minun tarvitsee tehdä hirveätä määrää lausekkeita tyyliin:

if ($_POST["merkki"] != "" && $_POST["vuosimalli"] != ""  && $_POST["väri"] != "" plaplapla...

-tossu- [09.08.2011 17:50:06]

#

ZuBer kirjoitti:

Kaikkia kenttiä ei ole kuitenkaan pakollista täyttää. Miten saa koodin tajuamaan, mitkä kentät ovat täytettynä ilman, että minun tarvitsee tehdä hirveätä määrää lausekkeita tyyliin:

$kentat = array ("merkki", "vuosimalli", "vari");
foreach ($kentat as $k) {
	if ($_POST [$k] != "") {
		//kenttä $k ei ole tyhjä
	}

}

ZuBer [09.08.2011 17:58:27]

#

Voiko tuohon heittää nyt suoraan sen kyselyn, missä etsitään nuo kaikki, eli

$etsi = $yhteys->prepare("SELECT * FROM autot WHERE merkki = ? AND vuosimalli = ? AND vari = ?");
$etsi->execute(array($_POST["merkki"], $_POST["vuosimalli"], $_POST["vari"]));
$haku = $etsi->fetch();

Macro [09.08.2011 18:11:49]

#

Voi olla vähän turha hakea erikseen kaikkia, voisit käyttää -tossu-:n koodia SQL-lauseen muodostamiseen.

$kohdat = array();
$kentat = array ("merkki", "vuosimalli", "vari");
foreach ($kentat as $k) {
    if ($_POST [$k] != "") {
        $kohdat[] = $k . " = '" . $_POST[$k] . "'";
    }
}

$kysely = "SELECT * FROM autot WHERE " . join(" AND ", $kohdat);

Tietenkin se edellyttää, että vähintään yksi kohdista on täytetty. Muutoinhan SQL-lause on virheellinen.

-tossu- [09.08.2011 18:14:50]

#

ZuBer kirjoitti:

Voiko tuohon heittää nyt suoraan sen kyselyn, missä etsitään nuo kaikki

Ei voi. Luo sen sijaan sopiva kysely lennosta silmukassa.

$ehdot = array ();
$kentat = array ("merkki", "vuosimalli", "vari");
foreach ($kentat as $k) {
	if ($_POST [$k] != "")
		$ehdot [] = "$k = :$k";
}
$kysely = "SELECT * FROM autot WHERE " . implode (" AND ", $ehdot);

Saat itse lisätä tuohon kyselyn parametrien määrittelemisen. https://www.php.net/manual/en/pdostatement.bindparam.php

En ole testannut ylläolevaa koodia, joten en anna takuita sen toiminnasta.

Edit: Macro ehti lähettää ennen minua lähes samanlaisen koodin. Macron koodissa on kuitenkin mahdollisuus SQL-injektioon.

ZuBer [09.08.2011 18:55:05]

#

Kiitoksia!

ZuBer [10.08.2011 19:41:03]

#

$kohdat = array();
$kentat = array ("merkki", "vuosimalli", "vari");
foreach ($kentat as $k) {
    if ($_POST [$k] != "") {
        $kohdat[] = $k . " = '" . $_POST[$k] . "'";
    }
}

$kysely = "SELECT * FROM autot WHERE " . join(" AND ", $kohdat);

En saa toimimaan. Eikä tällä kielitajulla oikein mitään tajua tuosta sivusta...

Macro [10.08.2011 20:34:20]

#

Miten et saa toimimaan? Saatko jonkun virheen vai mitä tapahtuu?

ZuBer [10.08.2011 20:41:26]

#

Se koodin jatko tuosta. Aina valittaa jotakin, jos jatkan samalla lailla, miten normaalisti eli:

$kysely->execute...

vai miten se nyt menikään

-tossu- [10.08.2011 20:52:02]

#

Jatka näin:

$vastaus = $yhteys->query ($kysely);

Korjaa myös tuo tietoturva-aukko, josta jo mainitsin.

Metabolix [10.08.2011 20:52:19]

#

Voit koota kunnollisen PDO-kyselynkin.

$sarakkeet = array(
  "input" => "sarake",
  "merkki" => "autot.merkki"
);
$ehdot = array();
$arvot = array();
foreach ($_POST as $input => $arvo) {
  if (!isset($sarakkeet[$input]) || $arvo == "") continue;
  $sarake = $sarakkeet[$input];
  $ehdot[] = "{$sarake} = ?";
  $arvot[] = $arvo;
}
if (empty($ehdot)) {
  // Ei ehtoja, haetaan vaikka kaikki.
  $kysely = $pdo->prepare("SELECT * FROM autot");
  $kysely->execute();
} else {
  // Kootaan ehdot, haetaan oikeilla arvoilla.
  $tmp = implode(" AND ", $ehdot);
  $kysely = $pdo->prepare("SELECT * FROM autot WHERE {$tmp}");
  $kysely->execute($arvot);
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta