Filterformulier met meerdere mogelijkheden

Status
Niet open voor verdere reacties.

thapriest

Gebruiker
Lid geworden
28 okt 2009
Berichten
559
Beste,

ik zit met het volgende , ik wilde een ssort zoek/filterformuliertje maken, waarin je kunt selecteren aan welke specificaties een reis moet voldoen, nu heb ik met behulp van een mede forummer, onderstaande al eens gemaakt, en met 3 opties werkte dat goed, echter, er komen twee meer opties in, en nu krijg ik het niet werkend, en denk ik ook dat er misschien een makklijkere manier is om dit te doen.

ik heb dus 5 opties:
-Land
-Klasse
-Verzorging
Soort accommodatie
-Aanbieding ja of nee

Dit heb ik tot dusver:
PHP:
    if (isset($_POST['country']) && isset($_POST['star'])) {
        $query = "SELECT * FROM accomodations WHERE land_id='".$_POST['country']."' AND klasse='".$_POST['star']."' AND active=1  ORDER BY klasse, naam ";
    }
	elseif(isset($_POST['acco']) && isset($_POST['country']) && isset($_POST['star'])) {
		$query = "SELECT * FROM accomodations WHERE accomodatieTypes LIKE '".$_POST['star']."' AND land_id='" .$_POST['country']."'AND klasse='" .$_POST['star']."' AND active=1 ORDER BY klasse, naam";
		}
    elseif (isset($_POST['country'])) {
        $query = "SELECT * FROM accomodations WHERE land_id='".$_POST['country']."' AND active=1 ORDER BY klasse, naam ";
    }
    elseif(isset($_POST['star'])) {
        $query = "SELECT * FROM accomodations WHERE klasse='".$_POST['star']."' AND active=1 ORDER BY klasse, naam ";
    }
	
	elseif(isset($_POST['acco'])) {
		$query = "SELECT * FROM accomodations WHERE accomodatieTypes LIKE '".$_POST['acco']."' ORDER BY klasse, naam";
		}
    else {
        $query = "SELECT * FROM accomodations ORDER BY klasse, naam";
 
    }

HTML
HTML:
<form id="form1" name="form1" method="post" form action="index.php?id=2" >
 	  <table width="235" border="0">
        <tr>
          <td width="77">Bestemming:</td>
          <td width="235">			
		  <select name='country' title="Land">
		            <option value="" selected = "selected" disabled = "disabled" >-- Kies een land --</option>
					<option value='2'>Aruba</option>
					<option value='1'>Bonaire</option>
					<option value='11'>Curacao</option>
					<option value='9'>Jamaica</option>
					<option value='5'>Midden/Zuid Amerika</option>
					<option value='25'>Saba</option>
					<option value='33'>St. Eustatius</option>
					<option value='10'>St. Maarten</option>
					<option value='24'>Suriname</option>				
</select></td>
        </tr>
        <tr>
          <td height="22">Sterren:</td>
          <td><select name='star' title="Aantal sterren" >
					<option value="" selected = "selected" disabled = "disabled" >-- Sterren --</option>
					<option value='2.5'>2.5</option>
					<option value='3.0'>3.0</option>
					<option value='3.5'>3.5</option>
					<option value='4.0'>4.0</option>
					<option value='4.5'>4.5</option>
					<option value='5.0'>5.0</option>				 
					</select>		  
		  </td>
        </tr>
      
	  <td height="22">Aanbieding:</td>
       <td><select name="aanbieding" id="aanbieding">
			<option value="">Aleen aanbiedingen?</option>
            <option value="">Nee</option>
            <option value="Ja">Ja</option>
			</select></td>
			</tr>
			
			      <tr>
          <td height="22">Accomodatie:</td>
          <td><select name='acco' title="Soort Accomodatie" >
					<option value="" selected = "selected" disabled = "disabled" >-- Soort --</option>
					<option value='%1%'>Hotel</option>
					<option value='%2%'>Appartement / bungalow / villa</option>
					<option value='%3%'>Kleinschalig</option>
					<option value='%4%'>Luxe</option>
									 
					</select>		  
		  </td>
        </tr>
			
			
			      <tr>
          <td height="22">Verzorging:</td>
          <td><select name='verzorging' title="Soort Verzorging" >
					<option value="" selected = "selected" disabled = "disabled" >-- Verzorging --</option>
					<option value='%1%'>Strandvakantie</option>
					<option value='%2%'>Duikreis</option>
					<option value='%3%'>Trouw-/Huwelijksreis</option>
					<option value='%4%'>Actieve/Avontuurlijke reis</option>
					<option value='%5%'>All-inclusive</option>
					<option value='%6%'>Rondreis</option>				 
					</select>		  
		  </td>
        </tr>
		
			</table>	  <input type="submit" name="zoekland" id="search" value="Zoek" /> 
 </form>

Iemand een suggestie, hoe ik dit het beste op kan pakken?
 
Nu heb ik een ena nder ff uitgebreid met een aantal elseif's erbij, echter als ik even snel reken kom ik op zo'n 32 mogelijkheden om te combineren.
Nu ben ik geen PHP wizz, of wat dan ook, maar iets zegt me dat dit een mega constructie wordt, die snelheid niet ten goede komt...Is er een andere mogelijkheid
 
Snelheid is geen issue, maar het komt vooral de leesbaarheid niet ten goede.

De truc is om je query dynamisch op te bouwen. In plaats van elke combinatie apart uit te schrijven, controleer je elk van de condities en neem je alleen degene op die er toe doen. Een voorbeeld:

PHP:
$basequery = "SELECT * FROM table WHERE ";
$wheres = array();

