Afhandelen wijziging van aantal in mandje en beschikbare kaarten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nanno Koerts

Nanno Koerts

06/09/2022 20:03:22
Quote Anchor link
Ik loop een beetje vast, ik zie niet wat ik zou moeten gebruiken om het wijzigen van het aantal kaarten dat ik via _POST stuur moet controleren op de nog beschikbare kaarten in de database Kaarten en de toegevoegde in het mandje.

Ik ga proberen uit te leggen hoe ik het wil laten werken en hoe het nu werkt...

Een klant komt op een pagina met allemaal voorstellingen en hierbij de optie om het aantal te bepalen en dan te bestellen.
Dit wordt dan op het bestelformulier geplaatst en de bestelling komt in het Mandje te staan.
Soms gaat het nog wel eens fout en vergeten mensen EERST het juiste aantal te kiezen voordat ze bestellen. Dit kunnen ze dan later wijzigen. Op deze pagina handel ik dus ook de POST en UPDATE af. Dus bij SUBMIT gebruik ik een _self.
Dit maakt het wat complex want ik heb dan eerst heel wat te controleren. Staat de bestelling er al in, zo ja, dan moet je naar de volgende stap. Staat deze er niet in, dan een messages.

Nu loop ik vast na alle controle van beschikbare kaarten en dan het wijzigen van wat er via _POST door de gebruiker wordt ingevoerd. Ik zie het niet wat ik moet doen. Het aantal _POST mag dus nooit meer zijn dan de nog beschikbare kaarten. Hoe en met wat controleer ik dat qua code?

Hier het script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?

session_start();
$ses_id=session_id();

ini_set('display_errors', 'on');
error_reporting(E_ALL);

$localdatum = date('Y-m-d H:i');
setlocale(LC_ALL, 'nl_NL');
$datum_weergave_header = strftime("%A %e %B %Y", strtotime($localdatum));
$copyrightjaar = date('Y');

$path_seizoen = "./seizoen.php";
require $path_seizoen;

$path_connect = "./connect.php";
require $path_connect;


if ($_SERVER['REQUEST_METHOD'] != 'POST'){ // Als er GEEN post is verstuurd
    $post_voorstelling_id = 0;
    $ip = $_SERVER['REMOTE_ADDR'];
    $post_aantal = 0;
    $i = 1;
}
else{
    $post_voorstelling_id = $_POST['ID']; // (ID is voorstelling in database)
    $ip = $_SERVER['REMOTE_ADDR'];
    $post_aantal = $_POST['aantal'];
    $i = 1;
}


############################ Controleren of mandje gevuld is ##############################

if($post_voorstelling_id == 0){

    $resultaat_mandje = mysqli_query($connect_agenda, "SELECT * FROM Mandje where IP='$ip' && Port='$ses_id'");
        
    $aanwezig = mysqli_num_rows($resultaat_mandje);

    if($aanwezig == 0){

        $message = 'Uw bestelformulier is (nog) leeg.';
    
    }
else{

        $message = 'Hier kunt u de aantallen wijzigen!';
        $message_2 = 'Post aantal is: '.$post_aantal.'';
        $message_3 = 'Post ID is: '.$post_voorstelling_id.'';
        
    }
}


