SQL statement where type=*

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Danny von Gaal

Danny von Gaal

30/06/2015 16:19:31
Quote Anchor link
Ik heb een pagina met allemaal gegevens uit een database. Nou heb ik bovenaan die pagina een filter gemaakt met een selectform waar alle unieke waardes van het kolom type uit de database worden weergeven.
Nou is het de bedoeling wanneer iemand een waarde selecteert dat daarna daaronder alle rijen met alleen die waarde worden weergeven. Dat werkt tot nu toe goed:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
 $statement
= "`certificaten` WHERE type='".$_POST['filtertype']."' AND expires >= CURDATE() ORDER BY `expires` ASC"; // SQL Query
?>


Alleen nou heb ik ook <option value="*">Alles</option> toegevoegd aan die selectform. En nu was het mijn idee wanneer dit wordt gekozen dat dan WHERE type = '*' alle types laat zien.
Maar dat werkt niet want hij zoekt naar de waarde * en die staat nergens.

Nou is mijn vraag: is het mogelijk in een SQL statement dat hij alle types laat zien als ik * kies?
Ik kan er wel een if {} else {} omheen bouwen alleen naast dat je op type kan filteren kan je op nog veel meer dingen filteren.
En dan wordt het een massa van if and else terwijl als mijn idee zou werken ik zo klaar was.
 
PHP hulp

PHP hulp

29/03/2024 09:18:50
 
Ward van der Put
Moderator

Ward van der Put

30/06/2015 16:28:38
Quote Anchor link
WHERE type='%'
 
Thomas van den Heuvel

Thomas van den Heuvel

30/06/2015 16:49:11
Quote Anchor link
Of bouw je query dynamisch op en verwijder deze conditie ingeval $_POST['filtertype'] leeg is.

Security: Wel even escapen met de juiste _real_escape_string() functie/methode wanneer deze niet leeg is / je deze invoegt in je query.
 
Danny von Gaal

Danny von Gaal

03/07/2015 12:00:44
Quote Anchor link
Bedankt voor jullie reacties!

