Input controleren van keuzes uit een lijst.
Eerst deed ik alleen de product ID's opslaan in de sessie, dus met checkboxes alleen een ID naar de server sturen. Als je nu op de pagina's bezig bent met bewerken, dan is er geen lijst te zien met de producten die je had geselecteerd.
Ik wil dus graag aan de zijkant een lijst zetten met (de namen van) de producten die in de sessie staan.
Wat is de beste manier om dit te doen? Ik deed dus alleen de ID's gebruiken als input. Zal ik de ID's + productnaam nu als input nemen? Dan deze naam nog controleren met een query of het een geldig ID en naam is (en die bij elkaar horen)?
Nu doe ik ook niet de ID's controleren, dus een verzonnen ongeldig ID als input zal gewoon in de sessie worden gezet. Ik controleer wel of de input numeriek is. Ik heb hier wel vaker over nagedacht, maar ik dacht: bij de query's om een bewerking te doen op de ID's in de sessie kan ik gewoon de niet-bestaande ID's overslaan.
Stel dat meerdere checkboxes worden aangevinkt en ik zou controleren of de ID's in de database voorkomen, dan zou het dus kunnen dat dit 30 queries kost, alleen voor controle. Ik dacht er ook al aan om de lijst waaruit je kunt kiezen in een sessie op te slaan met de mogelijke ID's en namen die op dat moment in de zoekresultaten staan. Maar dan krijg je weer heel grote sessies.
Code (php)
1
2
3
4
2
3
4
<?php
$ids = implode(',',$selection);
$sql = "SELECT id FROM galleries WHERE id IN ($ids)";
?>
$ids = implode(',',$selection);
$sql = "SELECT id FROM galleries WHERE id IN ($ids)";
?>
vervolgens doe je if(count($selection) == mysql_num_rows($result)) om te checken of ze allemaal gevonden zijn.
Maar het belangrijkste:
Als je data in de session bewaart dan gaat dat verouderen. Zeker in een bewerktool waar jij over spreekt.
1) artikel x wordt opgeslagen in de sessie
2) artikel x wordt bewerkt en krijgt een andere omschrijving
3) artikel x wordt met een UPDATE gewijzigd in de database
De data in de sessie is nu verouderd. Hou het makkelijk voor jezelf en haal het gewoon iedere keer uit de database. Je merkt daar niets van.
Oh ja .. grote sessies.. Laat me niet lachen. We hebben gigabytes aan geheugen anno 2014. Totaal geen probleem.
En na je update houd je de sessie (van ID's) dus nog vast.
Pas als je een nieuwe selectie gaat maken, gooi je dat stukje sessie weg.
Ik zou de geselecteerde ID's bijhouden in een aparte tabel in de database en koppelen aan het sessie-id (indien de gebruiker niet is ingelogd) of het userid (indien de gebruiker wel is ingelogd). Je kan dan met een join alle informatie over de geselecteerde producten ophalen.
Database tabel die 2 kolommen heeft, user_id en product_id
De tabel bewaart de geselecteerde producten. Elke rij met het user_id en een bijbehorend product_id is een geselecteerd product.
bijvoorbeeld:
user_id | product_id
123 | 9281
123 | 9249
123 | 9245
etc...
Dan heb ik de database tabel, waar alle producten in staan (product_id, naam, beschrijving).
Ik heb al vaker met JOIN geprobeerd, maar het blijft me verwarrend.
Ik wil nu met een query alle producten ophalen die in de tabel staan van geselecteerde producten (user_id | product_id) en waarvan het user_id 123 is, dan moet weer met het product_id elk product op worden gehaald van de producten tabel, om zo de naam en beschrijving te krijgen.
Ik weet dat dit kan met JOIN, maar ik doe iets verkeerd.