Kolom bevat 1 van de checkbox waarde
Ik heb op een pagina een 8 tal checkboxen staan met kleuren. Voor het gemak heb ik die in een array staan om ze gecheckt te houden zodra ze daar in staan.
In een tabel heb ik een set-kolom genaamd 'Kleuren', om 1 of meerdere waardes van die 8 kleuren te selecteren en daar in een rij te plaatsen, die niet afwijken van die 8. Wat ik wil is als bijvoorbeeld "Geel" is geselecteerd, dan wil ik alle rijen die in ieder geval "Geel" hebben als waarde daar. Heb een 2 tal opties geprobeerd.
Code (php)
1
2
3
4
2
3
4
$kleuren = array();
$filter_c = " Kleuren ".implode(" LIKE ",$kleuren)." ";
// OF
$filter_c = " Kleuren IN (".implode(", ",$kleuren).") ";
$filter_c = " Kleuren ".implode(" LIKE ",$kleuren)." ";
// OF
$filter_c = " Kleuren IN (".implode(", ",$kleuren).") ";
Echter krijg ik bij beiden een foutmelding: Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given
Ik heb nog een ander deel van de query erop staan, dat werkt prima, zolang ik maar het deel van de $filter_c eruit laat. Daar ligt het dus niet aan. Hoe kan ik dit het handigst oplossen?
Dank!
Gewijzigd op 14/04/2019 17:15:11 door Donovan -
Ik vermoed een foute query.
- Ariën - op 13/04/2019 18:48:54:
Laat je relevante code eens zien.
Ik vermoed een foute query.
Ik vermoed een foute query.
Das best gek. Zonder het kleuren deel werkt het perfect namelijk. Ik heb hier alleen nog niet $filter_C in de SQL gezet, omdat die dus niet werkt.
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
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
<?php
function product_filter()
{
require_once("dbcontroller.php");
$db_handle = new DBController();
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$filter_r = array();
if(!empty($_POST['kleuren']))
{
$kleuren = array();
foreach ($_POST['kleuren'] as $kleur)
{
$kleuren[] = $kleur;
}
// $filter_c = " Kleuren IN (".implode(", ",$kleuren).") ";
// $filter_c = " Kleuren ".implode(" LIKE ",$kleuren)." ";
}
else {$filter_c = "";}
if(!empty($_GET['categorie']))
{
$filter_r[] = " categorie = '".$_GET['categorie']."' " ;
}
if($_POST['MinP'] > -1) {
$filter_r[] = " prijs_nieuw BETWEEN ".$db_handle->quote($_POST['MinP']) . " AND " . $db_handle->quote($_POST['MaxP'])." ";
}
if($_POST['MinL'] > -1) {
$filter_r[] = " lengte BETWEEN " .$db_handle->quote($_POST['MinL']) . " AND " . $db_handle->quote($_POST['MaxL'])." ";
}
if($_POST['MinH'] > -1) {
$filter_r[] = " hoogte BETWEEN ".$db_handle->quote($_POST['MinH']) . " AND " . $db_handle->quote($_POST['MaxH'])." ";
}
if($_POST['MinB'] > -1) {
$filter_r[] = " breedte BETWEEN ".$db_handle->quote($_POST['MinB']) . " AND " . $db_handle->quote($_POST['MaxB'])." ";
}
if($_POST['MinW'] > -1) {
$filter_r[] = " gewicht BETWEEN ".$db_handle->quote($_POST['MinW']) . " AND " . $db_handle->quote($_POST['MaxW'])." ";
}
if($_POST['Sorteren'] > 0) {
$filter_s;
if ($_POST['Sorteren'] == "1")
{
$filter_s = " ORDER BY naam ASC ";
}
if ($_POST['Sorteren'] == "2")
{
$filter_s = " ORDER BY naam DESC ";
}
if ($_POST['Sorteren'] == "3")
{
$filter_s = " ORDER BY prijs_nieuw ASC ";
}
if ($_POST['Sorteren'] == "4")
{
$filter_s = " ORDER BY prijs_nieuw DESC ";
}
}
if (count($filter_r) > 0)
{
$product_array = $db_handle->runQuery('SELECT * FROM producten WHERE '.implode("AND",$filter_r).$filter_s);
}
}
[/code]
function product_filter()
{
require_once("dbcontroller.php");
$db_handle = new DBController();
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$filter_r = array();
if(!empty($_POST['kleuren']))
{
$kleuren = array();
foreach ($_POST['kleuren'] as $kleur)
{
$kleuren[] = $kleur;
}
// $filter_c = " Kleuren IN (".implode(", ",$kleuren).") ";
// $filter_c = " Kleuren ".implode(" LIKE ",$kleuren)." ";
}
else {$filter_c = "";}
if(!empty($_GET['categorie']))
{
$filter_r[] = " categorie = '".$_GET['categorie']."' " ;
}
if($_POST['MinP'] > -1) {
$filter_r[] = " prijs_nieuw BETWEEN ".$db_handle->quote($_POST['MinP']) . " AND " . $db_handle->quote($_POST['MaxP'])." ";
}
if($_POST['MinL'] > -1) {
$filter_r[] = " lengte BETWEEN " .$db_handle->quote($_POST['MinL']) . " AND " . $db_handle->quote($_POST['MaxL'])." ";
}
if($_POST['MinH'] > -1) {
$filter_r[] = " hoogte BETWEEN ".$db_handle->quote($_POST['MinH']) . " AND " . $db_handle->quote($_POST['MaxH'])." ";
}
if($_POST['MinB'] > -1) {
$filter_r[] = " breedte BETWEEN ".$db_handle->quote($_POST['MinB']) . " AND " . $db_handle->quote($_POST['MaxB'])." ";
}
if($_POST['MinW'] > -1) {
$filter_r[] = " gewicht BETWEEN ".$db_handle->quote($_POST['MinW']) . " AND " . $db_handle->quote($_POST['MaxW'])." ";
}
if($_POST['Sorteren'] > 0) {
$filter_s;
if ($_POST['Sorteren'] == "1")
{
$filter_s = " ORDER BY naam ASC ";
}
if ($_POST['Sorteren'] == "2")
{
$filter_s = " ORDER BY naam DESC ";
}
if ($_POST['Sorteren'] == "3")
{
$filter_s = " ORDER BY prijs_nieuw ASC ";
}
if ($_POST['Sorteren'] == "4")
{
$filter_s = " ORDER BY prijs_nieuw DESC ";
}
}
if (count($filter_r) > 0)
{
$product_array = $db_handle->runQuery('SELECT * FROM producten WHERE '.implode("AND",$filter_r).$filter_s);
}
}
[/code]
Code (php)
Handig is misschien om de query eerst samen te stellen in een variable en die variable te echo'en zodat je kan zien hoe het eruit ziet. Dan hoef je nooit verbaasd te zijn.
Die LIKE gaat sowieso niet werken lijkt mij.
Zouden er geen spaties voor en na de AND moeten staan in die implode? Dump anders de SQL-string eens voordat je de query uitvoert.
Adoptive Solution op 13/04/2019 21:42:55:
Zou het zo moeten?
Handig is misschien om de query eerst samen te stellen in een variable en die variable te echo'en zodat je kan zien hoe het eruit ziet. Dan hoef je nooit verbaasd te zijn.
Code (php)
Handig is misschien om de query eerst samen te stellen in een variable en die variable te echo'en zodat je kan zien hoe het eruit ziet. Dan hoef je nooit verbaasd te zijn.
Ik echo'm nu via
Code (php)
1
2
3
2
3
if(isset($_POST['kleuren'])){ echo "<pre>Kleuren filter ".print_r($kleuren, true)."</pre>";}
echo "----------------------------------------------------------------------------------------------------";
echo "SQL = ".('SELECT * FROM producten WHERE '.implode("AND",$filter_r) . $filter_c . $filter_s);
echo "----------------------------------------------------------------------------------------------------";
echo "SQL = ".('SELECT * FROM producten WHERE '.implode("AND",$filter_r) . $filter_c . $filter_s);
Toevoeging op 14/04/2019 17:16:07:
- SanThe - op 13/04/2019 22:05:10:
`
Die LIKE gaat sowieso niet werken lijkt mij.
Die LIKE gaat sowieso niet werken lijkt mij.
Oke dit geeft in ieder geval geen foutmelding(en). Alleen als ik nu de kleur "groen" aanvink welke ik niet heb, krijg ik nog steeds alle producten te zien?>
en heb voor elk product nu even om te testen 1 kleur ingesteld. Als ik 1 van de opties aan vink dan krijg ik nog steeds alle producten te zien, terwijl maar 1 product het geselecteerde kleurtje bevat.
Los van welke aanpak je ook kiest: misschien is het makkelijk om bij het einde te beginnen, oftewel stel eerst een *werkende* SQL-query op, en werk dan terug naar een dynamische variant hiervan.
Dat, en debug niet-werkende queries eens om te zien wat hier fout aan is. Je bent nu een beetje een "black box" aan het debuggen: het gaat mis, maar je weet niet precies wat er mis gaat en probeert dan maar wat aan te passen. Dat ontwikkelt niet echt handig.
EDIT: ik neem aan dat elk product maar één kleur heeft, afkomstig uit de kolomdefinitie van de set?
Gewijzigd op 27/04/2019 12:33:38 door Thomas van den Heuvel