Door
Donovan -
op 13-04-2019 18:30
gewijzigd op 14-04-2019 17:15
3.382 views
Hoi!
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.
$kleuren = array();
$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?
<?php
$filter_c = " AND Kleuren IN (".implode(", ",$kleuren).") ";
// OF DEZE
$filter_c = " AND Kleuren ".implode(" LIKE ",$kleuren)." ";
// DAN DEZE QUERY
'SELECT * FROM producten WHERE ' . implode("AND",$filter_r) . $filter_c . $filter_s
?>
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.
<?php
$filter_c = " AND Kleuren IN (".implode(", ",$kleuren).") ";
// OF DEZE
$filter_c = " AND Kleuren ".implode(" LIKE ",$kleuren)." ";
// DAN DEZE QUERY
'SELECT * FROM producten WHERE ' . implode("AND",$filter_r) . $filter_c . $filter_s
?>
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.
[size=xsmall]Toevoeging op 14/04/2019 17:16:07:[/size]
- SanThe - op 13/04/2019 22:05:10
`<?php
$filter_c = " AND Kleuren IN ('".implode("', '",$kleuren)."') ";
?>
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?>
$filter_c = " AND Kleuren IN ('".implode("', '",$kleuren)."') ";
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.
Er staat mij iets bij dat een set redelijk kieskeurig is over hoe deze aangesproken wordt. Met quotes, zonder quotes; als je de waarden verkeerd probeert te identificeren worden deze niet opgepikt.
Los daarvan, wellicht is het een beter idee om deze kleuren in een koppeltabel te stoppen ofzo? Met een set "encodeer" je de informatie min of meer in een tabelkolom. Het wordt dan ook lastiger om antwoord te geven op vragen als "hoeveel producten zijn groen" ofzo.
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?