我环顾四周,注意到有些人遇到了同样的问题,但他们的监督似乎并不适用于此。
我有一个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')
答案 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为第二。这是一种解决方法,但解决了这个问题。