MySQL int列允许null但输入null为零

时间:2012-08-22 14:27:26

标签: php mysql database

我环顾四周,注意到有些人遇到了同样的问题,但他们的监督似乎并不适用于此。

我有一个PHP函数可以将值数组添加到表中。它首先检查值是否为空,如果是,则将其替换为NULL,以便在表字段中放置null。我放置null的每个字段都允许null,而是在0放置{。}}。

以下是一些代码:

public static function AddGame($array, $tId)
{
    global $db; // Bring DB into scope
    // Get IDs from particular names
    $locId = $array['fLocation'];
    // Ensure empty values are SQL null
    $hTeamId = "'{$array['fHomeTeam']}'";
    $vTeamId = "'{$array['fVisitTeam']}'";
    $hScore = "'{$array['fHomeScore']}'";
    $vScore = "'{$array['fVisitScore']}'";
    $hHoldFor = "'{$array['fHomeHoldFor']}'";
    $vHoldFor = "'{$array['fVisitHoldFor']}'";
    // Prepare row for insertion
    $row = "'','$tId','$locId',$hTeamId,$vTeamId,'{$array['fDate']}','{$array['fTime']}',$hScore,$vScore,'{$array['fGameType']}',$hHoldFor,$vHoldFor";
    $stmt = $db->prepare("INSERT INTO `game` VALUES($row)");
    if($stmt->execute()) return true;
    else return false;
}

我已经在各行调试了这个函数并且已经转储了$ row字符串,它显示了这个,这是预期的:

  

'', '1', '1', '21', '21', '12年10月10日', '上午10点30', 'NULL', 'NULL', '池',“NULL ”, 'NULL'

然而,当我检查表文本类型字段时,字面上的值NULL不是我想要的,并且int字段显示为0。如果我将值保留为空白或者将PHP保留为空,则文本字段显示为空(或正常null),但是整数仍显示为0

我希望这只是由于我间接插入值的方式引起的。

这是SHOW CREATE TABLE game

