[PHP] unvorstelles Problem mit if-Anweisung

ViruZ

Commander
Mitglied seit
06.07.2005
Beiträge
184
Renomée
1
Standort
Zeulenroda
Hi,
ich überprüfe bevor ich etwas in der Datenbank ändere nochmal ob die Daten stimmen:
Code:
if($user['geld']>=$kosten && $baut['baut'] == '0')

Leider geht das auf vielen Rechnern aber nicht auf allen! Bei manchen geht es nicht. Und
wenn ich auf einem Rechner auf dem es nicht geht, die Seite mit meinem Laptop als Server öffne dann geht es... im Internet aber nicht!

Wenn ich
Code:
$user['geld']>=$kosten
rausnehme dann geht es plötzlich auf allen PC`s...

WARUM?!

Vielen Dank
mfG ViruZ
 
Zuletzt bearbeitet:
Bist Du Dir ständig im klaren darüber was in der Variable $kosten drinsteht?
Was ist, wenn die Variable $kosten leer ist, oder ein leerer String ($kosten = "") ist?


Besser ist es da, dann mit einer explizten Typwandlung zu arbeiten:
PHP:
if(floatval($user['geld']) >= floatval($kosten) && $baut['baut'] == '0')
Wobei auch da frage ich mich, warum Du bei der Varible $baut['baut'] auf einen String vergleichst und nicht auf den Zahlenwert 0:
PHP:
if(floatval($user['geld']) >= floatval($kosten) && $baut['baut'] == 0)

Wenn es unerheblich ist, ob $baut['baut'] gleich 0 ist oder auch gleich false ist, dann kannst Du es so stehen lassen.
Ansonsten:
PHP:
if(floatval($user['geld']) >= floatval($kosten) && $baut['baut'] === 0)
Mit den 3 Gleicheitszeichen wird der Vergleich nur wahr, wenn $baut['baut'] wirklich den Zahlenwert 0 hat, aber unwahr, wenn $baut['baut'] = false ist.

AndyK
 
In Kosten steht definitiv immer was drin! Mit deinem Tipp geht es auf garkeinem PC mehr... :(
Aber warum geht es auf PC`s bei denen es im Internet nicht geht, wenn sie meinen Laptop als Server nehmen?
Ich versteh das nicht...

mfG ViruZ
 
Poste mal was mehr Code, damit wir dir helfen können. Das Problem liegt wahrscheinlich eher im Bereich HTML (z.B. method="get" vergessen), PHP-Optionen (z.B. register_globals) oder so was, und nicht am Code selbst.
 
