case-befehl |
samspam
Pixelschubser Threadstarter
Beiträge: 5 |
hallo
ich bin neu hier und habe gleich eine knifflige frage:
ich programmiere derzeit ein online-rollenspiel basierend auf php & mysql.
nun habe ich verschiedene einkaufsläden auf denen man verschiedene produkte kaufen kann (logisch...). Dazu habe ich 2 verschiedene pages, die eine stellt den laden dar (cardealer.php), die andere wickelt den ganzen kaufvorgang ab (doMafiaBuy.php).
Normalerweise funktioniert mein Code wunderbar. Aber ab und zu (vielleicht so jedes 5te mal) wenn ich auf den kaufen button drücke, führt es den Code 2 mal anstatt nur 1 mal aus (sprich der artikel wird 2 mal gekauft). dabei wird das ganze script nochmal durchlaufen, es ist also nicht so, als ob nur eine funktion doppelt durchlaufen wird.
ich habe schon stunden damit verbraten, zu schauen, wo der code ein fehler haben könnte. wäre wirklich dankbar, wenn jemand von euch eine idee hätte.
cardealer.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: | You do not have enough money to buy this item.
You do not have enough space to carry another item.
You bought a junk car for 1000c.
|
doMafiaBuy.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:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76: | $moneyleft) {
$poss = "false";
return $poss;
}
else {
$poss = "true";
return $poss;
}
}
//this function checks how many of the items you already have (if you have one) and returns the amount
//(if its the first item it returns 0
function check_amount($item) {
$query = "SELECT * FROM mafia WHERE item_id = '".$_GET['i']."' AND player_id = '".$_GET['u']."'";
$result = mysql_query($query) or die(mysql_error());
$check = 0;
while ($row2 = mysql_fetch_assoc($result)) { //falls bereits ein item vorhanden ist wird $check auf 1 gestellt
$check = 1;
$amount = $row2['amount'];
}
if ($check == 1){
return $amount;
}
else { //falls das item noch nicht vorhanden ist
$null = 0;
return $null;
}
}
//car dealership
if ($_GET['p'] == "1") {
$item = $_GET['i']; //speichert die item id
$price = "0";
$moneyleft = $row['mafiabank']; //setzt variable auf verfügbares guthaben
switch ($_GET['i']) {
case '21': //junk car
$buy = check_money($moneyleft, $itemrow['price']); //prüft, ob genug geld vorhanden ist
if ($buy == "true") {
$moneyleft = $moneyleft - $itemrow['price']; //zieht die kosten vom vermögen ab
$newinfluence = $row['influence'] + $itemrow['influence']; //berechnet den neuen einfluss (ranking wert im spiel)
$amount = check_amount($_GET['i']); //anzahl der items
if ($amount == 0) {
$query = "INSERT INTO `mafia` (player_id, item_id, amount, type) VALUES ('".$_GET['u']."', '".$_GET['i']."', '1', 'movable')";
$result = mysql_query($query) or die(mysql_error());
$query = "UPDATE `player` SET mafiabank = '".$moneyleft."', influence = '".$newinfluence."' WHERE player_id = '".$_GET['u']."'";
$result = mysql_query($query) or die(mysql_error());
}
else { //falls bereits ein item vorhanden ist und jetzt das 2te dazukommt
$amount = $amount + 1;
$query = "UPDATE `mafia` SET amount = '".$amount."' WHERE player_id = '".$_GET['u']."' AND item_id = '".$_GET['i']."'";
$result = mysql_query($query) or die(mysql_error());
$query = "UPDATE `player` SET mafiabank = '".$moneyleft."', influence = '".$newinfluence."' WHERE player_id = '".$_GET['u']."'";
$result = mysql_query($query) or die(mysql_error());
}
header ("Location: cardealer.php?a=1"); //bringt mich zurück zum kauffenster
}
else {
header ("Location: cardealer.php?a=error");
}
break;
}
} |
Diese Nachricht wurde geändert von: samspam |
 Profil
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Bau doch einfach eine kurze Sperre von zwei drei Sekunden ein, das schützt dann auch gleich vor Reload-Problemen. Was anderes kann ich mir für deinen Code jetzt auch nicht vorstellen.
Gruß
Johannes
|
 Profil
