2010-11-22 13 views
2

Ich arbeite mit einer MySQL-Datenbank über PHP.MySQL - Problem mit Null = 0

Ich habe eine Tabelle mit einigen Werten, die = NULL

Ich wähle diese Werte in php:

$opponentInv = db_execute("Select * from inventoryon where playerid = ".$defendid.";"); 
$opponentInv = mysql_fetch_assoc($opponentInv); 

Dann füge ich die Werte in einer anderen Tabelle:

db_execute("INSERT INTO `inventoryCombat` (`attackid` ,`defendid` ,`money` ,`item1` ,`item2` ,`item3`, `item4` ,`item5` ,`item6`, `time`)VALUES ('".$attackid."', '".$defendid."', '".$opponentInv["money"]."', '".$opponentInv["item1"]."', '".$opponentInv["item2"]."', '".$opponentInv["item3"]."', '".$opponentInv["item4"]."', '".$opponentInv["item5"]."', '".$opponentInv["item6"]."', '".$time."');"); 

Das Problem ist, dass wenn ich die Werte in die zweite Tabelle einfüge, sie immer als 0 herauskommen. Die Werte in der inventoryCombat Tabelle sind 0, wenn sie NULL sein sollten (was sie in der Inventoryon sind Tabelle). Die Tabelle ist so eingestellt, dass sie NULL als Werte akzeptiert.

+1

Sind die Werte 'NULL' oder Zeichenkette''NULL''? – alex

+0

Hat dieses Feld einen Standardwert von 0? – pavanred

+0

@Pavanred: Er hat Zeichenfolgenwerte in die numerischen Felder eingefügt. – zerkms

Antwort

1

Erstens würde ich empfehlen, dass Sie prepared statements statt dem Aufbau eine wörtliche SQL-Zeichenfolge verwenden. Dies ist nicht nur eine bessere Methode und hilft Ihnen, eine mehr secure Anwendung zu schreiben, es behandelt auch NULL-Werte korrekt, ohne dass zusätzliche Arbeit erforderlich ist.

Wenn Sie die Methode, die Sie gerade verwenden, weiterhin verwenden möchten, müssen Sie explizit nach undefinierten Werten suchen und die Zeichenfolge 'NULL' in Ihre SQL einfügen. Mit anderen Worten, müssen Sie dies tun:

INSERT INTO inventoryCombat (item1) VALUES (NULL); 

Statt dessen, was Sie gerade tun:

INSERT INTO inventoryCombat (item1) VALUES (''); 

Wenn es immer noch nicht funktioniert, überprüfen Sie, dass das Feld, das Sie versuchen, Fügen Sie NULL in ein, um NULL-Werte zuzulassen. Sie können dazu SHOW CREATE TABLE inventoryCombat verwenden.

Ich würde auch empfehlen, Ihre Datenbank zu normalisieren. Spalten zu haben, die item1, item2, item3 usw. genannt werden, ist ein Zeichen eines schlechten Designs. Ihr aktuelles Design macht es beispielsweise komplizierter, einfache Abfragen wie "Wieviele Spieler besitzen Gegenstand X?" Durchzuführen. oder 'Füge Artikel X zu Spieler P hinzu, wenn sie nicht bereits 6 Gegenstände hält'.

0

Werte in Array $ opponentInv wird, kann auf 0

wie $ opponentInv [ "Geld"] = 0 gesetzt werden; Deshalb wird es in der InventoryCombat-Tabelle als 0 gespeichert.

Versuchen Sie, den Wert von $ gegnerischer_Inv ["Geld"] als NULL in Ihrem Code festzulegen, statt 0 oder ''.

beispiel

$opponentInv["money"] = ($opponentInv["money"] == 0 || $opponentInv["money"] == '')?NULL:$opponentInv["money"]; 
0

Dies scheint zu sein, dass Sie Zeichenfolge (Varchar, Text) Daten in Nummernfeld sind speichern, dessen Standardwert auf 0 gesetzt

+0

Die Werte sind Int die in der Inventoryon-Tabelle, und sie sind auch int in InventoryCombat, beide haben Standard auf Null – freshintake

+0

in diesem Fall 0 Wert kann nur bedeutet, dass die erste Tabelle enthält die Daten mit 0, die vor dem Problem des nächsten Einfügebefehls in das zugeordnete Array gefüllt und gefüllt wird. –

0

Es gibt 2 weitere Lösungen: - Auch wenn es die Werte angenommen hat als 0 statt NULL, das kann wie folgt als NULL aktualisiert werden: - update set = NULL WHERE;

Auch müssen Sie überprüfen, ob die Spalte auf NULLABLE gesetzt ist, dann funktioniert nur über SQL, sonst wird die Spalte wieder mit 0-Wert gesetzt und wird nichts nützen.

Weitere können Sie das gleiche über Ihre SQL Manager-Schnittstelle tun.Ich bin nicht sicher über alle, aber EMS postgresql Manager funktioniert dies mit dem Befehl STRG + UMSCHALT + 0 und einige andere wie sql navicat für mysql und Oracle verwenden STRG + 0 [Bitte überprüfen Sie Ihre SQL-Manager-Programme auf eigene Faust]. Prost!