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...
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:
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();
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.
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.
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.
Kiitoksia!
$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...
Miten et saa toimimaan? Saatko jonkun virheen vai mitä tapahtuu?
Se koodin jatko tuosta. Aina valittaa jotakin, jos jatkan samalla lailla, miten normaalisti eli:
$kysely->execute...
vai miten se nyt menikään
Jatka näin:
$vastaus = $yhteys->query ($kysely);
Korjaa myös tuo tietoturva-aukko, josta jo mainitsin.
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); }
Aihe on jo aika vanha, joten et voi enää vastata siihen.