######################## Als Post is POST en voorstelling id groter dan nul #############################
if($post_voorstelling_id >= 1){

    ######################## Kaarten uit mandje verwijderen bij POST 0 #############################
    if ($post_aantal == 0){

    $delete_mandje = mysqli_query($connect_agenda, "DELETE FROM Mandje WHERE ArtiestID=$post_voorstelling_id && IP='$ip' && Port='$ses_id'");

    if ($delete_mandje == false){

           $message = 'Er is helaas iets fout gegaan...';
           $message_2 = 'Post aantal is: '.$post_aantal.'';

    }
else{

           $message = 'De kaarten zijn van het bestelformulier verwijderd.';
           $message_2 = 'Post aantal is: '.$post_aantal.'';
    }

    }
else{

    ######################## EINDE Kaarten uit mandje verwijderen bij POST 0 #############################

    $resultaat_agenda = mysqli_query($connect_agenda, "SELECT * FROM Agenda en WHERE ID=$post_voorstelling_id");
    
    while ($row_1 = mysqli_fetch_array($resultaat_agenda))
    {


    $artiest = $row_1['Artiest'];
    $aantal_zitplaatsen = $row_1['Zitplaatsen'];

    }

############################ Controleren op beschikbare kaarten in Kaarten en mandje ##############################

$resultaat_kaarten = mysqli_query($connect_agenda, "SELECT SUM(Aantal_Kaarten) AS aantal_k FROM Kaarten where Voorstelling_id='$post_voorstelling_id' AND Crediteer='Nee'");

$totaal_in_kaarten = 0;

while ($row_totaal_kaarten = mysqli_fetch_object($resultaat_kaarten))
{

  $totaal_in_kaarten = $totaal_in_kaarten + $row_totaal_kaarten->aantal_k;
}


$resultaat_mandje = mysqli_query($connect_agenda, "SELECT SUM(Aantal) AS aantal_m FROM Mandje where ArtiestID='$post_voorstelling_id'");

$totaal_in_mandje = 0;

while ($row_totaal_mandje = mysqli_fetch_object($resultaat_mandje))
{

  $totaal_in_mandje = $totaal_in_mandje + $row_totaal_mandje->aantal_m;
}


$subtotaal_bestelde_kaarten = $totaal_in_kaarten + $totaal_in_mandje;
$totaal_beschikbare_kaarten = $aantal_zitplaatsen - $subtotaal_bestelde_kaarten;

############################ Controleren op aantal POST en beschikbare kaarten ##############################

if ($totaal_beschikbare_kaarten == 0){ // Hier gaat het fout!!!!!

$message_7 = 'Er zijn '.$totaal_beschikbare_kaarten.' kaarten beschikbaar!';
$message_8 = 'Er zijn niet meer kaarten beschikbaar dan uw ingevoerde keuze.';

}
else{

$update_mandje = mysqli_query($connect_agenda, "UPDATE Mandje SET Aantal = $post_aantal WHERE $subtotaal_bestelde_kaarten <= $aantal_zitplaatsen  && ArtiestID=$post_voorstelling_id && IP='$ip' && Port='$ses_id'");

$message_7 = 'Er zijn '.$totaal_beschikbare_kaarten.' kaarten beschikbaar!';
$message_8 = 'Het aantal kaarten is op het bestelformulier gewijzigd.';
}


// is berichtgeving op mijn pagina voor eigen gebruik om te testen.
$message = 'Aantal kaarten in Kaarten: '.$totaal_in_kaarten.'';
$message_2 = 'Aantal kaarten in Mandje: '.$totaal_in_mandje.'';
$message_3 = 'Aantal zitplaatsen is: '.$aantal_zitplaatsen.'';
$message_4 = 'Voorstelling id: '.$post_voorstelling_id.'';
$message_5 = 'Subtotaal in kaarten en mandje: '.$subtotaal_bestelde_kaarten.'';
$message_6 = 'Kaarten beschikbaar: '.$totaal_beschikbare_kaarten.'';
}
}

?>


Toevoeging op 06/09/2022 20:07:54:

Bij regel 111 gaat het fout...
 
PHP hulp

PHP hulp

16/04/2024 20:49:52
 
Ivo P

Ivo P

07/09/2022 09:05:26
Quote Anchor link
Ik denk dat je even aan moet geven wat precies in de verschillende tabellen staat.

Mandje is me duidelijk, maar wat is Kaarten? Ik dacht eerst aan het aantal kaarten in de voorstelling. Maar ik denk nu dat het ook kan zijn dat dat in feite Bestellingen zijn waarbij bij bestelling 5 bijvoorbeeld 2 kaarten genoemd worden?

In dat geval:

Aantal beschikbare kaarten = a) zitplaatsen - b) verkochtekaarten - c) kaarten in mandje (uitgezonderd mijn mandje) die nog geen uur geleden in mandje gingen

a) $aantal_zitplaatsen uit regel 83
b) SELECT SUM(Aantal_Kaarten) as verkochtekaarten FROM Kaarten WHERE voorstelling_id = 123;
c) SELECT SUM(Aantal) AS aantal_m
FROM Mandje WHERE ArtiestID='$post_voorstelling_id'"
AND datumtijdinmandje > NOW() - INTERVAL 1 HOUR
AND IP != $IP
Gewijzigd op 07/09/2022 10:28:01 door Ivo P
 
Nanno Koerts

Nanno Koerts

07/09/2022 15:38:17
Quote Anchor link
De noemer Kaarten is niet handig van mij gekozen en moet je zien als de tabel Bestellingen.

Wat hij al netjes doet in het script:

- Het aantal bestelde kaartjes optellen.
- Het aantal beschikbare kaartjes uitrekenen wat besteld is EN in het mandje zit.

