Probleem met SELECT en IF
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 ?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?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>
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.
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.
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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;
?>
$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;
?>
Morgen verder schrijven want er zijn nog een aantal IF's mogeljk.
Heel erg bedankt, ik had beter vroeger hulp gevraagd.
Graag gedaan ;)
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.
Gewijzigd op 06/06/2016 11:36:30 door Thomas van den Heuvel
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 :-)
Begrijp er niet heel veel van, een beetje wel. Ga me er in verdiepen.
En als je ook nog verschillende veldtypen wilt verwerken krijg je mogelijk zoiets (ter inspiratie).
Vragen? vragen!
Quote:
Repetition is the path to mastery ;)
Het pad is nog heel smal hoor . Maar de aanhouder wint :-)