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ään hakuehtoa!"; } ?>
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 }
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); } ?>
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?
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.
nyt muodostaa hienosti sql-lauseen ja löytää dataa taulusta. koodirivien lukumääräkin väheni kummasti. Kiitos vihjeistä :-)
Aihe on jo aika vanha, joten et voi enää vastata siihen.