Dit laatste is namelijk belangrijk omdat meerdere mensen tegelijkertijd kaartjes voor die voorstelling in het mandje plaatsen.

Wat ook al werkt is dat wat ik optel in bestelde kaarten en wat in het mandje zit en wat er uiteindelijk nog aan kaarten beschikbaar is.

Het gaat hem echt fout in de _POST als ik daar zelf al een bestelling in heb staan en dat aantal van mezelf wil wijzigen.

Dus uitkomst:

Zitplaatsen: 100
Al besteld: 85
In mandje door andere klant: 5
Beschikbaar: 10
Ik voeg een bestelling toe van 5 kaarten, beschikbaar wordt 5.
Ik besluit om er toch 10 kaarten van te maken, dan moet beschikbaar op 0 komen te staan. En na update mandje de tekst: Aantal is gewijzigd.
Ik moet een error (tekst: Geen kaarten meer beschikbaar) krijgen dat er geen kaarten beschikbaar zijn als ik er 11 _POST met wijzigen.

Deze berekening en uitvoering snap ik niet en dat zou in regel 111 afgehandeld moeten worden.

Toevoeging op 07/09/2022 15:44:40:

Ivo P op 07/09/2022 09:05:26:

Aantal beschikbare kaarten = a) zitplaatsen - b) verkochtekaarten - c) kaarten in mandje (uitgezonderd mijn mandje) die nog geen uur geleden in mandje gingen


Daar heb ik deze code voor. Ik heb het in 2 regels, jij zet dit in 1 regel.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$subtotaal_bestelde_kaarten = $totaal_in_kaarten + $totaal_in_mandje;
$totaal_beschikbare_kaarten = $aantal_zitplaatsen - $subtotaal_bestelde_kaarten;


Toevoeging op 07/09/2022 15:46:28:

Zou dit al invloed hebben op mijn berekening?

Toevoeging op 07/09/2022 16:19:35:

Hier de link om even mee te kijken...

[link]https://www.theaterpand.nl/2022-2023/voorstellingen_test.php[/link]

Klik op bestel en het bestelformulier wordt geopend. Klik op [Aantal controleren...]
Wijzig nu het aantal 1 naar 6, dit moet hij afmelden als: Het aantal kaarten is op het bestelformulier gewijzigd.
Je ziet het nog aantal beschikbare kaarten op 4 staan.
Probeer nu die 4 beschikbare kaarten maar eens te bemachtigen... Dit moet in regel 111 afgehandeld worden. Dus kijkend naar nog beschikbaar en de _POST die ik stuur.

Ik merk ook op dat de html berichtgeving niet direct goed alle waarden ververst, refresh van de pagina doet dit wel.
Dus het kan ook allemaal fout gaan in het juist plaatsen van mijn code, hier twijfel ik dus nu ook aan.

LET op dat je met testen op de pagina BLIJFT waar TEST staat. Dus NIET vanuit het menu op Mandje klikken.
Gewijzigd op 07/09/2022 17:02:37 door Nanno Koerts
 
Ivo P

Ivo P

07/09/2022 17:20:07
Quote Anchor link
Ik denk dat het misgaat, omdat jij de kaarten in het mandje van de huidige klant meetelt.

SELECT SUM(Aantal) AS aantal_m FROM Mandje where ArtiestID='$post_voorstelling_id'

Dus als jij 85 verkocht hebt. 5 in een ander mandje en 5 in mijn mandje
Dan zijn er inderdaad nog 5 over.

Ik pas dit even aan naar een ander voorbeeld, zodat niet alle getallen 5 zijn:

100 kaarten
80 verkocht.
7 in een ander mandje
10 in mijn mandje
>> er zijn nu dus nog 3 kaarten vrij

En nu wil ik ipv 10 toch 11 kaarten.
Dat geeft nu volgens mij een foutmelding: 11 is groter dan de beschikbare 3.

Tel je nu de query zoals ik dat deed: WHERE IP != 'mij ip", dan kom je op een tal van 13 beschikbaar voor mij en kan ik inderdaad verhogen naar 11.

NB: je vorige topic ging erover dat kaartjes maar 1 uur in het mandje mogen liggen: dat kun je dus mooi meepakken in deze query: zie boven.

Toevoeging op 07/09/2022 17:25:52:

2 opmerkingen over IP als filter voor je mandje:

