Controle op maximum werkt niet
Kortom; bij het storten op de bank met bv een max van 5000 capacity, en de gebruiker heeft bv. 4000 reeds op de bank staan --> dan kan de gebruiker oneindig storten de eerste keer. Wanneer het max overschreden is werkt de controle wel.
Wie kan mij helpen met deze controle goed te krijgen?
Code (php)
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
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
//Withdraw or deposit
if (isset($_POST['withdraw']) OR isset($_POST['deposit'])) {
if (!isset($_POST['money'])) {
$error[] = 'Je hebt geen bedrag aangegeven';
}
elseif(!ctype_digit($_POST['money'])) {
$error[] = 'Het ingegeven bedrag is niet numeriek.';
}
// Extra check for php overflow error, so that +/- bug cant be abused
elseif (strlen($_POST['money']) > 20) {
$error[] = 'Het bedrag wat je hebt ingevoerd is abnormaal hoog!';
}
if (!isset($_POST['withdraw']) AND !isset($_POST['deposit'])) {
$error[] = 'Je hebt niet aangegeven of je geld wilt opnemen of storen!';
} else {
if (isset($_POST['withdraw'])) {
$result = $connection->query('SELECT bank FROM building_bank WHERE user_id = "' . $_SESSION['user_name'] . '"');
$row = $result->fetch_assoc();
if ($row['bank'] < $_POST['money']) {
$error[] = 'Je hebt niet genoeg op de bank staan!';
}
} else {
$result = $connection->query('SELECT cash FROM building_bank WHERE user_id = "' . $_SESSION['user_name'] . '"');
$row = $result->fetch_assoc();
if ($row['cash'] < $_POST['money']) {
$error[] = 'Het bedrag wat je hebt aangegeven heb je niet in cash.';
}
if ($_POST['deposit'] > $userBankData['max_capicity']) {
$error[] = 'Je hebt niet voldoende opslag om zoveel geld te storten.';
}
}
}
if (count($error) > 0) {
foreach ($error as $item) {
$form_error .= '- ' . $item . '<br />';
$form_error_modal_bank = "".$form_error."";
}
} else {
// We got a kom, now check if he won something...
$money = (int) $_POST['money'];
$WithOrDep = (isset($_POST['withdraw']) ? 1 : 2);
// User wants to withdraw money
if (isset($_POST['withdraw']) OR isset($_POST['deposit'])) {
if ($WithOrDep == 1) {
$connection->query('UPDATE building_bank SET cash = (cash + ' . $money . '), bank = (bank - ' . $money . ') WHERE user_id = "' . $_SESSION['user_name'] . '"');
$result_text_modal_bank = "Je hebt ".$money." opgenomen";
} else {
$connection->query('UPDATE building_bank SET cash = (cash - ' . $money . '), bank = (bank + ' . $money . ') WHERE user_id = "' . $_SESSION['user_name'] . '"');
$result_text_modal_bank = "Je hebt ".$money." gestort";
}
}
}
if (isset($_POST['withdraw']) OR isset($_POST['deposit'])) {
if (!isset($_POST['money'])) {
$error[] = 'Je hebt geen bedrag aangegeven';
}
elseif(!ctype_digit($_POST['money'])) {
$error[] = 'Het ingegeven bedrag is niet numeriek.';
}
// Extra check for php overflow error, so that +/- bug cant be abused
elseif (strlen($_POST['money']) > 20) {
$error[] = 'Het bedrag wat je hebt ingevoerd is abnormaal hoog!';
}
if (!isset($_POST['withdraw']) AND !isset($_POST['deposit'])) {
$error[] = 'Je hebt niet aangegeven of je geld wilt opnemen of storen!';
} else {
if (isset($_POST['withdraw'])) {
$result = $connection->query('SELECT bank FROM building_bank WHERE user_id = "' . $_SESSION['user_name'] . '"');
$row = $result->fetch_assoc();
if ($row['bank'] < $_POST['money']) {
$error[] = 'Je hebt niet genoeg op de bank staan!';
}
} else {
$result = $connection->query('SELECT cash FROM building_bank WHERE user_id = "' . $_SESSION['user_name'] . '"');
$row = $result->fetch_assoc();
if ($row['cash'] < $_POST['money']) {
$error[] = 'Het bedrag wat je hebt aangegeven heb je niet in cash.';
}
if ($_POST['deposit'] > $userBankData['max_capicity']) {
$error[] = 'Je hebt niet voldoende opslag om zoveel geld te storten.';
}
}
}
if (count($error) > 0) {
foreach ($error as $item) {
$form_error .= '- ' . $item . '<br />';
$form_error_modal_bank = "".$form_error."";
}
} else {
// We got a kom, now check if he won something...
$money = (int) $_POST['money'];
$WithOrDep = (isset($_POST['withdraw']) ? 1 : 2);
// User wants to withdraw money
if (isset($_POST['withdraw']) OR isset($_POST['deposit'])) {
if ($WithOrDep == 1) {
$connection->query('UPDATE building_bank SET cash = (cash + ' . $money . '), bank = (bank - ' . $money . ') WHERE user_id = "' . $_SESSION['user_name'] . '"');
$result_text_modal_bank = "Je hebt ".$money." opgenomen";
} else {
$connection->query('UPDATE building_bank SET cash = (cash - ' . $money . '), bank = (bank + ' . $money . ') WHERE user_id = "' . $_SESSION['user_name'] . '"');
$result_text_modal_bank = "Je hebt ".$money." gestort";
}
}
}
Nu is je som:
(dus: als het bedrag wat gestort wordt groter is dan de max capacity)
maar het moet zoiets zijn:
(dus: als het bedrag dat gestort wordt PLUS het bedrag dat al op de bank staat groter is dan de max capacity)
Ook stop je deze operatie(s) niet in één ondeelbare actie. Alle queries zou je in een transactie moeten zetten, met een initiële SELECT-query die de relevante records locked middels een FOR UPDATE toevoeging.
Plus je maakt in je code continu een spagaat tussen opnemen en storten. Als je deze acties nu eens scheidt?