Aangezien ik vrij nieuw ben met PHP, heb ik een aantal vraagjes..
Voor de kindervakantie week hier in de buurt zijn we bezig met het opzetten van een nieuwe website, de oude beheerder is hiermee gestopt neem ik het stokje over. Met Wordpress en HTML heb ik al redelijk wat ervaring.
Nu zitten wij met het volgende probleem, over een aantal maanden gaat de inschrijving weer beginnen voor de kindervakantie week. De inschrijving zal online verlopen. Er kunnen maximaal 320 plekken verdeeld worden, waarvan de laatste 20 op de reserve lijst geplaatst worden.
We hebben eerst zitten kijken om de inschrijving te laten gaan via WooCommerce, maar hier ga je een hoop gegevens missen (bijv. de naam, leeftijd etc. van de kinderen)
Nu is het idee dus ontstaan om het via een inschrijfpagina te doen, waar mensen al hun gegevens kunnen invullen (en die van de kinderen) die vervolgens in een database terecht komen.
Alleen nu is mijn vraag, hoe is dit te realiseren.
Met wat googelen ben ik al een heel eind gekomen, maar hoe zorg ik er voor dat er niet meer dan 300 normale inschrijvingen en 20 op de reserve lijst ga krijgen?
Ook is het zo dat vorig jaar binnen 20 minuten alle beschikbare plekken op waren.
Mocht iemand ideeën of tips hebben hoor ik het graag!
Het aanbod kan helaas niet vergroot worden, er is gewoon geen ruimte voor hoe graag we ook zouden willen.
Is er niet iets mogelijk dat aanmelder 321 bijv geweigerd word omdat het helaas vol zit dan?
De sluitingsdatum zal bereikt worden wanneer alle inschrijvingen compleet zijn.
Mijn vraag is dus eigenlijk, is het mogelijk om een script te schrijven wat na de 320 aanmeldingen zichzelf sluit en een melding geeft dat het vol is?
Uiteraard is dit mogelijk. Kwestie van een if en else. Je hebt een query nodig die het aantal aanmeldingen leest uit de database. zijn dit er meer dan 320 dan toon je pagina 'volisvol.php' en anders 'register.php'.
Opzich kan je met MySQL primma tellen hoeveel mensen er zijn. Als dit groter is dan 320 zal het een melding geven. Of je tussen 320 en 340 de mensen een status van RESERVE kunnen meegeven, zodat je een reservelijst hebt.
SELECT COUNT(1) AS aantal FROM inschrijvingen
execute query
if(aantal < 320) :
TOON FORM
else:
TOON helaaspindakaas melding
endif;
En dan nog bij het opslaan controleren of de teller niet alsnog te hoog wordt.
Als namelijk 25 mensen de pagina openen op het moment dat de teller op 319 staat, dan zien zij allen je form.
Alleen de eerste die submit, is nog optijd
(optie: als teller de 300 nadert, melden bij je form dat je bijna aan de limiet zit)
Geweldig, ik denk dat ik nu al een heel eind verder ben gekomen dankzij jullie hulp.
Ik ga zometeen eens even de optie's proberen zoals hierboven vermeld zijn.
Mocht ik nog wat problemen tegen komen zullen jullie het wel horen.
Voorals nog hardstikke bedankt voor de snelle en goede hulp!
Als het zo storm kan lopen is de pseudo-code van Ivo mogelijk niet voldoende.
De twee opeenvolgende queries (een voor de controle of het maximum is bereikt, en een voor het wegschrijven van de inschrijving) vormen namelijk geen ondeelbare (atomaire) actie (en de pseudocode heeft het alleen over het tonen van het formulier, nog niet eens over de verwerking hiervan alwaar je deze controle opnieuw zult moeten uitvoeren). Het kan dan dus gebeuren dat er bijvoorbeeld 100 personen het formulier versturen als de teller op 319 staat. Allereerst wordt gecontroleerd of het maximaal aantal inschrijvingen nog niet is bereikt, mogelijk wordt dan voor een behoorlijk percentage geconstateerd (zeg 50 van de 100) dat het maximum nog niet is bereikt waarna de inschrijving wordt geregistreerd. Vervolgens heb je 369 inschrijvingen.
Dit probleem zou je op kunnen lossen met database-transacties. Wat je in wezen doet is het vergrendelen van de inschrijftabel vanaf het moment van de controle totdat de inschrijving is voltooid. Dit garandeert dat er op enig moment maximaal één inschrijving tegelijkertijd wordt weggeschreven nadat is geconstateerd dat er nog plek is. En dit garandeert op zijn beurt dat het maximum ook echt niet overschreden wordt.
Een alternatieve aanpak kan natuurlijk ook: je hebt een vaste inschrijfperiode en na sluiting verloot je de beschikbare plekken.
Ook zul je misschien moeten kijken naar hoe je kunt voorkomen dat mensen zich dubbel opgeven om zich zo van een plek te verzekeren.