checkbox en query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wout van der Burg

Wout van der Burg

13/12/2006 10:59:00
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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"
;
  }

?>


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
 
PHP hulp

PHP hulp

19/11/2024 08:28:02
 
Joren de Wit

Joren de Wit

13/12/2006 11:29:00
Quote Anchor link
Een paar opmerkingen op je methode:

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$sql
= "SELECT
             debnr, debnaam, postadres, locadres, wplaats  
        FROM debiteur1
        WHERE"
;

if(isset($_POST['veld']))
{

    $sql .= " debnr LIKE '%".$_POST['trefwoord']."%'";
}

?>


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...
 
Wout van der Burg

Wout van der Burg

13/12/2006 12:30:00
Quote Anchor link
Ik heb em gevonden:
Je moet de checkboxes in een array gooien en deze check uitvoeren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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"
;
  }

?>
 
Joren de Wit

Joren de Wit

13/12/2006 12:49:00
Quote Anchor link
Leuk verzonnen die oplossing! Had ik zelf nog niet aan gedacht. Het enige waar je nog geen rekening mee houdt, is als geen van de checkboxen is ingevuld. Of had je die check al ergens verwerkt?

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 ;-)
 
Klaasjan Boven

Klaasjan Boven

13/12/2006 12:52:00
Quote Anchor link
Of kijk eens naar de dynamische query maker van Jelmer. Staat hier in de scriptlib en wetrkt heel mooi.
 
Wout van der Burg

Wout van der Burg

13/12/2006 13:12:00
Quote Anchor link
Ik kijk inderdaad al ergens of er geen 0 aangevinkt zijn, ook kijk ik of het trefwoord niet leeggelaten wordt en of het aantal records meer dan 0 is
dit doe ik zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php if ($aantal_records >= 1 && count(@$_POST['veld']) >= 1 && $_POST['trefwoord'] != '')
{

// resultaten..
?>

en zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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
 
- SanThe -

- SanThe -

13/12/2006 13:22:00
Quote Anchor link
Volgens mij werkt dit hetzelfde als dat hele lange script met al die elsif()-jes er in.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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";

?>
 
Wout van der Burg

Wout van der Burg

13/12/2006 13:57:00
Quote Anchor link
eh... nee want zo controleer je nl. niet hoeveel velden je aangekruist hebt
volgens mij dan.. ik snap em nl. een heel klein beetje

MAar hij werkt niet.. :) jammer
 
- SanThe -

- SanThe -

13/12/2006 14:02:00
Quote Anchor link
Echo de $sql dan eens bij verschillende invoer. Volgens mij moet het namelijk werken. Er kan natuurlijk een (klein) foutje inzitten.
 
Joren de Wit

Joren de Wit

13/12/2006 16:15:00
Quote Anchor link
Zoals ik het zo zie zou het inderdaad moeten werken. Mooie oplossing SanThe!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.