Ik ben nu al weken aan het zoeken om het volgende probleem op te lossen en het lukt me niet.
Ik heb fout meldingen ingebouwd, echo's en op het web en in handleidingen gezocht.

Ik heb een formulier met 4 keuzevakjes: Land,Maand,Prijs,Logies.
Als men bij alle 4 iets selecteert werkt mijn resultatenpagina.
Echter is er ook de mogelijkheid om het volgende te selecteren:
Bij Land : <option value='Alle'>- Alle Landen
Bij Maan d : <option value='Gans'>Gans het jaar
Bij Prijs: <option value='Iedere'>Iedere prijs
Bij Logies : <option value='Alles'>Alle

Aangezien dat ‘Alle’ ‘Gans’ ‘Iedere’ ‘Alles’ niet in de db staan dacht ik het op te lossen met: if na SELECT
Dat lukt niet voor alle if

Code 19-22 werkt
Code 24-27 werkt niet
Code 29-32 werkt
Code 34-37 werkt niet
Code 39-42 werkt

Wat doe ik fout ?



<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL); 

include('connect.php');

$zoekland=$_POST["LAND"];
$zoekmaand=$_POST["MAAND"];
$zoekprijs=$_POST["PRIJS"];
$zoeklogies=$_POST["LOGIES"];

$Alle='Alle';
$Gans='Gans';
$Iedere='Iedere';
$BHR='BHR';

$sql = "SELECT  LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE ";

if  ($zoekland==$Alle)
{
$sql.=" MAAND ='$zoekmaand' AND PRIJS ='$zoekprijs' AND LOGIES ='$zoeklogies' ";
};

if  ($zoekland==$Alle&&$zoekprijs==$Iedere&&$zoeklogies==$BHR)
{
$sql.=" MAAND ='$zoekmaand' ";
};

if ($zoekmaand==$Gans&&$zoekprijs==$Iedere&&$zoeklogies==$BHR)
{
$sql.= "LAND = '$zoekland' ";
};

if  ($zoekland==$Alle&&$zoekmaand==$Gans)
{
$sql.="  PRIJS ='$zoekprijs' AND LOGIES ='$zoeklogies' ";
};

if  ($zoekland!=$Alle&&$zoekmaand!=$Gans&&$zoekprijs!=$Iedere&&$zoeklogies!=$BHR)
{
$sql.=" LAND='$zoekland' AND MAAND ='$zoekmaand' AND PRIJS ='$zoekprijs' AND LOGIES ='$zoeklogies' ";
};



if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
while($row = $result->fetch_assoc())

{
$land = $row['LAND'];
$maand = $row['MAAND'];
$datum = $row['DATUM'];
$tocht = $row['TOCHT'];
$foto = $row['FOTO'];
$tekst = $row['TEKST'];
$prijs = $row['PRIJS'];
$logies = $row['LOGIES'];
$soort = $row['SOORT'];


$kolom_breedte   =['360'];
$top = 'top';
$info='meer weten ...';
$left='left';
$right='right';
?>
<table cellspacing="15">
 <tbody>
   <tr>
    <td colspan="5" valign="top" ><hr></td>
    </tr>
    <tr>
       <td valign="top"></td>
       <td valign="top"></td>
       <td valign="top" align="left" width="250"><p></p></td>
       <td valign="top" width="100"><p></p></td>
       <td valign="top" width="50"><p></p></td>
	   
	   
     </tr>
     <tr>
<?php
echo"	<td valign=$top>$land</td>
		<td valign=$top><a href='$land.html'>$tocht</a></td>
		<td valign=$top align=$right>$datum</td>
		<td valign=$top align=$left>$maand</td>
		";
echo"	</tr>";
echo"		<tr>";
echo"	<td valign=$top><a href='$land.html'><img src='$foto.JPG' width=200 hight=250 /></a></td>
		<td valign=$top align=$left>$tekst<br><p><a href='$land.html'>$info</a></p></td>
		<td valign=$top align=$right>$prijs Euro</td>
		<td valign=$top align=$left>$soort</td>
		<td valign=$top align=$left>$logies</td>
		";

echo"		</tr>";
}
?>


