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?

Dank!
Laat je relevante code eens zien.
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.


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.


<?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);
		}
	}
Zou het zo moeten?

<?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)."') ";
?>
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?

<?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.


Ik echo'm nu via


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


[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?>
Ik heb tot nu toe alleen de regel


$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?

Reageren