3

我环顾四周,注意到一些人遇到了同样的问题,但他们的疏忽似乎不适用于这里。

我有一个 PHP 函数可以将一组值添加到表中。它首先检查值是否为空,如果是,则将它们替换为NULL, 以便将 anull放在表字段中。我放入的每个字段都null允许在其中放置nulla 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','10/10/12','10:30AM','NULL','NULL','pool','NULL','无效的'

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

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

这是显示创建表game

创建表`游戏`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tId` int(11) 非空,
  `盖子` int(11) 非空,
  `hTeamId` int(11) 默认为空,
  `vTeamId` int(11) 默认为空,
  `date` 文本不为空,
  `time` 文本不为空,
  `hScore` int(11) 默认为空,
  `vScore` int(11) 默认为空,
  `type` 文本不为空,
  `hHoldFor` 文本,
  `vHoldFor` 文本,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=17 默认字符集=latin1

更新:

插入“游戏”值('','1','1','','','10/09/12','9:30AM','','','pool','winner池 A','池 B 的获胜者')
4

4 回答 4

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 。它返回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')

尝试这个:

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;
}
于 2012-08-22T14:31:31.157 回答
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每当制作(ie. 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;
}

NULL值将用引号括起来,否则将被赋值NULL。我还为INSERT和 exclude定义了列列表id,因为它是一个AUTO_INCREMENT列。

于 2012-08-22T14:35:05.203 回答
1

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

当您尝试null在列中插入值时,不要用单引号括起来。例子

INSERT INTO tableName (colName, ColNameB) VALUES (1, NULL)
于 2012-08-22T14:30:28.437 回答
0

就我而言,我必须显示三种情况:Case-empty、Case-yes 和 Case-no。我计划使用空、一和零。但是 null 始终保存为 0。我正在工作的列接受了 null 条目,但我所有的 null 都被保存为零。我的解决方案是将 Case-empty 视为零,将 Case-yes 视为第一,将 case-no 视为第二。这是一种解决方法,但解决了问题。

于 2016-10-18T18:23:10.557 回答