2010-11-22 7 views
2

Im travailler avec une base de données MySQL via php.MySQL - Problème avec null = 0

J'ai une table avec des valeurs qui sont = NULL

je sélectionne ces valeurs en php:

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

Puis-je insérer les valeurs dans une autre table:

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."');"); 

Le problème est que lorsque j'insère les valeurs dans la seconde table, elles sortent toujours comme 0. Les valeurs dans la table inventoryCombat sont 0 quand elles devraient être NULL (ce qu'elles sont dans l'inventaire) table). La table est définie pour accepter NULL en tant que valeurs.

+1

Les valeurs 'NULL' ou la chaîne''NULL'' sont-elles? – alex

+0

Est-ce que ce champ a la valeur par défaut définie sur 0? – pavanred

+0

@Pavanred: il a inséré des valeurs de chaîne dans les champs numériques. – zerkms

Répondre

1

Tout d'abord, je vous recommande fortement que vous utilisez prepared statements au lieu de construire une chaîne SQL littérale. Non seulement c'est une meilleure pratique et vous aide à écrire une application plus secure, mais elle gère également les valeurs NULL correctement sans nécessiter de travail supplémentaire.

Si vous souhaitez continuer à utiliser la méthode que vous utilisez actuellement, vous devrez vérifier explicitement les valeurs non définies et insérer la chaîne « NULL » dans votre SQL. En d'autres termes, vous devez faire ceci:

INSERT INTO inventoryCombat (item1) VALUES (NULL); 

Au lieu de ce que vous faites actuellement:

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

Si cela ne fonctionne toujours pas, vérifiez que le champ que vous essayez de insert NULL into est défini pour autoriser les valeurs NULL. Vous pouvez utiliser SHOW CREATE TABLE inventoryCombat pour ce faire.

Je vous recommande également normalisant votre base de données. colonnes ayant appelé item1, item2, etc. item3 est un signe d'une mauvaise conception. Votre conception actuelle, par exemple, rendra plus compliqué l'exécution de requêtes simples telles que «Combien de joueurs possèdent l'élément X? ou 'Ajouter un objet X au joueur P à moins qu'il ne possède déjà 6 objets'.

0

Les valeurs dans le tableau $ opponentInv est peut être mis à 0.

Comme $ opponentInv [ "argent"] = 0; c'est pourquoi il est enregistré en tant que 0 dans la table inventoryCombat.

Essayez de définir la valeur de opponentInv $ ​​[ « monnaie »] comme NULL dans votre codage, au lieu si 0 ou « ».

par exemple

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

0

Cela semble être que vous êtes chaîne de stockage (varchar, texte) les données dans le champ de nombre dont la valeur par défaut est 0.

+0

les valeurs sont int dans la table inventoryon, et elles sont aussi int dans inventoryCombat, les deux ont la valeur par défaut – freshintake

+0

dans ce cas 0 valeur ne peut que signifier que la première table contient les données avec 0 qui est rempli et rempli le tableau associé avant le lancement de la commande insert suivante. –

0

Il y a 2 autres solutions: - Même si elle a accepté les valeurs que 0 au lieu de NULL, cela peut être mis à jour comme NULL comme ceci: - update set = NULL WHERE;

vous devez également vérifier si la colonne est réglée pour être NULLABLE, alors qu'au-dessus de SQL fonctionnera, sinon il sera mis à nouveau la colonne avec 0 valeur et sera d'aucune utilité.

En outre, vous pouvez faire la même chose via votre interface SQL Manager.Je ne suis pas sûr de tout, mais EMS gestionnaire postgresql fonctionne avec la commande CTRL + MAJ + 0 et quelques autres comme SQL Navicat pour MySQL et Oracle utiliser CTRL + 0 [S'il vous plaît vérifier vos programmes de gestionnaire de SQL sur votre propre]. À votre santé!