Terve
Virittelin jonkin sortin hakujärjestelmää, ja törmäsin ongelmaan: Mistä tiedän pitääkö minun lisätä kyselyyn AND-operaattori yhdistämään hakuja?
$kysely_ = "SELECT * FROM testi_1 WHERE "; $kysely_ .= (!empty($tiedot[0])) ? (($anywhere[0] == "on") ? " etunimi LIKE '%{$tiedot[0]}%'" : "etunimi LIKE '{$tiedot[0]}%'") : ""; $kysely_ .= (!empty($tiedot[1])) ? (($anywhere[1] == "on") ? " AND sukunimi LIKE '%{$tiedot[1]}%'" : " AND sukunimi LIKE '{$tiedot[1]}%'") : ""; $kysely_ .= (!empty($tiedot[2])) ? (($anywhere[2] == "on") ? " AND ika LIKE '%{$tiedot[2]}%'" : " AND ika LIKE '{$tiedot[2]}%'") : ""; $kysely_ .= (!empty($tiedot[3])) ? (($anywhere[3] == "on") ? " AND osoite LIKE '%{$tiedot[3]}%'" : " AND osoite LIKE '{$tiedot[3]}%'") : ""; $kysely_ .= (!empty($tiedot[5])) ? (($anywhere[5] == "on") ? " AND postinumero LIKE '%{$tiedot[5]}%'" : " AND postinumero LIKE '{$tiedot[5]}%'") : ""; $kysely_ .= (!empty($tiedot[4])) ? (($anywhere[4] == "on") ? " AND kaupunki LIKE '%{$tiedot[4]}%'" : " AND kaupunki LIKE '{$tiedot[4]}%'") : "";
Tuolta näyttää koodini tällä hetkellä. Ongelma tulee, jos esimerkiksi $tiedot[0] on tyhjä ja haluaa hakea $tiedot[1] sisältämällä hakusanalla: AND-operaattoreita tulee vääriin paikkoihin.
Esimerkkejä tuon tuloksena:
SELECT * FROM testi_1 WHERE etunimi LIKE 'Petri%'
SELECT * FROM testi_1 WHERE etunimi LIKE 'Petri%' AND sukunimi LIKE 'Peltomäki%'
SELECT * FROM testi_1 WHERE AND sukunimi LIKE 'Peltomäki%'
(Muokkaus. Jostain syystä nuo merkit eivät ole kohdakkain...)
Voit kerätä ehdot taulukkoon ja muodostaa kyselyn vasta lopuksi, kun kaikki ehdot on tiedossa. Huom: Jos liität muuttujia kyselyyn tuolla tavalla, olet toivottavasti tarkistanut ne injektion varalta.
Testaamatonta koodia:
$columns = array( 'etunimi', 'sukunimi', 'ika', 'osoite', 'kaupunki', 'postinumero' ); $ehdot = array(); $parametrit = array(); for ($i = 0; $i < 6; ++$i) { if (!empty($tiedot[$i]) && $anywhere[$i] === 'on') { $ehdot[] = "{$columns[$i]} LIKE ?"; $parametrit[] = $tiedot[$i]; } } if (empty($ehdot)) { # Tee jotain järkevää tässä } $kysely = 'SELECT * FROM testi_1 WHERE ' . implode(' AND ', $ehdot); # Vielä pitää bindata parametrit kyselyyn kysymysmerkkien tilalle. # Katso dokumentaatiosta.
Edit: Tulipas samanlainen vastaus kuin Antilla.
Yksi tapa on kerätä kyselyn ehdot taulukkoon, minkä jälkeen SQL-kyselyn loppuosan voi muodostaa join-funktiolla. Tässä on esimerkki asiasta:
<?php $ehdot = array(); // tässä laitetaan taulukkoon kaikki ehdot $ehdot[] = "sukunimi = 'Virtanen'"; $ehdot[] = "ika = 30"; $ehdot[] = "kaupunki = 'Tampere'"; // kysely alkaa näin $alku = "SELECT * FROM taulu WHERE "; // ehdot mukaan, jokaiseen väliin AND $kysely = $alku . join(" AND ", $ehdot); echo $kysely; ?>
Muoks. funktio oli nopeampi...implode ja join tarkoittavat samaa
Kiitos vastauksista. Noilla en ainoastaan korjannut ongelmaa vaan lyhensin koodia huomattavasti. =)
Aihe on jo aika vanha, joten et voi enää vastata siihen.