Negative Zahlen bei eingabefeld

Anacondi

Erfahrenes Mitglied
Hallo Gemeinde
Habe folgendes Problem:
ein user soll eingeben, wieviele coins er am markt verkaufen will. auf der nächsten seite wird überprüft, ob der user auch so viele voins hat, wie er eingegeben hat.
das funktioniert auch, aber wehe, jemand gibt eine negative zahl z.b. -10 ein, dann wird der verkauf in die datenbank geschrieben, und es wird nicht als fehler angesehen.
wie kann ich das abfragen, das auch keine negative zahl angenommen wird=

hier mein eingabefeld von der 1.seite

HTML:
<form action="coins_markt_verkauf.php" method="post">
Anzahl Coins <input type="text" size="10" name="Coins">
Dein Preis<input type="text" size="10" name="Preis" value="1000">

<input type="submit" value="Am Markt anbieten">
</form>

hier die auswerte seite

PHP:
<?php
$sql = "SELECT * from login WHERE id = $id";  
$result = mysql_query ($sql);  

if (mysql_num_rows ($result) > 0)  
{  
  // Benutzerdaten in ein Array auslesen.  
  $data = mysql_fetch_array ($result);  

}
$coins = $_POST["Coins"];
$preis = $_POST["Preis"];
$name = $data["username"];
if ($data["coins"] < $coins AND $preis < 1000)
{      ?>
<script>location.href="coins_marktverkauf_fehler.php"; </script>
<?php } else {
	
$eintragen = mysql_query("INSERT INTO coinmarkt (user_id, user_name, coins, preis) VALUES ('$id', '$name', '$coins', '$preis')");	
$update = mysql_query("UPDATE login Set coins = coins - $coins WHERE id = '$id'");
} ?>
<script>location.href="coins_marktkauf.php"; </script>
 
Danke, hab auf Or abgeändert, aber trotzdem werden negative zahlen angenommen bei der coineingabe.
Hab gerade mal - 10 coins eingegeben und der hat mich nicht, wie er sollte zu der fehlerseite weitergeleitet, sondern die - 10 in die datenbank eingetragen
 
Also erstmal: Die Weiterleitung über JS zu lösen ist auch nicht grade die sicherste aller Alternativen. Verwende doch den PHP-Befehl header() mit der Option Location:

PHP:
<?php
$sql = "SELECT * from login WHERE id = $id";  
$result = mysql_query ($sql);  

if (mysql_num_rows ($result) > 0)  
{  
  // Benutzerdaten in ein Array auslesen.  
  $data = mysql_fetch_array ($result);  

}
$coins = $_POST["Coins"];
$preis = $_POST["Preis"];
$name = $data["username"];
if ($data["coins"] < $coins AND $preis < 1000)
{
  header('Location: coins_marktverkauf_fehler.php');
  die();
} else {
  $eintragen = mysql_query("INSERT INTO coinmarkt (user_id, user_name, coins, preis) VALUES ('$id', '$name', '$coins', '$preis')");    
  $update = mysql_query("UPDATE login Set coins = coins - $coins WHERE id = '$id'");
}
header('Location: coins_marktkauf.php');
?>

Desweiteren solltest du die if-Abfrage noch mal überdenken. Was soll eigentlich geprüft werden?

- Wenn die coins in der Datenbank kleiner sind als die Coins, die über das Formular übergeben wurden und
- wenn der im Formular angegebene Preis kleiner als 1000 ist
=> Soll auf eine Fehlerseite weitergeleitet werden

Jetzt setzen wir da mal Werte ein:

- Angenommen in der Datenbank stehen 50 Coins
- Weiterhin hat der Benutzer 10 Coins und 2000 im Preisfeld angegeben

if( 50 < 10 AND 2000 < 1000 ) => Bedingung ist nicht zutreffenden, da keine der beiden Prüfungen korrekt ist

- Der Benutzer gibt -10 Coins und 2000 Preis ein

if( 50 < -10 AND 2000 < 1000 ) => Bedingung ist nicht zutreffend, da zwar -10 kleiner ist, aber 2000 nicht kleiner 1000 ist

- Der Benutzer gibt 20 Coins und 500 Preis ein

if( 50 < 20 AND 500 < 1000) => Bedingung ist nicht zutreffend, da zwar 500 kleiner 1000 aber 50 nicht kleiner als 20 ist

Was lernen wir daraus?

Sämtliche Bedingungen, die einen Fehler enthalten, resultieren in einem falschen bzw. unerwünschen Ergebnis.


Jetzt mal die Prüfungen mit OR statt AND:

- Benutzer hat 10 Coins und 2000 im Preisfeld angegeben

if( 50 < 10 OR 2000 < 1000 ) => Bedingung ist nicht zutreffenden, da keine der beiden Prüfungen korrekt ist

- Der Benutzer gibt -10 Coins und 2000 Preis ein

if( 50 < -10 OR 2000 < 1000 ) => Bedingung ist nicht zutreffend, da -10 kleiner als 50 ist und 2000 nicht kleiner 1000 ist (eine der beiden Bedingungen muss erfüllt sein)

- Der Benutzer gibt 20 Coins und 500 Preis ein

if( 50 < 20 OR 500 < 1000) => Bedingung ist zutreffend, da 500 kleiner 1000, 20 jedoch kleiner als 50 ist


Jetzt ist laut deiner Aussage die Bedingung immer noch nicht erfüllt. Welche Ursachen kann es dafür geben?

- Vergleichsoperatoren arbeiten mit Strings anders als mit Zahlen
- PHP hat einen Fehler
- Die Daten, gegen die du prüfen willst, sind fehlerhaft

Desweiteren ist es durchaus zu empfehlen, die Gut-Fälle zu prüfen und alle Schlecht-Fälle in den else-Zweig zu packen.

Versuch mal diese Bedingungsprüfung:

PHP:
<?php
$sql = "SELECT * from login WHERE id = $id";  
$result = mysql_query ($sql) or die( mysql_error() );  

if (mysql_num_rows ($result) > 0)  
{  
  // Benutzerdaten in ein Array auslesen.  
  $data = mysql_fetch_array ($result);  
}
else
{
  die("Keine Ergebnisse für die ID $id");
}

if( intval( $data["coins"] ) < 0 )
{
  die("Die Coin-Daten für ID $id sind ungültig");
}

$coins = $_POST["Coins"];
$preis = $_POST["Preis"];
$name = $data["username"];
if ( intval( $coins )  > 0 AND intval($data["coins"]) >= intval($coins) AND intval($preis) >= 1000)
{
  $eintragen = mysql_query("INSERT INTO coinmarkt (user_id, user_name, coins, preis) VALUES ('$id', '$name', '$coins', '$preis')");    
  $update = mysql_query("UPDATE login Set coins = coins - $coins WHERE id = '$id'");
} else {
  header('Location: coins_marktverkauf_fehler.php');
  die();
}
header('Location: coins_marktkauf.php');
?>
 
Zuletzt bearbeitet:
Zurück