Kolom bevat 1 van de checkbox waarde

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donovan -

Donovan -

13/04/2019 18:30:58
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$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!
Gewijzigd op 14/04/2019 17:15:11 door Donovan -
 
PHP hulp

PHP hulp

19/04/2024 16:00:36
 
- Ariën  -
Beheerder

- Ariën -

13/04/2019 18:48:54
Quote Anchor link
Laat je relevante code eens zien.
Ik vermoed een foute query.
 
Donovan -

Donovan -

13/04/2019 20:23:05
Quote Anchor link
- 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.

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
<?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]
 
Adoptive Solution

Adoptive Solution

13/04/2019 21:42:55
Quote Anchor link
Zou het zo moeten?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?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.
 
- SanThe -

- SanThe -

13/04/2019 22:05:10
Quote Anchor link
`
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$filter_c
= " AND Kleuren IN ('".implode("', '",$kleuren)."') ";
?>

Die LIKE gaat sowieso niet werken lijkt mij.
 
Thomas van den Heuvel

Thomas van den Heuvel

14/04/2019 02:39:07
Quote Anchor link
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.
 
Donovan -

Donovan -

14/04/2019 15:56:04
Quote Anchor link
Adoptive Solution op 13/04/2019 21:42:55:
Zou het zo moeten?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);


Toevoeging op 14/04/2019 17:16:07:

- SanThe - op 13/04/2019 22:05:10:
`
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?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?>
 
Donovan -

Donovan -

26/04/2019 20:13:50
Quote Anchor link
Ik heb tot nu toe alleen de regel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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.
 
Thomas van den Heuvel

Thomas van den Heuvel

26/04/2019 21:48:19
Quote Anchor link
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?
Gewijzigd op 27/04/2019 12:33:38 door Thomas van den Heuvel
 



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.