1

我有一个很好的时间来解决这个问题 - 这似乎是一个有据可查的问题,但没有一个解决方案足以完全解决我的问题。

基本上我已经为我们的网站建立了一个数据库来保存即将发生的事件;有时这些事件会显示不止一个,因此我们可以在字段中输入这些日期(如果有的话)。大多数时候,只有一个日期可以输入,所以我们的额外日期字段(date2、date 3 等)是空白的。如果它们是空白的,我希望它们作为NULL保存到 mysql 数据库中。

我将值扔到 mySQL 的示例如下所示:

if (empty($_POST['date2']))
        {$date2 = NULL;
        }
    else
        {$date2 = mysql_real_escape_string(date("Y-m-d",strtotime($_POST['date2'])));
        }

哪个正在做它应该做的事情。当我们尝试如下更新变量时,问题就来了:

    mysql_query("UPDATE events
             SET date2='".mysql_real_escape_string($date2))."',

mySQL 不知道这个值是什么(显然,因为你不能转义字符串或格式化 NULL 的日期),所以它将值保存为 0000-00-00 (或 1969-12-31 ......取决于我试图解决这个问题)。我想不通的是如何在不使用 ''s 的情况下输入 date2 的值。

我尝试将其更改为date2 = $date2,但代码不会执行并抛出错误。 date2='$date2',执行 - 但它再次没有正确保存 NULL(我认为是因为它保存的是 'NULL' 而不是 NULL?)。

有什么建议吗?

4

2 回答 2

0

您有单引号中的变量:

date2='".mysql_real_escape_string($date2))."',

这意味着您正在尝试将字符串保存到该字段。

如果你想要它,null你需要去掉它周围的引号。

insert into YourTable ('null'); // Will try to insert a string
insert into YourTable (null); // Will try to insert a null

编辑:为什么不立即将其直接放入if语句中?

if (empty($_POST['date2']))
{
    $date2 = NULL;
    mysql_query("UPDATE events SET date2=null, ...";
    // This will also work...
    mysql_query("UPDATE events SET date2=".$date2.", ...";
}
else
{
    $date2 = mysql_real_escape_string(date("Y-m-d",strtotime($_POST['date2'])));
    mysql_query("UPDATE events SET date2='".mysql_real_escape_string($date2))."', ...";
}

更新代码:

$query="update events set ";

if (empty($_POST['date2']))
{
    $date2 = NULL;
    $query.="date2=null, ";
}
else
{
    $date2 = mysql_real_escape_string(date("Y-m-d",strtotime($_POST['date2'])));
    $query.= " date2='".mysql_real_escape_string($date2)."', ";
}

// a few other if statements to finish up the rest of your fields...

$query.=" where someCondition=SomeOtherCondition";
mysql_query($query);

需要注意的是,如果您编写的这段代码又好又新鲜,您可能需要考虑从PDO 开始。并使用准备好的语句。

于 2012-09-15T01:39:08.290 回答
0

您可以规范化您的数据库。添加dates具有以下结构的表:

CREATE TABLE  `test`.`dates` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `event_id` INT NOT NULL ,
    `date` DATETIME NOT NULL ,
INDEX (  `event_id` ));

对于每个事件,该表保留一个或多个日期。如果 date2、date3 为空,则表中没有它们的记录。

于 2012-09-15T01:51:34.837 回答