Hoi!

Sinds een tijdje ben ik met een webshop bezig en ik ben aan de product filtering toegekomen. Heb een 5 tal filters vanuit een form die ik dan post naar een array. Wat mijn bedoeling is, is dat de SQL op zichzelf ontstaat door de elementen uit de array. Tot nu toe heb ik:

<?php
function product_filter()
{
require_once("dbcontroller.php");
$db_handle = new DBController();

if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$filter = array();
$sort_products = $_POST['Sorteren'];
$price_min = $_POST['MinP'];
$price_max = $_POST['MaxP'];
$length_min = $_POST['MinL'];
$length_max = $_POST['MaxL'];
$height_min = $_POST['MinH'];
$height_max = $_POST['MaxH'];
$weight_min = $_POST['MinW'];
$weight_max = $_POST['MaxW'];

if(isset($_POST['Kleur']))
{
$has_color = $_POST['Kleur'];
$filter[] = "Kleur contains '".$has_color."'";
}

if (isset($_GET['categorie'])) {
$filter[] = "Categorie = '".$_GET['categorie']."' ";
}
if(!empty($price_min_max)) {
$filter[] = "prijs_nieuw between'".$price_min."' and '".$price_max."'";
}
if(!empty($length_min_max)) {
$filter[] = "lengte between '".$length_min."' and '".$length_max."'";
}
if(!empty($height_min_max)) {
$filter[] = "hoogte between '".$height_min."' and '".$height_max."'";
}
if(!empty($weight_min_max)) {
$filter[] = "gewicht between '".$weight_min."' and '".$weight_max."'";
}
if(!empty($contains_color)) {
$filter[] = "kleur contains '".$kleuren."'";
}

if(!empty($sort_products)) {
if ($_POST['Sorteren'] == "Naam oplopend ")
{
$filter[] = "ORDER BY naam ASC";
}
if ($_POST['Sorteren'] == "Naam aflopend ")
{
$filter[] = "ORDER BY naam DESC";
}
if ($_POST['Sorteren'] == "Prijs oplopend ")
{
$filter[] = "ORDER BY prijs_nieuw ASC ";
}
if ($_POST['Sorteren'] == "Prijs aflopend ")
{
$filter[] = "ORDER BY prijs_nieuw DESC ";
}
}
echo "<pre>".print_r($filter,true)."</pre>";
echo "<vr/>";

if (count($filter) > 0) {
$product_array = $db_handle->runQuery('SELECT * FROM producten WHERE IN ("'.implode("AND",$filter).'"');
}
?>

Het probleem is, is dat de array zich niet vult met de filters die aangepast/ingesteld zijn. De array heeft vervolgens 0 items.Wat dien ik aan te passen waardoor de aangepaste filters oom in de array komen en zorgen voor een passend filter?
Dank alvast!


Edit: als ik losse dingen in de array wil zetten om te testen, bijvoorbeeld;
$filter[] = "Test";
$filter[] = "Voor";
$filter[] = "Deze";
$filter[] = "Array";

dan vult de array zich wel!
Donovan - op 08/02/2019 21:09:33
[wat is het probleem met de POST?

- als je heen en weer navigeert tussen zoekformuler en resultaten krijg je waarschuwingen van je browser of je de formulierinformatie opnieuw wilt zenden, voor de goede orde zou je een POST-request altijd in een aparte actie af moeten handelen en iemand daarna direct moeten doorsturen om deze problematiek te voorkomen
- je kunt zoekopdrachten bookmarken met GET, dit kan niet met POST
- GET is transparant, je kunt alles zien in de URL
Rob Doemaarwat op 08/02/2019 23:22:46

Maar nou zie ik nog niet waar ze vandaan komen. In die lap HTML zie ik niks wat op $price_min_max lijkt. En als ze al in je POST zitten zullen je ze toch ergens aan $price_min_max toe moeten kennen. Dat doe je wel voor $price_min en $price_max, maar niet voor $price_min_max.

Het is hetzelfde alsof je dit doet:

die(empty($doe_maar_wat) ? 'niets' : 'iets'); //levert altijd "niets", omdat $doe_maar_wat niet bestaat



Ja ik miste die inderdaad, best stom. Ik gebruik nu overal de _min variant ($price_min bijvoorbeeld, die zijn nooit leeg, range slider is 0 of hoger). Alleen nog leeg :(

Zoals met zoveel vraagstukken: deel dit op in stukken.

Begin met je formulier (A) en de verwerking ervan? Wat zit er in $_POST? Dump dit eens naar het scherm.

Op het moment dat dit klopt ga je verder kijken naar je query (B).

De uitvoer van A is namelijk invoer van B.

Nu kijk je, net zoals in een ander vraagstuk, helemaal aan het eind van de rit wat er gebeurt en constateer je dat er dingen misgaan.

Begin gewoon eens bij het begin en ga hier stap voor stap doorheen.
Ok, ik ben er nu voor een deel. Ik vul de array nu via

$filter[] = " gewicht BETWEEN ".$db_handle->quote($_POST['MinW']) . " AND " . $db_handle->quote($_POST['MaxW']);


Alleen er zit ergens nog een fout waardoor ik geen waarden terug krijg maar een true of false. Notice
: Trying to get property of non-object

$product_array = $db_handle->runQuery('SELECT * FROM producten WHERE 
'.implode("AND",$filter)) or die ("Error ".$product_array->errorno);
en er komt uit 

SELECT * FROM producten WHERE prijs_nieuw BETWEEN 0 AND 200AND lengte BETWEEN 0 AND 200AND hoogte BETWEEN 0 AND 200AND breedte BETWEEN 0 AND 200AND gewicht BETWEEN 0 AND 200AND ORDER BY naam ASC


Ok, grapje ik miste een spatie achter elke AND, plus het sorteren weggehaald. Dan werkt het!

Reageren