zie je dat dit een 'admin' menu moet gaan worden.
Ik haal uit de SQL een lijst met producten straks.
Die worden zoals je ziet ook goed weergegeven met een checkbox.
zoals je ziet bij verwijderen nog niks ingevuld want ik weet niet hoe ik dit moet aanpakken. Hoe kan ik nu precies kijken welke is gekozen en vervolgens die verwijderen? de checkboxen krijgen steeds de naam van het id nummer waaronder de productnaam staat. Dus checkbox nummer een heet ook '1' en nummer twee heet '2' letterlijk.
Dus als iemand een checkbox aanvinkt, dan moet die rij verwijderd worden, mits mogelijk dat als je bijvoorbeeld 2 verwijderd, 3 tot en met de rest een plaatsje opschijft zodat het netjes aansluit in de SQL als 1,2,3,4,5 en niet als 1,3,4,5 mits dat kan natuurlijk.
Ik heb ook even (voor mijn doen) een beetje alles netter gedaan voormezelf, anders word ik horendol. Ik heb op je weergaven pagina van 'mysql_fetch_object', 'mysql_fetch_array' gemaakt.
Verder wat wijzigingen bij de info van je checkboxes want die zijn nodig voor als je ze wilt verwijderen uiteraard.
Op je actie pagina heb ik even $_SERVER['REQUEST_METHOD'] == 'POST' toegevoegd, altijd handig. Verder zie je dat ik eerst het aantal gevinkte checkboxes tel, vervolgens gooi je die door een FOR loop heen en verwijderd hij ze.
Maak eerst een back-up van je oude pagina's.
Deze code's heb ik niet getest, als die foutmeldingen geef moet je het maar zeggen of een PM sturen.
Het wordt weergegeven in een 'drop down menu'.
Is het mogelijk om de keuze van de admin op te slaan in bijvoorbeeld een sessie en dan in het externe .php bestand aan te roepen zodat ik de gekozen tabel in de SQL kan verwijderen?
Wat ik altijd doe bij mijn CMS systemen is een onderscheid maken tussen 'Product Toevoegen' en 'Product Overzicht'. In het eerste deel kan de beheerder vanzelfsprekend een nieuw product toevoegen aan zijn systeem. De reden dat ik dit op een aparte pagina zet is dat de formulieren om een product toe te voegen vaak nogal uit de hand kunnen lopen met het aantal opties. Het gaat dus niet alleen om de naam maar misschien ook om gelijk plaatjes te uploaden (van bijvoorbeeld zoiets als die header-image op je andere site).
In mijn product overzicht zet ik alle producten neer met een maximum van 30 per pagina ofzo. Hiervoor heb ik een kleine functie geschreven die voor mij dan het << vorige - 2 - 3 - volgende >> genereerd zoals je dat ook kent van andere site. Dit soort functies/classes zijn hier op de site ook te vinden en zijn eenvoudig toe te passen als je het een beetje kent.
Ik zou je ook willen adviseren om af te stappen van het werken met een iframe en over te gaan op een systeem met includes. Op die manier wordt het beheren van de pagina, in mijn ogen, makkelijker en hoef je ook niet telkens op elke individuele pagina een verbinding te maken met je MySQL database en de nodige functies te includen. Deze erft hij met het include-systeem al van de pagina die erboven ligt.
Ik zal nu even verder gaan op het verhaal wat je hebt geplaatst in de topic-start.
Citaat:
zoals je ziet bij verwijderen nog niks ingevuld want ik weet niet hoe ik dit moet aanpakken. Hoe kan ik nu precies kijken welke is gekozen en vervolgens die verwijderen? de checkboxen krijgen steeds de naam van het id nummer waaronder de productnaam staat. Dus checkbox nummer een heet ook '1' en nummer twee heet '2' letterlijk.
Dus als iemand een checkbox aanvinkt, dan moet die rij verwijderd worden, mits mogelijk dat als je bijvoorbeeld 2 verwijderd, 3 tot en met de rest een plaatsje opschijft zodat het netjes aansluit in de SQL als 1,2,3,4,5 en niet als 1,3,4,5 mits dat kan natuurlijk.
Klassieke fout van iemand die wil dat alles netjes aansluit. Je moet proberen bij een database systeem zo min mogelijk producten te verwijderen. Ik geef even een klein voorbeeld waarom.
Je beheert een webwinkel met daarin 200 producten die jouw bedrijfje verkoopt. Het gaat hier om kantoor-artikelen en je aanbod van artikelen is afgestemd op waar je je handen op kan leggen om te verkopen. Je begint met het opzetten van de webwinkel en verkoopt een Bureaustoel voor 50 euro. Je hebt er 100 van besteld en binnen een week zijn ze alle 100 verkocht. In je database had je opgegeven dat de prijs voor je stoel 50.00 euro was.
De facturen die je nu in je database hebt staan zijn waarschijnlijk opgebouwd uit meerdere lijnen die aangeven welk product een bepaalde klant heeft gekocht en misschien zelfs (als je slim bent) wat de prijs per product was toen de klant hem kocht.
-- Dit is slim om te doen om te voorkomen dat je facturen niet
-- meer kloppen wanneer je de prijs van een product veranderd.
Omdat het product op dit moment echter niet meer aanwezig is in de database kan hij de huidige prijs niet opvragen en ook niet de naam van het product. De factuur is op dit moment dus waardeloos geworden.
Citaat:
Dus als iemand een checkbox aanvinkt, dan moet die rij verwijderd worden, mits mogelijk dat als je bijvoorbeeld 2 verwijderd, 3 tot en met de rest een plaatsje opschijft zodat het netjes aansluit in de SQL als 1,2,3,4,5 en niet als 1,3,4,5 mits dat kan natuurlijk.
Op het moment dat je het unieke id van een product in een tabel gaat aanpassen moet je natuurlijk ook alle gegevens die daaraan gekoppeld zijn veranderen. Stel dat onze stoel uit het vorige voorbeeld ID 8 had. Omdat alle producten met jouw methode nu een plaatsje opschuiven krijgt nu een Bureautafel van 100 euro die plaats. Aan het einde van het boekjaar kijk je even in je database wat er ook alweer verkocht is en wat er door klanten is binnengebracht. Wat nou... een verschil. Je had namelijk op het moment dat alle product ids werden aangepast ook alle facturen moeten aanpassen waarbij de verschillende producten die bij een factuur horen gekoppeld worden aan het goede _nieuwe_ ID en niet meer aan het oude ID wat ze hadden.
Je ziet dus dat dit best tot problemen kan leiden. Ik stel voor dat je gewoon een veldje in je database invoegt met de naam "active" (of "actief" als je het in het nederlands doet) met tinyint (1) waarbij die op 1 staat bij active en 0 op inactive. Verder stel ik voor dat je dus niet de hele tijd alles gaat opschuiven met ID's. Wanneer een product een bepaald ID heeft gehad dan is dit uniek voor dit ID en laat het dan maar zo.
Wat betreft je checkbox vraag kan ik ook kort zijn. Er zijn veel van dit soort topics gepost op deze pagina maar ik zal nog 1 keer een klein voorbeeld geven:
Je kent de gewone checkbox natuurlijk in HTML. Je kan hem een name geven en een id desgewenst en daarnaast kan je hem een leuke value toekennen die hij meeneemt. Het leuke van een checkbox is dat hij niet bestaat in de $_POST array als je deze submit zonder de box aan te vinken. Het is dus niet zo dat de waarde van $_POST['checkboxnaam'] dan '' is (leeg dus) of '0'. Een dergelijke checkbox kan er in HTML dus zo uitzien:
<input type="checkbox" name="jager" value="1" /> Ja ik ben een vage in noorwegen die graag op tijgers jaagt
<input type="checkbox" name="jager" value="1"/> Ja ik ben een vage in noorwegen die graag op tijgers jaagt
In PHP zien we dus de volgende 2 dingen als we het resultaat opvragen van $_POST['jager'] wanneer deze respectievelijk wel en niet is aangevinkt: Wel => $_POST['jager'] bevat '1' Niet => $_POST['jager'] bevat null (bestaat dus niet)
Je kan dus met isset($_POST['jager']) (PHP.net: isset) controleren of de checkbox selected is.
Wanneer je dus echter meerdere checkboxes hebt als bovenstaande dan zal je zien dat in PHP maar 1 keer het resultaat te zien is. Stel je hebt dus de volgende html code om producten te verwijderen aan de hand van de naam:
Wanneer je beide checkboxes aanvinkt in het formulier en dan in PHP controleert wat er nu eigenlijk in $_POST['delete'] zit dan zal je zien dat alleen het getal 9 zich hierin bevind. De oude waarde van 8 in de $_POST array is namelijk overschreven door de nieuwe waarde. (ook PHP gaat van boven naar beneden met parsen)
Hier is gelukkig een klein truukje voor. Als je al een beetje bekend bent met PHP en Arrays dan weet je dat je als volgt een nieuw element kan toevoegen aan een array:
Ditzelfde principe kunnen we toepassen in het formulier voor de checkboxes. We geven de checkboxes allemaal dezelfde naam maar dan met [] achter die naam. Als we dan meerdere checkboxes aanvinken dan zullen we zien dat $_POST['delete'] een array bevat waarvan elk element dus de waarde heeft van 1 geselecteerde checkbox. Wanneer er niets aangevinkt is dan zal hij echter weer niet bestaan in de $_POST array.
Dit zou dus bijvoorbeeld de HTML code kunnen zijn voor wat producten:
<input type="checkbox" name="delete[]" id="delete" value="11"/> Kilo appels
Stel dat we nu nu dus de Bureaustoel aanvinken en de appels. De $_POST['delete'] is nu een array geworden met daarin de waardes '8' en '11'. Hiermee kunnen we dan wat gaan doen.
We zouden dan (zoals hierboven ook al gedaan wordt door jullie) door die array heen kunnen lopen. Maar dan wordt dus voor elk element een aparte query uitgevoerd. Willen we 10000 producten verwijderen dan is dat niet echt the-way-to-go. SQL kent een leuk truukje met IN. Met IN kan je aangeven welke waarde een bepaald veld moet hebben gescheiden door een komma. Onze SQL query wordt dus als volgt:
Dat wordt dus het resultaat van onze verwerking. Om hiertoe te komen zullen we dus elke waarde van de array moeten scheiden met een comma van elkaar. Gelukkig is de functie PHP.net: implode uiterst geschikt voor dit soort bewerkingen.
<?php
$qDeleteProducts = mysql_query("DELETE FROM producten
WHERE id IN (" . implode(',', $_POST['delete']) . ")");
<?php
$qDeleteProducts=mysql_query("DELETE FROM producten
WHERE id IN (".implode(',',$_POST['delete']).")");
Natuurlijk dien je vooraf nog wel even te controleren of $_POST['delete'] wel bestaat met PHP.net: isset. Wie weet heeft de beheerder namelijk gewoon het formulier gesubmit zonder een product aan te vinken.
Ik hoop dat je wat hebt aan deze uitleg en als mensen een aanvulling willen geven dan zijn ze meer dan welkom. De reden dat ik trouwens nu dit allemaal typ is dat ik net wakker ben geworden en niet meer in slaap kan komen, ben dus geen halfbakken nerd die nog op is
Succes met je systeem en als je verdere vragen hebt dan ben je meer dan welkom deze te stellen hier of (als je me kan vinden) op MSN.