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

Lee*_*Lee 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

'', '1', '1', '21', '21', '12年10月10日', '10:30', '空', '空', '游泳池', '空',"空值'

然而,当我检查表文本类型字段时,字面上的值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')

Mik*_*osh 8

您实际上将所需NULL列的值设置为字符串'NULL'

NULL != 'NULL'

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

改为:

if(!empty($hHoldFor)) $hHoldFor = $array['fHomeHoldFor'];
Run Code Online (Sandbox Code Playgroud)

更新

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

$row = ... ",'$hHoldFor','$vHoldFor'";
Run Code Online (Sandbox Code Playgroud)

上面的行,如果你设置$hHoldFor = NULL,将插入引号NULL,将其转回一串字符串NULL.

试试这个:

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

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

更新2

这是一个使用您的架构的SQLFiddle.它返回NULLNULL列.你可以做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')
Run Code Online (Sandbox Code Playgroud)

试试这个:

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;
}
Run Code Online (Sandbox Code Playgroud)


Ker*_*mit 5

你不能插入'NULL'.删除周围的单引号NULL.

你的字符串

'','1','1','21','21','10/10/12','10:30AM','NULL','NULL','pool','NULL','NULL'
Run Code Online (Sandbox Code Playgroud)

应该是这样的

'','1','1','21','21','10/10/12','10:30AM',NULL,NULL,'pool',NULL,NULL
Run Code Online (Sandbox Code Playgroud)

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

编辑1

我建议你翻阅一下 SHOW CREATE TABLE tbl_name

编辑2

测试之后,我仍然会说问题是你如何插入数据.

(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;
}
Run Code Online (Sandbox Code Playgroud)

NULL值将包含在引号中,否则将分配NULL.我还定义了列列表INSERT和排除列id,因为它是一AUTO_INCREMENT列.