Inschrijfforumilier - max 320 personen
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!
Met vriendelijke groet,
Geert
Geert Baas op 26/01/2017 10:46:10:
Ook is het zo dat vorig jaar binnen 20 minuten alle beschikbare plekken op waren.
Niet direct een technisch antwoord, maar als de vraag het aanbod zó overtreft, zouden jullie dan niet eerst wat aan het aanbod doen?
En maak dat duidelijk!
Vertel ieder die zich heeft ingeschreven wat zijn volgnumner op de lijst is.
Ook als je nummer 600 bent.
In de loop der tijd zal er wel iemand afvallen, en dat schuift iedereen een plekje op.
En voer een sluitingsdatum in.
Dit probleem had je trouwens al in de tijd van voor de computer. Het denkproces blijft hetzelfde.
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?
Groetjes,
Geert
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT COUNT(1) AS aantal FROM inschrijvingen
execute query
if(aantal < 320) :
TOON FORM
else:
TOON helaaspindakaas melding
endif;
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)
Als het minder is dan 320, inschrijven kan.
Als het groter is dan 320, melding dat inschrijven gesloten is.
Wie net op dat kantelmoment inschrijft doet nog mee.
En waarom vastpinnen op dat getal? Laat iedereen zich inschrijven.
En sluit de inschrijving om middernacht. Vervolgens form niet meer laten zien.
Probeer het probleem op te lossen met nadenken.
Dan komen de instructies (in je gedachten) welke code je moet schrijven vanzelf.
Maar goed, ik heb makkelijk lullen. Ik ben nog uit de tijd dat er geen forums waren.
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!
Geert
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.
Gewijzigd op 26/01/2017 13:19:55 door Thomas van den Heuvel
Ik heb het script van vorig jaar nog kunnen bemachtigen uit een oude back-up.
Helaas heb ik niet heel veel verstand van PHP.
Ik kan nergens vinden wanneer de inschrijving geopend word in de bestanden. Kan iemand mij hier misschien mee helpen?
Dit stukje kan ik dus nergens terug vinden :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php // kleurtjes tonen
// OPEN CLOSE
$o_year = $contArray['sy']; $c_year = $contArray['sy'];
$o_month = $contArray['ism']; $c_month = $contArray['icm'];
$o_day = $contArray['isd']; $c_day = $contArray['icd'];
$o_hour = $contArray['ish']; $c_hour = $contArray['ich'];
$o_minute = $contArray['ismin']; $c_minute = $contArray['icmin'];
$o_second = 0; $c_second = 0;
$openmsg = 'De inschrijving opent op: <span class="red"> '.giveDate($o_year, $o_month, $o_day).' om '.$o_hour.':'.$o_minute.'u</span>';
$closemsg = 'De inschrijving is gesloten op '.giveDate($c_year, $c_month, $c_day).' om '.$c_hour.':'.$c_minute.'u';
$closedate = mktime($c_hour, $c_minute, $c_second, $c_month, $c_day, $c_year, -1);
$opendate = mktime($o_hour, $o_minute, $o_second, $o_month, $o_day, $o_year, -1);
$today = time();
?>
// OPEN CLOSE
$o_year = $contArray['sy']; $c_year = $contArray['sy'];
$o_month = $contArray['ism']; $c_month = $contArray['icm'];
$o_day = $contArray['isd']; $c_day = $contArray['icd'];
$o_hour = $contArray['ish']; $c_hour = $contArray['ich'];
$o_minute = $contArray['ismin']; $c_minute = $contArray['icmin'];
$o_second = 0; $c_second = 0;
$openmsg = 'De inschrijving opent op: <span class="red"> '.giveDate($o_year, $o_month, $o_day).' om '.$o_hour.':'.$o_minute.'u</span>';
$closemsg = 'De inschrijving is gesloten op '.giveDate($c_year, $c_month, $c_day).' om '.$c_hour.':'.$c_minute.'u';
$closedate = mktime($c_hour, $c_minute, $c_second, $c_month, $c_day, $c_year, -1);
$opendate = mktime($o_hour, $o_minute, $o_second, $o_month, $o_day, $o_year, -1);
$today = time();
?>
Met vriendelijke groet,
Geert.
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 31/01/2017 20:33:53 door - Ariën -
Maar een database is hier veel makkelijker voor. Dan kan je er meteen statistieken uit halen, en makkelijk tellen hoeveel mensen er zich hebben aangemeld.
Gewijzigd op 31/01/2017 20:35:27 door - Ariën -
Klopt, de code bestaat uit een bestand of 10 à 15. Die kan ik niet allemaal hier posten denk ik?
Als ik zo kijk denk ik dat je beter de boel van begin af aan kan opbouwen en meteen met een database kan beginnen. Dan heb je een goed gestructureerde en overzichtelijke lijst met inschrijvers.
Of kan je kort vertellen hoe het wordt opgeslagen op dit moment?
Gewijzigd op 01/02/2017 11:54:43 door - Ariën -