2014-09-24 190 views
0

我有一点麻烦,似乎无法找到任何可靠的答案。希望有人能帮忙。HTML5日期输入,保存到MySQL数据库

我有一个HTML5输入形式获取选定日期

<input type="date" name="launch_date" /> 

这带来了日期选择器,并进入日期DD/MM/YY

我想这个保存到一个SQL数据库,它使用表中的DATE类型。首先,我做的所有的表单输入

$launch_date = $_POST['launch_date']; 

然后我试图将字符串转换为具有正确的时间戳,因此它可以在数据库中接受变量。

然后所有变量都被加入到正确的列作为SQL INSERT/UPDATE查询的一部分。

$launch_date = strtotime($launch_date); 

每当我看着数据库虽然,它只是始终显示0000-00-00,喜欢它的期待YYYY-MM-DD格式。

我怎样才能得到它,以便在前端输入的日期是DD-MM-YYYY,而是存储在数据库中正确地为YYYY-MM-DD?

UPDATE

好了,所以我想我是试图使它过于复杂。通过使用HTML5日期输入,并将该输入直接保存到数据库中的数据类型列中,将其保存为YYY-MM-DD。似乎工作正常。

当我回声这些值,它将例如2014年9月24日输出。我怎样才能让它显示24-09-2014?

<?php echo $row['start_date'];?> 
+0

如果它存储在数据库中的日期,它的存储是正确的。格式只在显示数据时很重要。 – 2014-09-24 15:20:21

+0

但它没有将其存储在数据库中,它显示为0000-00-00 – Lee 2014-09-24 15:21:01

+0

什么是数据库列类型? – RandomSeed 2014-09-24 15:22:17

回答

0

您可以在JQuery日期选择器本身进行修改。

$("#launch_date").datepicker({ 
    dateFormat : 'yy-mm-dd' 
}); 

该函数会提供MySQL日期时间格式。

+2

我没有使用jQuery – Lee 2014-09-24 15:20:15

0

我认为你的问题是在strtotime()。 让我们来替换该行通过这个来代替:

list($day,$mon,$year) = explode('/', $launch_date); 
$launch_date = "$year-$mon-$day"; 
+0

当试图处理时,我得到这条线上的未定义偏移0和1(列表...) – Lee 2014-09-24 15:24:07

+0

这意味着你的错误是从“$ launch_date = $ _POST ['launch_date'];” 请检查您是否在表单中使用POST方法,并打印出$ _POST ['launch_date']以查看您是否正确获取用户输入。 编辑:我看到你写下你输入的日期为输入dd/mm/yy,但在你下面说你想输入DD-MM-YYYY。请确认你想要的。在“爆炸('/',$ launch_date)”中,我假定您使用的是dd/mm/yyyy。 – kien 2014-09-24 15:44:35

+0

我已更新我的问题,试图使其更简单 – Lee 2014-09-24 15:58:54

0

在我的经验,很多的问题都归结到服务器上的区域设置。

PHP可能被识别DD /月/年为毫米/日/年和具有配合如果一天的部分是无效的。为了使PHP正确验证日期DD/MM/YYYY,交换/为 - (DD-MM-YYYY)时

$launch_date = $_POST['launch_date']; 
$launch_date = str_replace("/", "-", $launch_date); 
$launch_date = strtotime($launch_date); 

这仅仅是一个快速的黑客攻击,看看它的情况。如果不是的话,那么我建议至少在一路上加入var_dumps来检查日期格式是否正确。