a) als ik met mijn telefoon bestel en ik loop buiten, dan is mijn IPadres via 4G van Vodafone.. Loop ik naar binnen dan springt de verbinding naar WiFi en is het mijn vaste ipadres van Ziggo.
En poef: mijn mandje is leeg en onbereikbaar.
Mogelijk gebeurt dan ook als ik in de trein zit en van gsm-mast naar gsm-mast spring.

b) Bedrijven, scholen etc hebben 1 IPadres als uitgang en als 10 man op een school kaartjes voor een voorstelling proberen te bestellen, hebben deze allemaal hetzelfde IPadres.

Ik zou hierbij liever een session_id gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
 
Nanno Koerts

Nanno Koerts

07/09/2022 19:24:47
Quote Anchor link
Ivo P op 07/09/2022 17:20:07:

2 opmerkingen over IP als filter voor je mandje:

a) als ik met mijn telefoon bestel en ik loop buiten, dan is mijn IPadres via 4G van Vodafone.. Loop ik naar binnen dan springt de verbinding naar WiFi en is het mijn vaste ipadres van Ziggo.
En poef: mijn mandje is leeg en onbereikbaar.
Mogelijk gebeurt dan ook als ik in de trein zit en van gsm-mast naar gsm-mast spring.

b) Bedrijven, scholen etc hebben 1 IPadres als uitgang en als 10 man op een school kaartjes voor een voorstelling proberen te bestellen, hebben deze allemaal hetzelfde IPadres.

Ik zou hierbij liever een session_id gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7


Goed punt. Ik gebruik al een sessie id. Maar dubbelop waarschijnlijk. Dat IP is eigenlijk nog van 10 jaar geleden en ben het sessie id erbij gaan gebruiken omdat om onder een ip diverse gebruikers ineens hetzelfde mandje hadden. Het volstaat dus als ik enkel een sessie id gebruik?
En ontwetendheid, wanneer gebruik ik session start? Is dat op elke pagina waar ik die sessie hanteer of enkel wanneer ik mijn eerste bestelling in het mandje plaats?

Ik ga even jouw idee testen, kom hier straks op terug. Ik denk toch dat ik hier een uitdaging heb want ik mag zelf ook niet meer posten dan beschikbaar is. Daar had ik bij de update ook een beveiliging in gezet. Even kijken of dat werkt.
 
Ward van der Put
Moderator

Ward van der Put

07/09/2022 20:53:19
Quote Anchor link
Ik heb je beide topics op de voet gevolgd. En in beide mis ik vooral één beslissingsregel: wanneer is een kaart/plaats definitief vergeven aan een klant/bezoeker?

Je probeert heel veel onzekerheden te faciliteren, want iemand zou zich misschien nog een keer of twee kunnen bedenken. Terwijl het voor iedereen, behalve die twijfelaars, veel duidelijker is als je duidelijke beslissingen doorzet.

Dat voorkomt ook dat je in het holst van de nacht een cronjob of scheduled task nodig hebt om de puinhoop op te ruimen.

Neem duidelijke beslissingen. Leg die vast in duidelijke code.
 
Nanno Koerts

Nanno Koerts

07/09/2022 21:02:45
Quote Anchor link
Ward van der Put op 07/09/2022 20:53:19:
Ik heb je beide topics op de voet gevolgd. En in beide mis ik vooral één beslissingsregel: wanneer is een kaart/plaats definitief vergeven aan een klant/bezoeker?

Je probeert heel veel onzekerheden te faciliteren, want iemand zou zich misschien nog een keer of twee kunnen bedenken. Terwijl het voor iedereen, behalve die twijfelaars, veel duidelijker is als je duidelijke beslissingen doorzet.

Dat voorkomt ook dat je in het holst van de nacht een cronjob of scheduled task nodig hebt om de puinhoop op te ruimen.

Neem duidelijke beslissingen. Leg die vast in duidelijke code.


Ik doe mijn best!!! Ik ben geen programmeur en ik probeer juist op dit forum en met veel zoeken op internet de juiste code te maken. En als je daarbij tips hebt hoe het beter kan of moet, dan hoor ik dat graag, want daar leer ik juist van!!!

Ik heb die cronjob nodig om de puinhoop van mijn bezoekers op te ruimen. Hoe voorkom ik dat een bezoeker een kaartje in het mandje plaatst en daarna gewoon weer vrolijk weg gaat zonder die bestelling af te maken? Dit gebeurt in bijna elke webshop en inderdaad, bij de grotere theaters zit een tijd van 20 tot 40 minuten als regel en daarna verwijdert het systeem de kaarten uit het mandje.

