Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL-lausekkeiden yhdistäminen

Macro [30.12.2010 19:22:35]

#

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

jlaire [30.12.2010 19:37:06]

#

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.

Antti Laaksonen [30.12.2010 19:37:07]

#

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

Macro [31.12.2010 15:33:21]

#

Kiitos vastauksista. Noilla en ainoastaan korjannut ongelmaa vaan lyhensin koodia huomattavasti. =)

Vastaus

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

Tietoa sivustosta