WebWork Magazin - Webseiten erstellen lassen, Online Medien, html

Webhoster, Webhosting Provider und Domain registrieren

Home | Registrieren | Einloggen | Suchen | Aktuelles | GSL-Webservice | Suleitec Webhosting
Reparatur-Forum | Elektro forum | Ersatzteilshop Haushalt und Elektronik



Im Homepage und Webhosting-Forum --- case-befehl

Scripte und Programme für PHP, MYSQL. Diskussionen zur Programmierung im Web. Fragen zu CMS, Blogsoftware, Shops, Newsletter und vielen weiteren Scripten.

Forum » PHP & MySQL » case-befehl - 23 Nov 2024 Antworten
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.
//below is the button which starts the doMafiaBuy.php code
Cars
Junk Car 1000c lvl 1


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
 

Antworten
Forum » PHP & MySQL » case-befehl

Aktuelle Beiträge zur Hilfe im Forum für Homepage - case-befehl im Forum Homepage Hosting AntwortenLetztes Posting
Cybersicherheit für Unternehmen
in "PHP & MySQL"
3 18.11.2024 14:05 von Gaswer
Wirtschaftslage in der Ukraine
in "PHP & MySQL"
3 22.10.2024 15:04 von Gaswer
Rangliste (Ohne Mysql) (Kompliziertes Ordner System)
in "PHP & MySQL"
3 19.07.2021 06:00 von newtopblog
kleines problem mit phpadmin
in "PHP & MySQL"
5 11.04.2021 22:22 von Zavylon
Counter mit PHP
in "PHP & MySQL"
4 22.03.2021 16:29 von Robeni
Fehlermeldung beim Importieren der Datenbank in phpmyadmin
in "PHP & MySQL"
0 02.08.2019 22:14 von iFuchs
CMS für Online Shop
in "PHP & MySQL"
18 26.05.2019 13:29 von raiserle
Regestrierungproblem
in "PHP & MySQL"
3 28.11.2018 13:20 von norbertofahey
PHP Datum ausgeben?
in "PHP & MySQL"
1 19.10.2018 10:04 von Klaus1973
PHP befehl ausführen
in "PHP & MySQL"
11 16.08.2018 09:08 von Klaus1973
Visual Composer selber programmieren?
in "PHP & MySQL"
0 22.01.2017 23:45 von Redji



Besucher : 8127822    Heute : 216     Gestern : 761     Online : 146     23.11.2024    9:06      2 Besucher in den letzten 60 Sekunden        
alle 30.00 Sekunden ein neuer Besucher
Nach oben