另一种方法是解析日期以及使用date_create_from_format(http://php.net/manual/en/datetime.createfromformat.php)解析的格式。

$launch_date = date_create_from_format('d/m/Y', $launch_date); 

我不认为有在Windows上PHP的实现......因此,如果你遇到麻烦,这里有一个功能的实现

if (!function_exists('date_parse_from_format')) { 

    function date_parse_from_format($format, $date) { 
     $returnArray = array('hour' => 0, 'minute' => 0, 'second' => 0, 
      'month' => 0, 'day' => 0, 'year' => 0); 

     $dateArray = array(); 

     // array of valid date codes with keys for the return array as the values 
     $validDateTimeCode = array('Y' => 'year', 'y' => 'year', 
      'm' => 'month', 'n' => 'month', 
      'd' => 'day', 'j' => 'day', 
      'H' => 'hour', 'G' => 'hour', 
      'i' => 'minute', 's' => 'second'); 

     /* create an array of valid keys for the return array 
     * in the order that they appear in $format 
     */ 
     for ($i = 0; $i <= strlen($format) - 1; $i++) { 
      $char = substr($format, $i, 1); 

      if (array_key_exists($char, $validDateTimeCode)) { 
       $dateArray[$validDateTimeCode[$char]] = ''; 
      } 
     } 

     // create array of reg ex things for each date part 
     $regExArray = array('.' => '\.', // escape the period 
      // parse d first so we dont mangle the reg ex 
      // day 
      'd' => '(\d{2})', 
      // year 
      'Y' => '(\d{4})', 
      'y' => '(\d{2})', 
      // month 
      'm' => '(\d{2})', 
      'n' => '(\d{1,2})', 
      // day 
      'j' => '(\d{1,2})', 
      // hour 
      'H' => '(\d{2})', 
      'G' => '(\d{1,2})', 
      // minutes 
      'i' => '(\d{2})', 
      // seconds 
      's' => '(\d{2})'); 

     // create a full reg ex string to parse the date with 
     $regEx = str_replace(array_keys($regExArray), array_values($regExArray), $format); 

     // Parse the date 
     preg_match("#$regEx#", $date, $matches); 

     // some checks... 
     if (!is_array($matches) || 
       $matches[0] != $date || 
       sizeof($dateArray) != (sizeof($matches) - 1)) { 
      return $returnArray; 
     } 

     // an iterator for the $matches array 
     $i = 1; 

     foreach ($dateArray AS $key => $value) { 
      $dateArray[$key] = $matches[$i++]; 

      if (array_key_exists($key, $returnArray)) { 
       $returnArray[$key] = $dateArray[$key]; 
      } 
     } 

     return $returnArray; 
    } 

} 

编辑:万一这是错过了.. 。确保你然后将其转换成它什么时候到DB YYYY-MM-DD:

// Whatever you do to parse date into timestamp 
$launch_date_db = date("Y-m-d H:i:s", $launch_date) 

UPDATE

PHP喜欢时间戳...所以与去:

$launch_date = strtotime($row['start_date']); // convert it into timestamp 
echo date('d-m-Y', $launch_date); // format timestamp 
+0

http://php.net/manual/en/datetime.formats.date.php < - PHP接受的日期格式的例子。 – 2014-09-24 15:44:18

0

这对我的作品。请注意0​​返回一个Unix时间戳(即自1970年1月1日00:00:00以来的秒数),这可能不是数据库所期望的。

记裸的表象值可能因浏览器和用户的语言环境,但不同的提交应该是一个"A valid full-date as defined in [RFC 3339]"

这里实际值有点演示:

<?php 
$launch_date = $_POST['launch_date']; 
echo '$launch_date = \''.$launch_date.'\' <br />'; 
$launch_date = strtotime($launch_date); 
echo 'strtotime($launch_date) = \''.$launch_date.'\' '; //a unix timestamp eg '1410480000' 
?> 
<form method="post"> 
<input type="date" name="launch_date" /> 
<input type="submit"/> 
</form> 

http://runnable.com/VCLkST-wq9cPvwJT/stackoverflow-com-questions-26020544-for-php

UPDATE

继续问题的更改。您可以格式化使用PHP's DateTime::format日期,就像这样:用SQL设置正确的格式

<?php echo date_format($row['start_date'], 'd-m-Y');?> 
0

.... VALUES (STR_TO_DATE('24-09-2014', '%d-%m-%Y')) 

获取回

SELECT DATE_FORMAT(datefield, '%d-%m-%Y') FROM ......