Ik heb een kolom Kleur in een database. De inhoud ziet er zo uit: bijv. zwart/wit of zwart/wit/rood of rood/wit/zwart of wit/zwart/rood of wit/rood etc.

Nu wil ik dat je met checkboxes kleuren kan selecteren. Dus als je kiest [wit] [zwart] en [rood], dat alle beesten met die kleuren (ongeacht de volgorde in de kolom) tevoorschijn komen.

Weet iemand welke functie je daarvoor kan gebruiken?
Mja, maar als je dan vervolgens @Ger zijn query hanteert, deze zul je elke keer moeten aanpassen op de selectie: het IN(...) deel (wat overeen moet komen met de kleur-id's) en de COUNT() (die overeen moet komen met het aantal geselecteerde kleuren). De complexiteit zit simpelweg op een andere plaats, is toch een beetje lood om oud ijzer.

Ook, als je wat boolse logica kent en kunt (& staat niet ver af van && en die zou, als je met PHP of JavaScript werkt, toch al redelijk vertrouwd moeten zijn) en enigszins kunt tellen in n-tallige stelsels (je bent het 10-tallige stelsel al gewend, de inwoners zijn de cijfers 0 t/m 9) dan staat het binaire stelsel (inwoners 0 en 1) hier ook niet zo ver vanaf. Maar ja, als je geen lijn kunt bespeuren in dit alles dan begrijp ik dat het lastig is. Wanneer je je dit eigen hebt gemaakt en terugkijkt is het eigenlijk meer van hetzelfde maar in een andere verschijningsvorm. In de vorm zit niet de moeilijkheid, want die kende je in zekere zin al.

Je zou "&" ook kunnen zien als een functie die twee argumenten accepteert. Als je begrijpt wat je invoert, en hoe de uitvoer totstand komt, dan snap je ook wat "&" in feite doet. Je zou dit simpelweg kunnen zien als de functionaliteit van &&, die twee booleans (twee bitjes, 0 of 1, false of true) accepteert. Het resultaat hiervan is alleen true (of 1) als beide bits true (1) zijn. Kijk nu nog eens naar deze som:
10110
00110 &
-------
00110

Dit is een simpele rekensom, maar enkel met de cijfers 0 en 1 en een ander wiskundig symbool.
Thomas van den Heuvel

Jawel.

Stel:
zwart = 1
wit = 2
rood = 4
beige = 8

Wat je wilt is zwart + wit + rood = 7.
De kat met zwart + wit + rood + beige = 15.




want 7 = 2<sup>3</sup>2<sup>2</sup>2<sup>1</sup>2<sup>0</sup>
0 1 1 1

15 = 2<sup>3</sup>2<sup>2</sup>2<sup>1</sup>2<sup>0</sup>
1 1 1 1

& ----------------------------------------------------------
0 1 1 1


Thomas van den Heuvel



15 & 7 is nog steeds 7. Oftewel, de selectie zwart + wit + rood levert ook beesten met zwart + wit + rood + whatever op.


Ik heb er een week over gedaan, maar nu snap ik dat 15 ook 7 is.
Alleen nog niet helemaal hoe ik dat kan selecteren, maar misschien komt dat nog

Alleen nog niet helemaal hoe ik dat kan selecteren, maar misschien komt dat nog

Selectboxes kleuren[] maken met als waarde de unieke kleurcode, en dan, als je je zoekformulier submit (gebruikt $_GET, dat werkt doorgaans fijner) kijk je of "kleuren" ($_GET['kleuren'] dus) bestaat en tel je de waarden bij elkaar op met array_sum($_GET['kleuren'). Zoals eerder aangegeven kun je elke kleur uniek identificeren omdat elke kleurcode een waarde heeft die een macht van 2 is (1, 2, 4, 8, 16 etc.).
Nou, het is (deels) gelukt (yeahhh!) :) Ik heb een kolom gemaakt met kleurcodes etc. Alleen wat ik niet begrijp is: waarom de paginatie de kleurcode niet kan onthouden na blz 1. Komt dat omdat het een array is?
De kleurcode wordt wel uitgelezen (opgeteld) uit de url. Ik doe precies hetzelfde als op andere pagina;s maar ik krijg array_sum() expects parameter 1 to be array als ik naar blz 2 (of verder) blader. heelp
Als je zoiets hebt:
<form action="..." method="get">
...
<input type="checkbox" name="kleuren[]" id="kleuren_1" value="1"><label for="kleuren_1">zwart</label>
<input type="checkbox" name="kleuren[]" id="kleuren_2" value="2"><label for="kleuren_2">rood</label>
<input type="checkbox" name="kleuren[]" id="kleuren_4" value="4"><label for="kleuren_4">wit</label>
<input type="checkbox" name="kleuren[]" id="kleuren_8" value="8"><label for="kleuren_8">beige</label>
...
<button type="submit">zoek</button>
</form>

Dan komt dit op de volgende manier in je URL:
zoekscript.php?kleuren[]=1&kleuren[]=4&...

Je moet dan wel zorgen dat je alles op een of andere manier overneemt als er iets is aangevinkt.

Denk eraan dat niet aangevinkte checkboxen in het geheel niet worden verstuurd, je zult dus op het bestaan van $_GET['kleuren'] (of $_POST['kleuren'] als je de POST method gebruikt) moeten controleren.
Allereerst nogmaals dank voor alle moeite die jij (en ook de anderen) nemen om te helpen php te begrijpen.

Stel ik vink grijs en wit aan. (wit= 1 en grijs =2)

Dan is de url van blz 1: kleurcodes.php?Code[]=1&Code[]=2

Maar als ik naar blz. 2 ga, (nog steeds zelfde checkboxes dus) dan is de url: kleurcodes.php?Code=3&page=2

Vraag 1: Ik snap niet waarom hij op blz 1 de ingevoerde codes exact weergeeft als Code[]=1&Code[]=2 in de url maar ze optelt als ik naar pag 2 ga. Want ik stop $Code in de query en de var_dump daarvan is 3 (op blz. 1).

<?php
if(isset($_GET['Code'])) {
$Code = array_sum($_GET['Code']);
var_dump($Code);
?>
Vraag 2:
Hoe krijg ik Code[]=1&Code[]=2 in de url op blz 2 ipv Code=3

Vraag 3:
Waarom blijft mn query eigenlijk leeg op blz 2 bij Code=3? De Code is 3! Ben ik nou gek???

Vragen, vragen vragen ...
Marina janssen op 29/02/2016 23:45:23

Dan is de url van blz 1: kleurcodes.php?Code[]=1&Code[]=2

Maar als ik naar blz. 2 ga, (nog steeds zelfde checkboxes dus) dan is de url: kleurcodes.php?Code=3&page=2

Vraag 1: Ik snap niet waarom hij op blz 1 de ingevoerde codes exact weergeeft als Code[]=1&Code[]=2 in de url maar ze optelt als ik naar pag 2 ga. Want ik stop $Code in de query en de var_dump daarvan is 3 (op blz. 1).
Dat doe je toch echt zelf, want je telt 1 + 2 op met array_sum():

<?php
if(isset($_GET['Code'])) {
	 $Code = array_sum($_GET['Code']);
   var_dump($Code);
?>

Als je toch gaat pagineren, waarom sla je de keuzen van pagina 1 dan niet even op in een sessie voordat je pagina 2 toont?

vraag 1: dat doe je waarschijnlijk zelf op een of andere manier

Als je toch gaat pagineren, waarom sla je de keuzen van pagina 1 dan niet even op in een sessie voordat je pagina 2 toont?

Omdat het een zoekformulier is. Waarbij je een resultaat op deze manier makkelijk kunt bookmarken. Je hebt dan precies alle data die je nodig hebt in je URL. Je hebt dan geen externe hulpstukken in de vorm van een sessie nodig. Deze oplossing is stateless (of iig "self contained").

vraag 2: URL opbouwen / uitschrijven; plak voor elke geselecteerde kleurcode <separator>code[]=<kleurcode> vast aan de querystring. Waarbij <separator> ofwel een ? is, of een & en <kleurcode> de geselecteerde kleurcode, dit kan met een eenvoudig loopje die $_GET['Code'] doorloopt, nadat je hebt gecontroleerd of $_GET['Code'] bestaat.

vraag 3: waarschijnlijk omdat $_GET['Code'] op dat moment geen array meer is. Het resultaat van array_sum($_GET['Code']) levert op dat moment niks op (of liever gezegd NULL, wat mogelijk nog omgezet wordt naar het cijfer 0). Dit produceert tevens een warning. Je zou altijd moeten ontwikkelen met het ingeschakeld zijn van het melden + weergeven van fouten. Zet de bovenstaande code aan het begin van scripts waar je aan ontwikkelt:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
?>

Dan worden dit soort fouten meteen evident.
edit: Alles werkt nu.

Maar ik snap een ding nog niet helemaal mbt het selecteren.
Als ik bijv. rood en wit invul in het formulier en opvraag met select, dan krijg ik alleen de katten die daar exact aan voldoen. Dus de katten die rood/wit zijn en de katten die wit/rood zijn.
Op zich kan ik daar prima mee leven maarrrrr je zei ergens dat de rood/wit/zwarte katten er dan ook uit zouden rollen maar dat gebeurt niet. Dus de vraag is: heb ik iets niet goed begrepen of niet goed uitgevoerd?
dit is mn query
<?php
if(isset($_GET['Code'])) { $Code = array_sum($_GET['Code']);

$sql = "SELECT Nummer FROM katten WHERE Code = $Code";
$records = mysqli_query($conn, $sql);
$rows = mysqli_num_rows($records);
$pages = ceil($rows / $perpage);
$rec = "SELECT Nummer, Naam, Kleur, Geslacht, Vacht, Ras, Bijzonderheden, DATE_FORMAT(Datum,'%d/%m') AS Datum, FROM katten WHERE Code ='$Code' ORDER BY Nummer_id DESC LIMIT $start, $perpage";


$result = mysqli_query($conn, $rec);
etc etc
?>

Reageren