Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL-hakulauseen muodostaminen

volume [30.09.2010 22:13:20]

#

hei,
olisi taas kysymyksen tynkä:

minulla on kolme kenttää hakulomakkeella ja niillä kolmella kentällä voi määritellä haluamansa hakuehdot kantakyselyyn. kentät ovat: hakusanat, aika ja talo.

ohessa alla on mielestäni soutkuisenoloinen if-koukero, joka päättelee millainen sql-kysely annetuista ehdoista pitää muodostaa. kyselyn muodostamiseen on teillä varmaan fiksumpi tapa kuin esittämäni (mikä kyllä vaikuttaa muodostavan kyselylauseen oikein)?

toivon ajatuksia miten muodostaisin kyselylauseen selkeämmin?

<?php
// Sql -hakulauseen alkurunko tehdään tässä
$merkkijono = "SELECT * FROM kuvat WHERE";

// Liitetään hakusana
if ($_POST['hakusanat']) {
  $merkkijono = "SELECT * FROM kuvat WHERE" . " hakusana LIKE '%$hakusanat%'";
}

// Liitetään hakusana ja ajankohta
if (($_POST['aika'] <> 'Valitse') and ($_POST['hakusanat'])) {
  $merkkijono = "SELECT * FROM kuvat WHERE" . " hakusana LIKE '%$hakusanat%'" . " and aika LIKE '%$aika%'";
}

// Liitetään hakusana, ajankohta ja talo
if (($_POST['aika'] <> 'Valitse') and ($_POST['hakusanat']) and ($_POST['talo'] <> 'Valitse')) {
  $merkkijono = "SELECT * FROM kuvat WHERE" . " hakusana LIKE '%$hakusanat%'" . " and aika LIKE '%$aika%'" . " and talo LIKE '%$talo%'";
}

// Liitetään hakusana ja talo
if (($_POST['hakusanat']) and ($_POST['talo'] <> 'Valitse') and ($_POST['aika'] == 'Valitse')) {
  $merkkijono = "SELECT * FROM kuvat WHERE" . " hakusana LIKE '%$hakusanat%'" . " and talo LIKE '%$talo%'";
}

// Liitetään talo ja ajankohta
if ((!$_POST['hakusanat']) and ($_POST['talo'] <> 'Valitse') and ($_POST['aika'] <> 'Valitse')) {
   $merkkijono = "SELECT * FROM kuvat WHERE" . " talo LIKE '%$talo%'" . " and aika LIKE '%$aika%'";
}

// Liitetään ajankohta
if ((!$_POST['hakusanat']) and ($_POST['talo'] == 'Valitse') and ($_POST['aika'] <> 'Valitse')) {
   $merkkijono = "SELECT * FROM kuvat WHERE" . " aika LIKE '%$aika%'";
}

// Liitetään talo
if ((!$_POST['hakusanat']) and ($_POST['talo'] <> 'Valitse') and ($_POST['aika'] == 'Valitse')) {
   $merkkijono = "SELECT * FROM kuvat WHERE" . " talo LIKE '%$talo%'";
}

// Tässä ei annettu mitään hakuehtoja
if ((!$_POST['hakusanat']) and ($_POST['talo'] == 'Valitse') and ($_POST['aika'] == 'Valitse')) {
   $merkkijono = "Ei annettu yht&auml;&auml;n hakuehtoa!";
}

?>

-tossu- [30.09.2010 22:29:57]

#

volume kirjoitti:

kyselyn muodostamiseen on teillä varmaan fiksumpi tapa kuin esittämäni (mikä kyllä vaikuttaa muodostavan kyselylauseen oikein)?

Kyselyyn liittyviä muuttujia ($hakusanat, $talo jne.) ei ole määritely missään. Oletan, että ne ovat otettu $_POST-taulukosta ja käytetty mysql_real_escape_string-funktion läpi.

En ole kokeillut tätä koodia, mutta sen pitäisi toimia:

<?php
$ehdot = array ();
if ($_POST ['hakusanat']) {
	$ehdot [] = "hakusana LIKE '%" . mysql_real_escape_string ($_POST ['hakusanat']) . "%'";
}

$valinnat = array ("aika", "talo");
foreach ($valinnat as $i) {
	if ($_POST [$i] != "Valitse") {
		$ehdot [] = "$i LIKE '%" . mysql_real_escape_string ($_POST [$i]) . "%'";
	}
}

if (count ($ehdot)) {
	$kysely = "SELECT * FROM kuvat WHERE " . implode (" AND ", $ehdot);
}
else {
	//ei hakuehtoja
}

Grez [30.09.2010 22:30:50]

#

Jah, -tossu- oli inasen nopeempi lähes identtisellä ratkaisulla.

Vaikka tälleen

<?php
	$hakuehdot = array();

	if ($_POST['hakusanat']) $hakuehdot['hakusana']=$_POST['hakusanat'];
	if ($_POST['aika'] != 'Valitse') $hakuehdot['aika']=$_POST['aika'];
	if ($_POST['talo'] != 'Valitse') $hakuehdot['talo']=$_POST['talo'];

	// Sql -hakulauseen alkurunko tehdään tässä
	$sql = "SELECT * FROM kuvat";

	// Lisätään hakuehdot
	if (count($hakuehdot)>0) {
		foreach ($hakuehdot as $key => &$value) {
			$value = "$key LIKE '%" . mysql_real_escape_string($value) . "%'";
		}
		$sql .= ' WHERE ' . implode(' AND ',$hakuehdot);
	}
?>

volume [30.09.2010 22:50:32]

#

Parse error: syntax error, unexpected '&', expecting T_VARIABLE or '$'

anoi Grez koodisi

kohtaan: foreach ($hakuehdot as $key => $&value)

-enpä osaa yhtään tehdä sille mitään?

mielellään muutamalla sanalla mitä koodissa tehdään?

Grez [30.09.2010 23:09:10]

#

Hupsis, luulin jo korjanneeni aiemmin tuohon koodiini tuon kohdan (Eli &$ eikä $& ).. Mutta sekään ei näköjään toimi. No, onneksi en yleensä koodaa PHP:llä, niin ei tarvitse välittää tällaisista hämäryyksistä.. &$:ä ei näköjään voi käyttää Foreachissa jos käytetään arvon lisäksi myös avainta.

Täällä on toimiva versio:
http://grez.info/putka/volume/
(Lähdekoodi: http://grez.info/putka/volume/index.phps )

Siis tarkoitushan tuossa on käydä taulukossa olevat muuttujat läpi ja muodostaa niistä SQL kriteereitä. Eli esim "talo"=>"oma" tulisi muotoon "talo"=>"talo LIKE '%oma%'".

En oikein tiedä miten tuota enemmän muutamalla sanalla kuvailisi. Uskoisin että voisi olla aika palkitsevaa kokeilla itsenäisesti selvittää mitä siinä tapahtuu.

volume [02.10.2010 00:20:40]

#

nyt muodostaa hienosti sql-lauseen ja löytää dataa taulusta. koodirivien lukumääräkin väheni kummasti. Kiitos vihjeistä :-)

Vastaus

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

Tietoa sivustosta