In beide topics ben ik nog maar enkel bezig met het in het mandje plaatsen en die op te ruimen. Ik heb het verder nooit over de werkelijke afhandeling gehad, want dat werkt allemaal prima, dus daar hoef ik dan ook geen post over te maken. Al volg je het dan op de voet, het zou dan ook fijn zijn als je begrijpt waarmee ik worstel. En ik vind het al moeilijk genoeg omdat een ieder hier duidelijk te maken.

Toevoeging op 07/09/2022 21:09:10:

@Ivo P

Ik denk dat ik weet waar het nu zit...
Jouw idee werkt niet want daarmee kan ik zelf het aantal beschikbaar overrulen. Ik MOET die kaarten van mezelf dus ook meetellen.
Al stoeiende kwam ik tot de volgende conclusie:

Ik moet de foutafhandeling doen bij/in de update en dan TRUE of FALSE maar ik denk dat ik iets fout hanteer. Moet ik dat tussen haakjes doen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
$update_mandje = mysqli_query($connect_agenda, "UPDATE Mandje SET Aantal = $post_aantal WHERE $subtotaal_bestelde_kaarten <= $aantal_zitplaatsen  && ArtiestID=$post_voorstelling_id && IP='$ip' && Port='$ses_id'");

if ($update_mandje == true){

  $message_7 = 'Er zijn niet meer kaarten beschikbaar dan uw ingevoerde keuze TRUE.';
  $message_8 = 'Er zijn '.$totaal_beschikbare_kaarten.' kaarten beschikbaar!';
    
}else{

  $message_7 = 'Het aantal is gewijzigd FALSE';
  $message_8 = 'Het aantal beschikbaar is nu '.$totaal_beschikbare_kaarten.' kaarten!';

}
 
Ivo P

Ivo P

08/09/2022 08:54:10
Quote Anchor link
om te beginnen: $update_mandje = mysqli_query( update );

Dit geeft true of false terug in dit geval.
False alleen op een query die mislukt.
"Mislukt" is alleen van toepassing als iets niet kán. De verbinding is stuk, de table bestaat niet of je hebt een syntax die niet klopt of overtreedt een ingestelde regel.

Geef iedereen in de kamer een hand die van nature een blauwe huid heeft.

Dat lukt je 99.9% van de gevallen zonder te bewegen: er is niemand (tenzij er een smurf of Avatar karakter is), dus je bent snel klaar. Maar dat je niets doet, wil niet zeggen dat de opdracht niet is uitgevoerd.

Hier zoek je waarschijnlijk Affected Rows. Maar let er hier ook op dat als X eerst 0 is voor id 12:

UPDATE tabel SET X = 10 WHERE id = 12;
>> affected rows = 1
UPDATE tabel SET X = 10 WHERE id = 12;
>> affected rows = 0 (er is namelijk niets aangepast)



Toevoeging op 08/09/2022 09:00:20:

Quote:
een tijd van 20 tot 40 minuten als regel en daarna verwijdert het systeem de kaarten uit het mandje.

In beide topics ben ik nog maar enkel bezig met het in het mandje plaatsen en die op te ruimen


Je negeert steeds de optie om bij het tellen gewoon naar het tijdstip te kijken.
Ik heb de query nu een paar keer getoond:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$resultaat_mandje = mysqli_query($connect_agenda, "SELECT SUM(Aantal) AS aantal_m FROM Mandje where ArtiestID='$post_voorstelling_id'");


kun je aanpassen naar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$resultaat_mandje = mysqli_query($connect_agenda,
            "SELECT SUM(Aantal) AS aantal_m
             FROM Mandje
             WHERE ArtiestID='$post_voorstelling_id'  
               AND datumtijd > NOW() - INTERVAL 20 MINUTE");

(20 minuten, een uur of welke tijd jij ook maar wil toepassen.)
Dan hoe je dus niet krampachtig elke minuut een job te draaien om alles op te ruimen.
Elk uur draaien, maakt dat sommige kaarten alsnog 1 uur en 59 minuten in het mandje liggen.
Maar ik probeer dus al een paar dagen je duidelijk te krijgen dat je nu een symptoom bestrijdt:
je hebt niet gedefineerd wat een kaartje in een mandje is (where dt > nu - i uur) en daardoor hbe je last van niet betaalde kaarten
En dat bestrijd je met een cronjob...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.