checkbox en query
Ik wil dat de gebruikers van ons intranet, wanneer ze een klant willen zoeken, kunnen selecteren op welke velden ze willen zoeken.
Dit wil ik doen met behulp van checkboxes:
Code (php)
1
2
3
4
2
3
4
<input type="checkbox" style="background-color:white; border:0px;" id="veld" name="veld" value="debnr" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Debiteurnr.<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld2" name="veld2" value="debnaam" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld2'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Naam<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld3" name="veld3" value="locadres" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld3'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Adres<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld4" name="veld4" value="wplaats" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld4'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Woonplaats<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld2" name="veld2" value="debnaam" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld2'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Naam<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld3" name="veld3" value="locadres" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld3'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Adres<br>
<input type="checkbox" style="background-color:white; border:0px;" id="veld4" name="veld4" value="wplaats" <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if (isset($_POST['veld4'])){ ?>checked<?php }else{ } } else { ?>checked<? } ?>>Woonplaats<br>
Maar nu moet ik mijn query dus ook aanpassen, wat mij niet lukt als er bijv. alleen debiteurnummer en woonplaats is geselecteerd.
Hoe kan ik dit het beste aanpakken?
Ik heb al een query voor wanneer alle velden zijn geselecteerd:
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
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
<?php
if (isset($_POST['veld']) && isset($_POST['veld2']) && isset($_POST['veld3']) && isset($_POST['veld4'])) {
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur1
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur2
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur3
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
?>
if (isset($_POST['veld']) && isset($_POST['veld2']) && isset($_POST['veld3']) && isset($_POST['veld4'])) {
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur1
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur2
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur3
WHERE
debnr LIKE '%".$_POST['trefwoord']."%' OR
debnaam LIKE '%".$_POST['trefwoord']."%' OR
postadres LIKE '%".$_POST['trefwoord']."%' OR
locadres LIKE '%".$_POST['trefwoord']."%' OR
wplaats LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
?>
wij werken met 3 verschillende administraties, omdat we ook onderaannemers hebben, dus vandaar de UNIONS..
Gewijzigd op 01/01/1970 01:00:00 door Wout van der Burg
Allereerst moet je eens gaan kijken naar de namen die je gebruikt voor je checkboxen en je tabellen. Namen als 'veld', 'veld2', etc. zeggen niets over de inhoud van zo'n checkbox. Ditzelfde geldt natuurlijk voor je tabellen die je 'debiteur1' en 'debiteur2' noemt.
In het geval van je checkboxen had je als naam beter een array kunnen gebruiken. Dus bijvoorbeeld 'zoek[]'. Als het formulier gesubmit is, heb je in de array $_POST['zoek'] de beschikking over alle checkboxen die aangevinkt zijn. Aan de hand daarvan kun je je query dan gaan opbouwen.
Wat betreft de naamgeving van je tabellen. Over het algemeen kun je onthouden dat zodra je kolommen of tabellen in een database moet gaan nummeren, dat je datamodel niet klopt. Zo ook in dit geval. Het gevolg is dat je lange ingewikkelde queries krijgt om alle benodigde gegevens te selecteren, in dit geval dus de UNIONS. Beter zou het zijn om gewoon 1 tabel met debiteuren te hebben, waarin je een kolom zet met het type debiteur. Deze typen debiteuren sla je dan op in een aparte tabel.
Maar om terug te komen op je vraag: wat je nu moet doen is je query opknippen in stukken. En telkens, aan de hand van de aangevinkte checkboxen, een deel aan de query toevoegen. Dus iets als:
Code (php)
Maar zoals je al kunt vermoeden, gaat dit een hele lap code worden. Bovendien is het erg lastig om te zorgen dat je query in alle omstandigheden goed gaat werken...
Je moet de checkboxes in een array gooien en deze check uitvoeren:
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
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
<?php
if (count($_POST['veld']) == 1) {
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 2)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 3)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 4)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
?>
if (count($_POST['veld']) == 1) {
// Bouw query op met gekozen zoekveld en trefwoord
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 2)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 3)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
elseif (count($_POST['veld']) == 4)
{
$sql = "SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
UNION
SELECT
debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE
".$_POST['veld'][0]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][1]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][2]." LIKE '%".$_POST['trefwoord']."%' OR
".$_POST['veld'][3]." LIKE '%".$_POST['trefwoord']."%'
ORDER BY debnr";
}
?>
Daarnaast levert dit zoals je zelf wel ziet, een hele lap code op. Om nog maar te zwijgen over de moeite die het je kost als je een gegeven wilt toevoegen. Kijken naar het normaliseren van een datamodel is dan misschien ook geen overbodige luxe. Als is het alleen maar om in volgende projecten rekening mee te houden ;-)
Of kijk eens naar de dynamische query maker van Jelmer. Staat hier in de scriptlib en wetrkt heel mooi.
dit doe ik zo:
Code (php)
en zo:
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
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
<?php
// formeel aangeven hoeveel records er zijn gevonden en met welk trefwoord
if ($_POST['trefwoord'] == '')
{
echo "<p align=\"left\" class=\"afwezig\">Vul uw zoekcriteria in</p>";
}
elseif (count(@$_POST['veld']) == 0)
{
?>
<table width="600" align="center">
<tr>
<td><span class="afwezig"><?php echo "U heeft geen velden geselecteerd"; ?></span>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
elseif( $aantal_records == 1 )
{
?>
<table width="600" align="center">
<tr>
<td><span class="aanwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft 1 resultaat opgeleverd"; ?></span></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
elseif( $aantal_records >= 2 )
{
?>
<table width="600" align="center">
<tr>
<td><span class="aanwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft $aantal_records resultaten opgeleverd"; ?></span></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
elseif ($aantal_records == 0)
{
?>
<table width="600" align="center">
<tr>
<td><span class="afwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft geen resultaten opgeleverd"; ?></span>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
?>
// formeel aangeven hoeveel records er zijn gevonden en met welk trefwoord
if ($_POST['trefwoord'] == '')
{
echo "<p align=\"left\" class=\"afwezig\">Vul uw zoekcriteria in</p>";
}
elseif (count(@$_POST['veld']) == 0)
{
?>
<table width="600" align="center">
<tr>
<td><span class="afwezig"><?php echo "U heeft geen velden geselecteerd"; ?></span>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
elseif( $aantal_records == 1 )
{
?>
<table width="600" align="center">
<tr>
<td><span class="aanwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft 1 resultaat opgeleverd"; ?></span></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
elseif( $aantal_records >= 2 )
{
?>
<table width="600" align="center">
<tr>
<td><span class="aanwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft $aantal_records resultaten opgeleverd"; ?></span></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
elseif ($aantal_records == 0)
{
?>
<table width="600" align="center">
<tr>
<td><span class="afwezig"><?php echo "Uw zoekcriteria '" . $_POST['trefwoord'] ."' heeft geen resultaten opgeleverd"; ?></span>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<?php
}
?>
Normaliseren ligt hier een beetje moeilijk omdat er gewerkt wordt met verschillende ODBC koppelingen vanuit verschillende applicaties.
Toevallig worden debiteuren geexporteerd vanuit een applicatie dmv Navicat, maar ze willen hier dat de administraties apart gehoduen worden.. helaas.. :)
Ik zal eens kijken naar die dynamische querymaker
Gewijzigd op 01/01/1970 01:00:00 door Wout van der Burg
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
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
<?php
function searchlike()
{
global $_POST;
$like = " " . $_POST['veld'][0] . " LIKE '%" . $_POST['trefwoord'] . "%' ";
$i = 1;
while($i < count($_POST['veld']))
{
$like .= " OR " . $_POST['veld'][$i] . " LIKE '%" . $_POST['trefwoord'] . "%' ";
$i++;
}
return $like;
}
$sql = "SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE" . searchlike() .
"UNION
SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE" . searchlike() .
"UNION
SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE" . searchlike() .
"ORDER BY debnr";
?>
function searchlike()
{
global $_POST;
$like = " " . $_POST['veld'][0] . " LIKE '%" . $_POST['trefwoord'] . "%' ";
$i = 1;
while($i < count($_POST['veld']))
{
$like .= " OR " . $_POST['veld'][$i] . " LIKE '%" . $_POST['trefwoord'] . "%' ";
$i++;
}
return $like;
}
$sql = "SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bs
WHERE" . searchlike() .
"UNION
SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_bsu
WHERE" . searchlike() .
"UNION
SELECT debnr, debnaam, postadres, locadres, wplaats
FROM debiteur_ts
WHERE" . searchlike() .
"ORDER BY debnr";
?>
volgens mij dan.. ik snap em nl. een heel klein beetje
MAar hij werkt niet.. :) jammer
Echo de $sql dan eens bij verschillende invoer. Volgens mij moet het namelijk werken. Er kan natuurlijk een (klein) foutje inzitten.
Zoals ik het zo zie zou het inderdaad moeten werken. Mooie oplossing SanThe!