In Kosten steht definitiv immer was drin! Mit deinem Tipp geht es auf garkeinem PC mehr... :(
Aber warum geht es auf PC`s bei denen es im Internet nicht geht, wenn sie meinen Laptop als Server nehmen?
Ich versteh das nicht...

mfG ViruZ

Die Frage ist jetzt:
Liegt es an $user['geld']? Ist der Betrag vielleicht inklusive Währungszeichen in der Tabelle abgespeichert? Also ein String? Zahlenwerte (Geld, Prozent, etc.) sollte man in einer Tabelle immer als Zahl (int oder float/double) ablegen und nie als String.

Was ist mit der Variable $kosten? Enthält die ebenfalls nur den Zahlenwert, oder auch ein Währungssymbol?

Was stellt die Variable $baut['baut'] dar? Soll sie nur ein Trigger (Bool-Wert) sein, ob jemand schon baut, bzw. bauen darf, oder steckt da mehr hinter? Welche Werte kann diese Variable annehmen? Wie ist sie in der Datenbank/Tabelle definiert?

Etwas mehr Code könnte wirklich hilfreich sein. *buck*

AndyK
 
soo.. hier der Code:
Code:
$haus_id=$_GET['id'];
	//Abfrage von Geld des Spielers
	$abfrage = "SELECT
					geld,punkte
				FROM
					user
				WHERE
					ID = '".$_SESSION['ID']."'";
	$ergebnis = mysql_query($abfrage);
	$user = mysql_fetch_assoc($ergebnis);
	//Abfrage von Preis des Gebäudes
	$abfrage = "SELECT
					preis,zeit,preis_faktor,zeit_faktor
				FROM
					werkstatt
				WHERE
					id = '$haus_id'";
	$ergebnis = mysql_query($abfrage) OR die(mysql_error());
	$haus = mysql_fetch_assoc($ergebnis);
	//Abfrage ob Spieler baut
	$abfrage = "SELECT
					baut,werkstatt,endzeit
				FROM
					spieler_haus
				WHERE
					id = '".$_SESSION['ID']."'";
	$ergebnis = mysql_query($abfrage);
	$baut = mysql_fetch_assoc($ergebnis);
	$kosten=$haus['preis']*($haus['preis_faktor']*$baut['werkstatt']+1);
	echo "geld:".$user['geld']." ksoten:$kosten";
	//Test ob genug Geld für das Gebäude da ist
	if($user['geld'] >= $kosten && $baut['baut'] == 0)
	{
		//Berechnung des neuen Kontostandes
		$geld_neu = $user['geld'] - $kosten;
		//Neues Kontostand updaten
		$aendern = "UPDATE user Set geld = '$geld_neu' WHERE id = '".$_SESSION['ID']."'";
		$update = mysql_query($aendern) OR die(mysql_error());
		//Endzeit berechnen
		$zeit=$haus['zeit']*($haus['zeit_faktor']*$baut['werkstatt']+1);
		$endzeit=$zeit+$akt_sek;
		//Startzeit updaten
		$aendern = "UPDATE spieler_haus Set startzeit = '$akt_sek' WHERE id = '".$_SESSION['ID']."'";
		$update = mysql_query($aendern) OR die(mysql_error());
		//Endezeit updaten
		$aendern = "UPDATE spieler_haus Set endzeit = '$endzeit' WHERE id = '".$_SESSION['ID']."'";
		$update = mysql_query($aendern) OR die(mysql_error());
		//Bauendes Gebäude updaten
		$aendern = "UPDATE spieler_haus Set baut = '99999' WHERE id = '".$_SESSION['ID']."'";
		$update = mysql_query($aendern) OR die(mysql_error());
		//Punktestand ändern
		$punkte2=($kosten/100)+$user['punkte'];
		//Punktestand updaten
		$aendern = "UPDATE user SET punkte = '$punkte2' WHERE id = '".$_SESSION['ID']."'";
		$update = mysql_query($aendern) OR die(mysql_error());
		//Werkstatttyp updaten
		$aendern = "UPDATE user Set werkstatt_typ = '$haus_id' WHERE id = '".$_SESSION['ID']."'";
		$update = mysql_query($aendern) OR die(mysql_error());
	}

Das ist die komplette Funktion zum Bauen einer Werkstatt in einem Browsergame... (http://schuestel.uttx.net)

$user['geld']:
Die Daten werden im Format int in der Datenbank gespeichert. (Ohne € oder ähnliches)

$kosten:
Enthält ebenfalls nur nur einen Zahlenwert. meist double.

$baut['baut']:
Darin steht 0 wenn der Spieler nichts baut bzw. die ID des Gebäudes was gebaut wird. Das ist in der Datenbank als int definiert.

Vielen Dank
mfG
 
ok, supi!

Mit den Informationen kann ich gut was anfangen, ich schau mir das mal etwas genauer an...

AndyK


Edit1:
Du hast in einer Zeile stehen:
PHP:
    echo "geld:".$user['geld']." ksoten:$kosten";
ist nicht wichtig für die Berechnung, aber stimmt ksoten:$kosten wirklich?

Edit2:
Ich würde dann mal folgende if nehmen:
PHP:
if(doubleval($user['geld']) >= doubleval($kosten) && $baut['baut'] == 0
Es müsste aber auch mit drei Gleichheitszeichen bei && $baut['baut'] === 0 funktionieren, wenn das Feld in der Tabelle mit INT NOT NULL definiert wurde. Ansonsten muss Du explizit auch auf NULL-Werte prüfen! Das gilt übrigens auch für $user['geld'] !!
Bei den weiteren Berechnungen kann man sich die Typenumwandlung sparen, da php die Typen dynamisch wandelt. Nur bei Vergleichen (und bei NULL-Werten!!!!) muss man explizit drauf achten.

Edit3:
Und hier würde ich wieder auf int gehen, da Du sagtest $kosten kann double sein, $user['geld'] ist aber als int definiert:
PHP:
$aendern = "UPDATE user Set geld = '".intval($geld_neu)."' WHERE id = '".$_SESSION['ID']."'";

AndyK
 
Zuletzt bearbeitet:
Hi,
ich meinen Fehler gefunden... *lol*
Die Anweisung hat so funktioniert wie sie sollte -> da ein Fehler in der Datenbank war (er hatte noch nix gebaut aber schon angeblich die 5. Stufe) -> es wird der 5 fache Baupreis verlangt -> er lässt den Bau nicht zu... *noahnung* ich frage mich nur wie die 5 da rein kam!!

Danke trotzdem...
mfG ViruZ
 
Zurück
Oben Unten