Editieren
Zitieren
|
samspam
Pixelschubser Threadstarter
Beiträge: 5 |
danke erstmals für die antwort. das hört sich doch vielversprechend an.
aber was meinst du genau mit einer sperre?
und wo sollte ich sie einbauen, bzw. was bewirkt sie? verzögert sie das laden von cardealer.php um 2 bis 3 sekunden oder wie meinst du das?
|
 Profil
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
sleep();
aber ich denke, das ist nicht die lösung, von so einem problem.
da es ja zeile, für zeile abgehandelt wird, muss es auch, wenn der sql_qry kommt, bzw danch der header, auch dies tun-->(abbrechen).
wir liegen doch im ms bereich und ich galube nicht, das es ein browser schafft, diese spanne zu brechen (refresh "F5").
aber das sollte ja nicht das problem sein, denn ich glaube nicht daran, dass das script mehrmals rurchlaufen wird und wenn ja... dann ist was an der logik falsch.
sry zu wenig zeit, habe es nur überflogen.
hoffe ich kann dir morgen abend / sonntag was besseres posten.
übrigens... wenn es ein logischer fehler ist, sollte er auch mit dem sleep(); auftreten.
---
Irren is Menschlich
Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!
Kameradschaft ist, wenn der
Kamerad schafft !!!!
|
 Profil
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
hi. ich habs mir mal angeschaut und hier und da paar kleine sachen gesehn, die man besser lösen kann.
vielleicht liegts ja auch mit daran. -> check_amount()
erstmal bissel den code kürzen.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10: | $moneyleft)
return FALSE;
else
return TRUE;
}
?>
|
so und hier könnte der fehler liegen aber das kann man nur durch testen rausfinden.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16: | |
---
Irren is Menschlich
Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!
Kameradschaft ist, wenn der
Kamerad schafft !!!!
|
 Profil
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
achso. wollt ja eigentlich noch weiter machen
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: | überflüssig
switch ($_GET['i']) {
case '21': //junk car
if (check_money($row['mafiabank'], $itemrow['price'])) {
$row['mafiabank'] -= $itemrow['price']; //zieht die kosten vom vermögen ab
$newinfluence = $row['influence'] + $itemrow['influence']; //berechnet den neuen einfluss (ranking wert im spiel)
$amount = check_amount(); //anzahl der items
if (!$amount) {
$query = "INSERT INTO `mafia` (player_id, item_id, amount, type) VALUES ('".$_GET['u']."', '".$_GET['i']."', '1', 'movable')";
$result = mysql_query($query) or die(mysql_error());
$query = "UPDATE `player` SET mafiabank = '".$row['mafiabank']."', influence = '".$newinfluence."' WHERE player_id = '".$_GET['u']."'";
$result = mysql_query($query) or die(mysql_error());
}//--> kein item vorhanden
else { //falls bereits ein item vorhanden ist und jetzt das 2te dazukommt
$amount++;
$query = "UPDATE `mafia` SET amount = '".$amount."' WHERE player_id = '".$_GET['u']."' AND item_id = '".$_GET['i']."'";
$result = mysql_query($query) or die(mysql_error());
$query = "UPDATE `player` SET mafiabank = '".$row['mafiabank']."', influence = '".$newinfluence."' WHERE player_id = '".$_GET['u']."'";
$result = mysql_query($query) or die(mysql_error());
}//--> ein oder mehrere items vorhanden
header ("Location: cardealer.php?a=1"); //bringt mich zurück zum kauffenster
exit();
}//--> genug geld
else {
header ("Location: cardealer.php?a=error");
exit();
}//--> nicht genug geld
break; //--> normalerweise ist jetzt break überflüssig, weil egal was passiert,
//--> es wird eine neue headerinformation an den browser gesendet
//--> und exit() unterbindet sowies eine weitere ausführen des codes
//--> case '21'
}//--> switch
}//--> p = 1
?> |
---
Irren is Menschlich
Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!
Kameradschaft ist, wenn der
Kamerad schafft !!!!
|
 Profil
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
raiserle schrieb am 20.10.2006 02:36
sleep();
aber ich denke, das ist nicht die lösung, von so einem problem. |
Ach quatsch. User Identifizieren und die letzte Aktion speichern. Wenn er die dann gleich sofort nochmals ausführt, ist was falsch gelaufen.
|
 Profil
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
würde auch gehen languitar, aber ich bin nach wie for der meinung, das es nicht
an einem poppelten ausführen des codes liegt. oder denkst du das.
vielmehr könnte wirklich die while in der anzahlprüfung dafür gesort haben, das dort ein falsches ergebnis kam. zumindes denke ich, dass dort eher der fehler liegt.
gruß raiserle
---
Irren is Menschlich
Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!
Kameradschaft ist, wenn der
Kamerad schafft !!!!
|
 Profil
Editieren
Zitieren
|
samspam
Pixelschubser Threadstarter
Beiträge: 5 |
erstmals danke für die ausführliche lösung. werde das gleich mal testen.
|
 Profil
Editieren
Zitieren
|
samspam
Pixelschubser Threadstarter
Beiträge: 5 |
hab mein skript gerade geändert und an deine version angepasst.
allerdings ist das problem immer noch vorhanden (habe jetzt sogar die ganze while-schlaufe weggelassen).
teilweise kauft es nur 1 item, teilweise 2 und ab und zu sogar 3 aufs mal...
ich probiers jetzt mal mit dem sleep()
|
 Profil
Editieren
Zitieren
|
samspam
Pixelschubser Threadstarter
Beiträge: 5 |
mit sleep(1); hats geklappt.
jetzt zählts richtig...
danke nochmals an alle die mir eine lösung gegeben haben, auch wenn nicht alles funktionierte...
|
 Profil
Editieren
Zitieren
|