@Ward: Ik heb nu * veranderd in %: <option value="%">Alles</option> alleen dat werkt helaas niet. :-(

@Thomas: Hoe zou ik mijn query dynamisch kunnen opbouwen? Klinkt wel goed.
 
Obelix Idefix

Obelix Idefix

03/07/2015 13:05:09
Quote Anchor link
Je kunt toch nagaan welke optie is opgegeven?
Als dat "alles" is, gebruik je de % van Ward of laat het nog makkelijker weg in je query (zoals Thomas aangeeft).
 
Jan de Laet

Jan de Laet

03/07/2015 14:43:13
Quote Anchor link
@Ward: Als je '%' gebruikt in een select, moet dat dan niet met like, bijv. WHERE type like '%'?

@Danny: om je query dynamisch te bouwen zou je iets kunnen doen als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
if ( $_POST['filtertype'] == '%') {
    $sTypeFilter = "type like '%' ";  
} else {
    $sTypeFilter = "type = '" . $_POST['filtertype'] . "' ";

$sSql = "SELECT * FROM certificaten WHERE ' . $sTypeFilter . "AND ...";


(uit de losse pols ingetikt, dus misschien niet helemaal foutloos)
 
Thomas van den Heuvel

Thomas van den Heuvel

03/07/2015 15:19:29
Quote Anchor link
GET is bij zoekfuncties handiger dan POST omdat je dan straffeloos heen en weer kunt navigeren van resultaat naar zoekopdracht zonder die vervelende "wil je deze data opnieuw versturen" boodschap. Daarnaast kun je dan een zoekopdracht knippen en plakken etc.

Alle DATA in je SQL statement zou ge-escaped moeten worden met een _real_escape_string() functie en/of je zou gebruik kunnen maken van whitelists.

Mogelijk kun je uit het volgende voorbeeld wat inspiratie halen:
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
header('Content-Type: text/html; charset=UTF-8');

function
escape($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}


// dummy functie, deze zou vervangen moeten worden door een _real_escape_string() functie
function db_escape($in) {
    return $in;
}

?>

<!DOCTYPE html>
<html>
<head>
<title>dynamic query</title>
<style type="text/css">
body        { font-family: sans-serif; font-size: 10pt; }
label       { display: block; float: left; width: 150px; }
label.radio { display: inline; float: none; padding: 0 5px; }
</style>
</head>

<body>
<?php
// je zou dit nog uit kunnen bouwen met dynamische formulier creatie enzo
$categoryOptions = array(
    '1' => 'one',
    '2' => 'two',
    '3' => 'three',
);

$orderOptions = array(
    'ASC'   => 'ascending',
    'DESC'  => 'descending',
);

?>

<form action="<?php echo escape($_SERVER['PHP_SELF']) ?>" method="get">
    <p>
        <label for="search_text">text</label>
        <input type="text" name="text" id="search_text" value="<?php echo escape(isset($_GET['text']) ? $_GET['text'] : '') ?>" /></p>
    <p>
        <label>category</label>
        <select name="category">
            <option value="">-- any --</option><?php
            foreach ($categoryOptions as $k => $v) {
                $selected = (isset($_GET['category']) && $_GET['category'] == $k ? ' selected="selected"' : '');
                ?>
<option value="<?php echo escape($k) ?>"<?php echo $selected ?>><?php echo escape($v) ?></option><?php
            }
        ?>
</select>
    </p>
    <p>
        <label>order</label><?php
        if (isset($_GET['order']) && isset($orderOptions[$_GET['order']])) {
            $order = $_GET['order'];
        }
else {
            $order = 'DESC';
        }

        foreach ($orderOptions as $k => $v) {
            $id = 'search_order_'.strtolower($k);
            $checked = ($k == $order ? ' checked="checked"' : '');
            ?>
<input type="radio" name="order" id="<?php echo escape($id) ?>" value="<?php echo escape($k) ?>"<?php echo $checked ?> />
            <label class="radio" for="<?php echo escape($id) ?>"><?php echo escape($v) ?></label><?php
        }
    ?>
</p>
    <p>
        <label for="search_expired">expired</label>
        <input type="checkbox" name="expired" id="search_expired" value="1"<?php echo (isset($_GET['expired']) ? ' checked="checked"' : '') ?> />
    </p>
    <p>
        <input type="hidden" name="action" value="search" />
        <button type="submit">search</button>
    </p>
</form>
<?php
if (isset($_GET['action']) && $_GET['action'] == 'search') {
    // *** VALIDEER INPUT ***
    $text = false;
    if (isset($_GET['text']) && trim($_GET['text']) != '') {
        $text = trim($_GET['text']);
    }


    $category = false;
    // vergelijk met een whitelist
    if (isset($_GET['category']) && isset($categoryOptions[$_GET['category']])) {
        $category = $_GET['category'];
    }


    $order = 'DESC'; // kies een zinnige default
    // vergelijk met een whitelist

    if (isset($_GET['order']) && isset($orderOptions[$_GET['order']])) {
        $order = $_GET['order'];
    }


    $expired = false;
    if (!empty($_GET['expired'])) {
        $expired = true;
    }


    // *** BOUW QUERY ***
    $arguments = array();
    if ($text !== false) {
        // escape je DATA altijd, ook als dat niet per se nodig is
        // al is het maar om je DATA delen te markeren

        $arguments[] = "text LIKE '%".db_escape($text)."%'";
    }

    if ($category !== false) {
        // als category niet numeriek is zet je er quotes omheen
        $arguments[] = 'category = '.db_escape($category);
    }

    if ($expired) {
        $arguments[] = 'expires < CURDATE()';
    }
else {
        $arguments[] = 'expires >= CURDATE()';
    }


    $query = 'SELECT * FROM certificaten';
    if (count($arguments)) {
        $query .= ' WHERE '.implode(' AND ', $arguments);
    }

    $query .= ' ORDER BY expires '.db_escape($order);

    // dump query
    ?>
<pre><?php echo escape($query) ?></pre><?php
}
?>

</body>
</html>


EDIT: sorteervolgorde in query ging nog mis
EDIT2: en categorieën, dat krijg je als je iets wijzigt en niet goed test :] fixed
Gewijzigd op 04/07/2015 09:50:07 door Thomas van den Heuvel
 
Danny von Gaal

Danny von Gaal

06/07/2015 14:58:33
Quote Anchor link
Ik heb het idee van @Jan de Laet gekozen en dat werkt voor mij perfect. Bedankt :-)

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
<?php
//Filter Query
if (isset($_POST['filtersubmit'])) {
    
    // Laat alle Filtertypes zien of enkele
    if ($_POST['filtertype'] == '%') {
        $sTypeFilter = "type like '%' ";
    }
else {
        $sTypeFilter = "type='" . $_POST['filtertype'] . "' ";
    }

    
    // Laat alle uitgevers zien of enkele
    if ($_POST['filteruitgever'] == '%') {
        $sUitgeverFilter = "uitgever like '%' ";
    }
else {
        $sUitgeverFilter = "uitgever='" . $_POST['filteruitgever'] . "' ";
    }

    
    $statement = "`certificaten` WHERE " . $sTypeFilter . " AND " . $sUitgeverFilter . "  AND expires >= CURDATE() ORDER BY `expires` ASC"; // SQL Query
    
//Standaard Query

} else {
    $statement = "`certificaten` WHERE verlengd='nee' AND actief='ja' AND expires >= CURDATE() ORDER BY `expires` ASC"; // SQL Query
}
?>
Gewijzigd op 06/07/2015 14:58:49 door Danny von Gaal
 



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.