【问题标题】:php mysql insert date of birthphp mysql 插入出生日期
【发布时间】:2011-09-20 05:21:31
【问题描述】:

我想在这里得到一些帮助。 我有一个注册表单,其中包含姓名、姓氏、dob(出生日期)、电子邮件等字段。 当我尝试插入我的数据库时,一切正常,但对于 dob。

我从 $_POST['year']、$_POST['month']、$_POST['day'] 等 3 个选择选项菜单中得到它,但我还没有找到如何输入这 3 个值合二为一(dob),以便正确地将其插入我的数据库中,而不是取值 0000-00-00。

任何帮助将不胜感激。

【问题讨论】:

  • 你在 db 中的 datetime 字段的数据类型是什么?
  • 能否给我们看看数据库信息(dob 列是哪种值)?
  • 为什么不将每个值存储在自己的列中?年月日 ?这样您就可以轻松地对所有出生在指定年/月/日组合的用户进行选择...

标签: php mysql


【解决方案1】:

我从 $_POST['year']、$_POST['month']、$_POST['day'] 等 3 个选项菜单中获得的出生日期

只需验证和连接:

$yr=(integer)$_POST['year'];
$mo=(integer)$_POST['month'];
$da=(integer)$_POST['day'];
if (($yr>1910 && $yr<(integer)date('Y')) 
    && ($mo>0 && $mo<13)
    && ($da>0 && $da<32)) {
      $mysqldate=sprintf("%04d-%02d-%02d", $yr, $mo, $da);
} else {
    trigger_error('date is not valid');
}

【讨论】:

    【解决方案2】:

    根据 rootatwc 的回复,插入数据库时​​的一个关键因素是 DATETIME 值必须像字符串一样被引用。

    $name = "Sepp";
    $surname = "Blatter";
    $dob=$_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'];
    
    "insert into birthdays (name, surname, dob) values ('$name', '$surname', '$dob')"
    

    你也会发现mysql是相当宽容的,比如June可以表示为-06-或-6-

    至于提取某一年的所有条目,这很容易 - 无需将它们放入数据库中的单独字段中:

    select name from birthdays where YEAR(dob) = '1950';
    

    编辑

    重新阅读问题,OP 实际上使用 DATE 字段并不明显,嘿,OP,使用 DATE 字段 - 然后您可以浏览您的数据库并了解日期是什么,而无需尝试破译10位数字……你可以使用Mysql自带的所有美妙的日期功能……

    【讨论】:

      【解决方案3】:

      您希望它们如何存储在您的数据库中?您希望它们作为 UNIX 时间戳还是其他格式?

      如果您不知道您希望它们如何格式化,我们无能为力。

      无论哪种方式,您都应该使用 mktime() 转换为 UNIX 时间戳,然后在您知道要如何格式化时使用 date()

      【讨论】:

      • 这不适用于 1970 年 1 月 1 日之前出生的人
      • 会变成负的 UNIX 时间戳! :)
      • @Pekka:如果您使用带符号的数据类型,它会起作用,但无论如何这不是一个好主意,因为 Y2K38(UNIX 时间戳仅适用于 1901-2038,因为这是可能的秒数范围自 1970 年 1 月 1 日以来,在有符号的 32 位 int 中)。如果您在 1901 年之前或 2038 年之后需要任何东西,它会以有趣的方式破裂(我已经被两种方式都咬过)。
      【解决方案4】:

      如果您的 Apache 在 Linux 服务器上,您可以使用时间戳。为什么只在 Linux 服务器上?因为 Linux 理解负时间戳,如果你有 1970 年 1 月 1 日之前出生的人,你可能会需要它们。

      $timestamp = mktime(0,0,0,$month,$day,$year);
      

      将时间戳保存为 int。

      echo date('d.m.Y',$timestamp);
      

      回应它。

      【讨论】:

      • 他不想回应它,这是数据库的错误格式
      • @rootatwc 总有一天他会想打印出来的……至于格式,什么时候“整数”对于数据库来说是错误的格式?
      • 我很确定他的数据库字段设置为 DATE 而不是 INT
      • @rootatwc 好的,但也可以更改。当然,如果数据库已经包含几十个条目,那就有点困难了。但如果他只是从一个空数据库开始,他仍然可以更改字段类型。尽管如此,我理解你的意见并接受它,你是对的。
      • 原生 DATE 类型究竟如何比 unixtime 更少损坏?提示:您可能不想将 30 年后到期的内容存储到 unixtime 列中,它不适合。此外,如果您需要跟踪 1901 年之前出生的人,那么您就有麻烦了。
      【解决方案5】:
      $timestamp=mktime(0,0,0,$_POST['month'],$_POST['day'],$_POST['year']);
      $dob=date('Y-m-d',$timestamp);
      

      $dob 值已准备好插入到您的数据库中

      或者你也可以这样做:

      $dob=$_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'];
      

      但是你应该在将它们插入到数据库之前先转义这些值,或者使用 PDO

      【讨论】:

        【解决方案6】:

        将 DOB 字段更改为 &lt;input type="date" name="dob" class="datetime" /&gt; html 5 将为您生成一个 datetimepicker。然后你就可以得到它$_POST['dob']
        并且数据库中的dob字段应为TIMESTAMPDATETIMEDATE格式,为通用日期格式。

        【讨论】:

          猜你喜欢
          • 2011-07-20
          • 2012-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          • 2016-08-20
          • 2017-10-01
          相关资源
          最近更新 更多