if ( $conditie1 ) {
  $wheres[] = "naam = '" . $var1 . "'";
}
if ( $conditie2 ) {
  $wheres[] = "land = '" . $var2 . "'";
}
if ( $conditie3 ) {
  $wheres[] = "dorp ='" . $var3 . "'";
}

if ( count( $wheres ) == 0 ) {
  // geen where; alles tonen
  $where = "1";
}
else {
  // wel een where, opbouwen
  $where = implode( " AND ", $wheres );
}

$query = $basequery . $where;
// uitvoeren.

Nu wordt de query opgebouwd aan de hand van de wel of niet bestaande condities. Snap je het idee?
 
Grotendeels, maar niet helemaal, die $conditie, waar en waarom zet ik die?
En hoe maak ik hier de gehele query af, wanneer je optie 1,3 en 5 bijv. combineeert?

Dank je iig alvast voor je uitgebriede voorbeeld hierboven;)
 
ben inmiddels achter die conditie, stom stom van me:P

Maar krijg hem niet helemaal werkend, want ik heb nu dit:

PHP:
//Basis query
$basequery = "SELECT * FROM accomodations WHERE";
$wheres = array();

if (isset($_POST['country'] )) {
	$wheres[] = "naam ='".$_POST['country']."'" ;
	}
if (isset($_POST['star'] ) ) {
	$wheres[] = "klasse ='".$_POST['star']."'" ;
	}	
if (isset($_POST['aanbieding'] ) ) {
	$wheres[] = "offer_price ='".$_POST['aanbieding']."'" ;
	}
if (isset($_POST['acco'] )) {
	$wheres[] = "accomodatieTypes ='".$_POST['acco']."'" ;
	}
if (isset($_POST['verzorging'] ) ) {
	$wheres[] = "reisSoorten ='".$_POST['verzorging']."'" ;
	}
if ( count( $wheres ) == 0 ) {
  // geen where; alles tonen
    $where = "1";
	}
echo $wheres;
//Wel een where
$where= implode("AND",  $wheres);

$query = $basequery . $where;
   	
		    
        // hier beginnen met lijst te declareren
    $lijst = NULL;
    // hier de query dus uitvoeren
    $result = mysql_query($query) or die(mysql_error());

maar krijg bijvoor beeld dit als foutmelding:check the manual that corresponds to your MySQL server version for the right syntax to use near '='1'ANDoffer_price =''' at line 1.

Nu vermoed ik dat dat met de implodes te maken heeft, maar hoe het exact op te lezen weet ik niet.
 
Je moet bij het imploden zorgen dat je spaties toevoegd rondom je AND. Wat er nu gebeurd is dit:

[sql]
SELECT *
FROM table
WHERE naam=1ANDopdracht = 2
[/sql]

Das geen geldige SQL.

Om het op te lossen kun je imploden met spaties, zodat je AND netjes in de query terecht komt:

PHP:
$where =  implode( " AND ", $wheres );
 
Vergeet trouwens de "else" niet, want anders wordt je query niet goed opgebouwd met 0 condities omdat hij de WHERE 1 die je gemaakt hebt weer overschrijft met een lege string :)
 
Hmm, die verandering klopt inderdaad, dank je, echter hij werkt nog niet:(

ik heb nu:
PHP:
//Basis query
$basequery = "SELECT * FROM accomodations";
$wheres = array();

if (isset($_POST['country'] )) {
	$wheres[] = "land_id='".$_POST['country']."'" ;
	}
if (isset($_POST['star'] )) {
	$wheres[] = "klasse='".$_POST['star']."'" ;
	}	
if (isset($_POST['aanbieding'] ) ) {
	$wheres[] = "offer_price='".$_POST['aanbieding']."'" ;
	}
if (isset($_POST['acco'] )) {
	$wheres[] = "accomodatieTypes='".$_POST['acco']."'" ;
	}
if (isset($_POST['verzorging'] ) ) {
	$wheres[] = "reisSoorten='".$_POST['verzorging']."'" ;
	}
if ( count( $wheres ) == 0 ) {
  // geen where; alles tonen
    $where ="1";
	}

//Wel een where
else{
$where= implode(" AND ",  $wheres);
}
$query = $basequery.$where;
          //voer uit	
		    
        // hier beginnen met lijst te declareren
    $lijst = NULL;
    // hier de query dus uitvoeren
    $result = mysql_query($query) or die(mysql_error());

en de foutmelding is dan: check the manual that corresponds to your MySQL server version for the right syntax to use near ''25' AND offer_price=''' at line 1

notice de " voor de = ik heb geen idee waar die wegkomt, maar dat gaat er fout.
 
coreectie, hij werkt wel, ik had niet alle spaties goed staan....
Hoe weet ik trouwens wanneer ik wel/geen spatie gebruik? is daar een vuistregel voor?

Wederom hartelijk dank Frats...
 
Niet echt, binnen SQL zijn daar wel regels maar echt duidelijk zijn ze niet. Het beste kun je vaak de regel "beter een teveel dan een te weinig" aanhouden, want PHP en SQL doen niet moeilijk over een extra spatie (behalve in een string) maar verder ligt het vooral aan de syntax.
 
Hmm ok, dan gaan we die regel voortaan maar toepassen;)

Bedankt voor je hulp, ben weer een mooieind op weg:)
 
Toch nog even een vraagje:

Bovenstaande script werkt uitermate goed en snel, maar het kan natuurlijk voorkomen dat een bepaalde zoekactie geen resultaten heeft.

nu wil ik daar graag een tekstje laten verschijnen met geen resultaten gevonden o.i.d?

Echter hoe zet ik dat?
 
Je kunt met mysql_num_rows() aan een resource vragen hoeveel rijen deze heeft; je kunt met een IF zorgen dat het antwoord 0 afgesplitst wordt en een bericht toont, en dat de rest verder gaan met je huidige script.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan