WebWork Magazin - Design, Gestaltung, Online Medien, html

Webhosting Provider Domain

Home | Registrieren | Einloggen | Suchen | Aktuelles | Suleitec Webhosting
Reparatur- und Ersatzteile-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 - 18 Mai 2012 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:
<?php 
if ($_GET['a'] == "error") { 
?><font class="warning"><center>You do not have enough money to buy this item.</center></font>
<?php				
}	
if ($_GET['a'] == "error2") {
?><font class="warning"><center>You do not have enough space to carry another item.</center></font>
<?php				
}
if ($_GET['a'] == "1") {
?><font class="warning"><center>You bought a junk car for 1000c.</center></font>
<?php		
}	 ?>
<form action="dobuy.php?p=2" method="post"> 
<table id="tmitte" width="362" align="center" border="1" class="tmenu" cellpadding="0" cellspacing="0">
<tr><td colspan="5" align="center" background="Bilder/backgroundCell.jpg" class="titel">Cars</td></tr>
<tr align="center" class="ntext">
<td width="62"><img src="Bilder/items/21.jpg" border="0" height="41"></td>
<td width="110"> Junk Car</td>
<td width="60">1000c</td>
<td width="40">lvl 1</td>
//below is the button which starts the doMafiaBuy.php code
<td width="60"><a href="doMafiaBuy.php?p=1&i=21&u=<?php echo $_SESSION['id'];   ?>" class="a"><input type="button" value="Buy" name="junkcar"></a></td>
</tr>
</table>
</form>


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:
<?php
$link = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("soc") or die("Auswahl der Datenbank fehlgeschlagen"); 							
$query = "SELECT * FROM player WHERE player_id = '".$_GET['u']."'";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($result);
$query = "SELECT * FROM items WHERE item_id = '".$_GET['i']."'";
$result = mysql_query($query) or die(mysql_error());
$itemrow = mysql_fetch_assoc($result);

//this functions checks if the player has enough money to buy the item or not
function check_money($moneyleft, $price) {
	if ($price > $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: 167

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: 167

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:
<?php
function check_money($moneyleft, $price){
    if ($price > $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:
<?php
function check_amount(){
	// du musst die itemid und player_id nicht in die function übergeben, da $_GET eine Globale variable ist
    $query = "SELECT amount FROM mafia WHERE item_id = '".$_GET['i']."' AND player_id = '".$_GET['u']."'";
	// du willst doch eh nur die anzahl haben
    // und du willst doch nur prüfen obs ein eintag gibt also mach das auch
    if(@mysql_num_rows($query))
        return mysql_result($query,NULL,'amount');
    else
        return FALSE;
}// und hier könnte der fehler liegen, das er mehr dazu addiert hatte, du
 // hattest eine while - wenn nun fehlerhafterweise 2 einträge vorhanden waren
 // würde es zu deinem beschriebenen fehler führen.
 // ich nehm mal an, er tart nur auf, wenn "amount" von ein und dem selben item
 // grösser gleich 1 war / ist
?>


---
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: 167

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:
<?php
if ($_GET['p'] == "1") {
	//$item = $_GET['i']; //speichert die item id    brauchst du die ? finde die im code nicht wieder
	//$price = "0";     brauchst du diese variable ? finde die im code nicht wieder
	//$moneyleft = $row['mafiabank'];	 //setzt variable auf verfügbares guthaben      --> ü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: 167

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
FOPEN dauert Ewig
in "PHP & MySQL"
13 11.05.2012 13:16 von Ori
CRC 16
in "PHP & MySQL"
3 03.05.2012 11:36 von Ori
Senior Software Entwickler in Hannover gesucht
in "PHP & MySQL"
0 13.04.2012 10:38 von joocom
PHP befehl ausführen
in "PHP & MySQL"
7 05.02.2012 12:56 von leander
CMS für Online Shop
in "PHP & MySQL"
2 08.01.2012 00:14 von mario73
bestimmte zeilen aus einer datei löschen
in "PHP & MySQL"
5 27.12.2011 12:54 von Ori
array-Wert aus object stdClass löschen
in "PHP & MySQL"
1 24.11.2011 23:56 von elster
do-while schleife stürzt bei vielen durchläufen ab
in "PHP & MySQL"
10 13.11.2011 21:31 von Ori
Objekt-Var mit Inhalt oder ohne feststellen
in "PHP & MySQL"
2 16.09.2011 13:57 von elster



Besucher : 1352039    Heute : 368     Gestern : 2031     Online : 27     18.5.2012    6:58      1 Besucher in den letzten 60 Sekunden        
alle 60.00 Sekunden ein neuer Besucher
Die letzten 30 Referrer :

1 6:49 - google.com/search - o2more
2 6:48 - google.com/search - o2more
3 6:47 - google.com/search - o2more
4 6:32 - google.com/hws/search - porn werbung
5 6:30 - blogsearch.google.com/blogsearch_feeds - verbaudet
6 6:29 - blogsearch.google.com/blogsearch_feeds - verbaudet
7 6:28 - blogsearch.google.com/blogsearch_feeds - verbaudet
8 6:28 - blogsearch.google.com/blogsearch_feeds - vertbaudet
9 6:16 - bing.com/search - siteman V:1.1.11
10 5:28 - google.com/search - o2more
11 5:27 - google.com/search - o2more
12 5:26 - google.com/search - o2more
13 5:25 - google.com/search - o2more
14 4:24 - google.com/search - o2more
15 3:55 - de.ask.com/web - findamo löschen
16 3:48 - findamo.com/search.html - Findamo löschen
17 3:42 - findamo.com/search.html - Findamo löschen
18 3:41 - findamo.com/search.html - Findamo löschen
19 3:26 - de.ask.com/web - Findamo löschen
20 2:37 - google.de/search - phpbb bruteforcer
21 2:35 - google.com/search - sexwebseiten
22 2:22 - bing.com/search - siteman V:1.1.11
23 1:37 - ecosia.org/search.php - div position immer unten dran
24 1:12 - google.at/search - 2 buchstaben domain
25 0:11 - google.com/search - google
26 23:40 - search.babylon.com/ - feedbock
27 23:33 - google.com/search - o2more
28 23:32 - google.com/search - o2more
29 23:31 - google.com/search - o2more
30 23:26 - blogsearch.google.com/blogsearch_feeds - verbaudet

Nach oben