</tbody></table>
In regels 26 en 36 ontbreekt AND. Omdat $sql in regel 21 al gevuld is, is de query fout.
(regel 21)Dus kan ik op die manier niet met IF werken.
Wat kan ik dan wel doen ?
Ga alle if's langs en echo na elke if de $sql variable om te zien wat erin staat.
Als ik de tweede IF toepas codenr. 19-22 krijg ik dubbele resultaten

SELECT LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE MAAND ='Juli 16' AND PRIJS ='Iedere' AND LOGIES ='BHR'
SELECT LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE MAAND ='Juli 16' AND PRIJS ='Iedere' AND LOGIES ='BHR' MAAND ='Juli 16'
SELECT LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE MAAND ='Juli 16' AND PRIJS ='Iedere' AND LOGIES ='BHR' MAAND ='Juli 16'
SELECT LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE MAAND ='Juli 16' AND PRIJS ='Iedere' AND LOGIES ='BHR' MAAND ='Juli 16'
SELECT LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE MAAND ='Juli 16' AND PRIJS ='Iedere' AND LOGIES ='BHR' MAAND ='Juli 16'

Notice: Fout in query: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'MAAND ='Juli 16'' at line 1 in /var/www/vhosts/aw-netbe/aw-net.be/wwwroot/test/zoeken.php on line 48
Ik weet niet precies wat je wilt, maar probeer dit eens ...

<?php

$sql = "SELECT LAND, MAAND, DATUM, TOCHT, FOTO, TEKST, PRIJS, LOGIES, SOORT FROM `hippotrail` WHERE ";

if ($zoekland==$Alle)
{
$add=" MAAND ='$zoekmaand' AND PRIJS ='$zoekprijs' AND LOGIES ='$zoeklogies' ";
};

if ($zoekland==$Alle&&$zoekprijs==$Iedere&&$zoeklogies==$BHR)
{
$add=" MAAND ='$zoekmaand' ";
};

if ($zoekmaand==$Gans&&$zoekprijs==$Iedere&&$zoeklogies==$BHR)
{
$add=" LAND = '$zoekland' ";
};

if ($zoekland==$Alle&&$zoekmaand==$Gans)
{
$add=" PRIJS ='$zoekprijs' AND LOGIES ='$zoeklogies' ";
};

if ($zoekland!=$Alle&&$zoekmaand!=$Gans&&$zoekprijs!=$Iedere&&$zoeklogies!=$BHR)
{
$add=" LAND='$zoekland' AND MAAND ='$zoekmaand' AND PRIJS ='$zoekprijs' AND LOGIES ='$zoeklogies' ";
};

$sql = $sql.$add;

?>
Dat werkt. Haha. De fout was dus $sql.
Morgen verder schrijven want er zijn nog een aantal IF's mogeljk.
Heel erg bedankt, ik had beter vroeger hulp gevraagd.
Graag gedaan ;)
Een andere strategie was mogelijk handiger geweest.

Voeg alleen een argument aan de query toe indien er een specifieke waarde is ingevuld. Nu ben je alle mogelijke combinaties van of iets mogelijk wel of niet is ingevuld aan het afgaan en dat is niet nodig. Controleer dit gewoon per argument en bouw zo stapsgewijs de query op in plaats van dit proberen in 1x te doen. Dit (de huidige oplossing(srichting)) zorgt ook voor een onoverzichtelijke brei van if-statements.

En als dit een zoekformulier betreft is de GET methode mogelijk handiger dan de POST methode omdat je met GET vrij voor- en achteruit kunt navigeren zonder dat je browser begint te zeuren dat informatie opnieuw verzonden wordt en ook zijn zoekopdrachten dan te bookmarken en door te sturen. Dit zorgt in zijn algemeenheid voor een prettigere zoek-ervaring.
Ja dat klopt. Ik denk dat ik nu een 15 IF nodig heb en ik vrees dat het inderdaad nogal onoverzichtelijk gaat worden. Maar mijn kennis is niet groot genoeg om het anders op te lossen, tenzij je me op het goede spoor wilt zetten :-)

Reageren