Een vraagje: onderstaande code toont een stuk array en geeft alle elementen uit die array weer. Dat werkt prima.
Maar nu wil ik dat niet alle elementen uit die array getoond worden, maar dat ik een IF-statement kan gebruiken. Voorbeeld: als $row["therapie"] het cijfer 2 bevat, dan...
$row["therapie"] kan 1 tot 120 verschillende elementen bevatten, gescheiden door "," en ik hoef maar op één getal te controleren om dan iets te doen.
Nog beter is mogelijk, dat als je een element in een array niet wilt tonen als je hier doorheen loopt, deze in eerste instantie niet in het array te stoppen. Je kunt beter vantevoren filteren dan achteraf.
Daarbij voorkom je tevens dat je code bezaaid raakt met dit soort magische nummers.
EDIT: Zelfs als je (nu) maar één nummer hebt die apart behandeld moet worden ("mag niet getoond worden"). Wie zegt dat er straks niet meerdere zijn? In het kader van flexibiliteit/uitbreidbaarheid is het misschien het overwegen waard om een eigenschap "tonen" toe te voegen aan de entiteit "therapie". Je hebt dan ook meteen een criterium om te filteren, zodat je daarna je array makkelijk kunt doorlopen.
Thomas, ik heb dat al geprobeerd, maar dat kom ik een fout tegen. Ik heb onderstaande regel al in diverse uitvoeringen geprobeerd en dat zou inderdaad idealer zijn, maar het werkt niet.
<?php
$sql = "SELECT id, member, land, therapie FROM users WHERE land = $keuzeland AND therapie = $keuze_therapie";
?>
$keuze_therapie bevat één getal, maar "therapie" is een array met 1 tot 120 getallen. Het zal toch niet "AND ($row)therapie=" moeten zijn zeker, dan eet ik mijn schoen op. Maar neen, dat kan niet, ik moet eerst explode doen en selecteren. Enfin, daar zit ik mee vast.
Tja SanThe, daar heb ik al opmerkingen over gekregen, maar leden duiden via een keuzeformulier zelf alle therapieën aan en kunnen die later ook zelf wijzigen. de bijhorende getallen worden dan in een array opgeslagen.
Je kunt wel kijken of een waarde in een (kommagescheiden) geserialiseerde string zit, maar die optie is vaak verre van optimaal omdat je hiermee niet (goed) kunt zoeken, niet kunt optimaliseren etc.
De truuk is dat je een passage zoekt in een string, dit doe je met LOCATE.
Stel dat je je "array" hebt: "1,2,5,7" en je wilt kijken of deze waarde hier in zit. Zoeken op simpelweg "2" gaat niet werken omdat dit ook matches met "12" en "20" oplevert. Je moet er dus een komma voor en achter plakken: ",2,". Maar dan - als je in de bovenstaande string "7" zoekt (",7," dus) gaat dit niet werken. Daarom moet je aan deze kolom ook komma's plakken. Je komt dan dus tot de volgende oplossing:
LOCATE retourneert de eerste karakter positie van de eerste parameter als deze voorkomt in de tweede parameter startende vanaf positie 1, of 0 als deze hier niet in voorkomt.
Met CONCAT kun je strings aan elkaar fietsen.
Toegepast op jouw query hierboven wordt dit dus zoiets (er vanuit gaande dat dit een kommagescheiden string is dus):
SELECT id, member, land, therapie
FROM users
WHERE land = $keuzeland
AND LOCATE(CONCAT(',', $keuze_therapie, ','), CONCAT(',', therapie, ',')) > 0