CREATE TABLE `game` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tId` int(11) NOT NULL,
  `Lid` int(11) NOT NULL,
  `hTeamId` int(11) DEFAULT NULL,
  `vTeamId` int(11) DEFAULT NULL,
  `date` text NOT NULL,
  `time` text NOT NULL,
  `hScore` int(11) DEFAULT NULL,
  `vScore` int(11) DEFAULT NULL,
  `type` text NOT NULL,
  `hHoldFor` text,
  `vHoldFor` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1

更新:

INSERT INTO `game` VALUES('','1','1','','','10/09/12','9:30AM','','','pool','winner of pool A','winner of pool B')

4 个答案:

答案 0 :(得分:8)

您实际将所需NULL列的值设置为'NULL'

字符串

NULL!= 'NULL'

如果您将这些列的表格结构设置为NULL,则可以在查询中省略它们,并在插入时自动NULL

请改为:

if(!empty($hHoldFor)) $hHoldFor = $array['fHomeHoldFor'];

<强>更新

我正在进一步研究你的例子,还有第二点失败。

$row = ... ",'$hHoldFor','$vHoldFor'";

如果您设置$hHoldFor = NULL,则上述行会在NULL周围插入引号,并将其重新设置为NULL字符串。

试试这个:

if(!empty($hHoldFor)) $hHoldFor = "'{$array['fHomeHoldFor']}'";
...  
$row = ... ",$hHoldFor,$vHoldFor";

这将删除QUERY字符串中此值周围的单引号,并将它们添加到变量本身。

更新2

这是使用您的架构的SQLFiddle。它为NULL列返回NULL。你可以做echo "INSERT INTO游戏VALUES($row)";并发布输出吗?问题是PHP仍在将NULL转换为'NULL'。这将有助于我们深入了解它。

更新3

这个问题和思考一样。您的PHP正在将空白字符串''插入数据库,该字符串不是NULL值。 NULL属于某种类型,''是一个没有长度的字符串。

INSERT INTO `game` VALUES('','1','1','','','10/09/12','9:30AM','','','pool','winner of pool A','winner of pool B')

试试这个:

public static function AddGame($array, $tId)
{
    global $db; // Bring DB into scope
    // Get IDs from particular names
    $locId = $array['fLocation'];
    // Ensure empty values are SQL null
    $hTeamId = (strlen($array['fHomeTeam']) != 0 ? "'{$array['fHomeTeam']}'" : 'NULL');
    $vTeamId = (strlen($array['fVisitTeam']) != 0 ? "'{$array['fVisitTeam']}'" : 'NULL');
    $hScore = (strlen($array['fHomeScore']) != 0 ? "'{$array['fHomeScore']}'" : 'NULL');
    $vScore = (strlen($array['fVisitScore']) != 0 ? "'{$array['fVisitScore']}'" : 'NULL');
    $hHoldFor = (strlen($array['fHomeHoldFor']) != 0 ? "'{$array['fHomeHoldFor']}'" : 'NULL');
    $vHoldFor = (strlen($array['fVisitHoldFor']) != 0 ? "'{$array['fVisitHoldFor']}'" : 'NULL');
    // Prepare row for insertion
    $row = "'','$tId','$locId',$hTeamId,$vTeamId,{$array['fDate']}','{$array['fTime']}',$hScore,$vScore,'{$array['fGameType']}',$hHoldFor,$vHoldFor";
    $stmt = $db->prepare("INSERT INTO `game` VALUES($row)");
    if($stmt->execute()) return true;
    else return false;
}

答案 1 :(得分:5)

您无法插入'NULL'。删除NULL周围的单引号。

你的字符串

'','1','1','21','21','10/10/12','10:30AM','NULL','NULL','pool','NULL','NULL'

应该是

'','1','1','21','21','10/10/12','10:30AM',NULL,NULL,'pool',NULL,NULL

您还应该在制作INSERT时定义列列表(即。INSERT INTO table (col1, col2) VALUES ...

修改1

我建议您查看SHOW CREATE TABLE tbl_name

修改2

testing this之后,我仍然会说问题是你如何插入数据。

(18,1,1,21,21,'10/10/12','10:30AM',NULL,NULL,'pool',NULL,NULL)

作品。

('18','1','1','21','21','10/10/12','10:30AM','NULL','NULL','pool','NULL','NULL')

不起作用:Incorrect integer value: 'NULL' for column 'hScore' at row 1:

编辑3

以下是您班级的改进版本:

public static function AddGame($array, $tId)
{
    global $db; // Bring DB into scope

    // Get IDs from particular names
    $locId = $array['fLocation'];

    // Ensure empty values are SQL null
    $hTeamId = empty($array['fHomeTeam']) ? 'NULL' : "'" . $array['fHomeTeam'] . "'";
    $vTeamId = empty($array['fVisitTeam']) ? 'NULL' : "'" . $array['fVisitTeam'] . "'";
    $hScore = empty($array['fHomeScore']) ? 'NULL' : "'" . $array['fHomeScore'] . "'";
    $vScore = empty($array['fVisitScore']) ? 'NULL' : "'" . $array['fVisitScore'] . "'";
    $hHoldFor = empty($array['fHomeHoldFor']) ? 'NULL' : "'" . $array['fHomeHoldFor'] . "'";
    $vHoldFor = empty($array['fVisitHoldFor']) ? 'NULL'  : "'" . $array['fVisitHoldFor'] . "'";

    // Prepare row for insertion
    $row = "$tId,$locId,$hTeamId,$vTeamId,'{$array['fDate']}','{$array['fTime']}',$hScore,$vScore,'{$array['fGameType']}',$hHoldFor,$vHoldFor";
    $stmt = $db->prepare("INSERT INTO game (tId, Lid, hTeamId, vTeamId, date, time, hScore, vScore, type, hHoldFor, vHoldFor) VALUES($row)");
    if($stmt->execute()) return true;
    else return false;
}

NULL值将被引号括起来,否则会被分配NULL。我还定义了INSERT的列列表并排除了id,因为它是AUTO_INCREMENT列。

答案 2 :(得分:1)

您的列是否允许NULL值?再次检查DDL可能已将DEFAULT VALUE设置为零。

当您尝试在列中插入null值时,请勿使用单引号将其包装。实施例

INSERT INTO tableName (colName, ColNameB) VALUES (1, NULL)

答案 3 :(得分:0)

在我的情况下,我必须显示三种情况:Case-empty,Case-yes和Case-no。我计划使用null,one和zero。但是null总是被保存为0.我正在工作的列接受了空条目,但我的所有空值都被保存为零。 我的解决方案是,Case-empty为零,Case-yes为第一,case-no为第二。这是一种解决方法,但解决了这个问题。