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')
您实际上将所需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)
你不能插入'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列.